the necessity of abandoning IPv4 thinking when creating IPv6 address designs, and how our deeply ingrained need to conserve addresses can muddle our thinking. Nowhere does this conservative aversion to address waste snarl at us as menacingly as when we consider – completely compliant with the recommendations of
– assigning /64 subnets to point-to-point links.
"You want me to allot a subnet with 18 million trillion addresses to a link that will only ever use two of them? Are you kidding me?" We know all the arguments for what we get in exchange for squander: Easier address management with one-size-fits-all subnets; simpler address interpretation; scaling; flexibility.
But still. Only using two addresses out of 18 million trillion? (Saying "million trillion" is a lot of fun if you imitate Carl Sagan’s voice.) Well, ask yourself when a /64 is acceptable.
Most people would say they can accept it on a regular LAN or VLAN segment. All righty then. To be fair, let’s take a really big LAN. Say, 5000 devices. Is a /64 acceptable there? Yes, you say? So we’re wasting (1.8 x 1019) – 5000 addresses instead of (1.8 x 1019) – 2 addresses. The difference between 5000 and 2 relative to 18 million trillion is miniscule. It diminishes to practically nothing. If it were any smaller it would be the amount I’m being paid to write this.
And yet a /64 on a LAN is acceptable and a /64 on a point-to-point link is not. IPv4 thinking can twist our reason. All of this does not mean there are not reasons to use a prefix other than /64 on point-to-point links – it only means address waste is not one of them. In fact, there are dueling RFCs on the topic.
When you use a /127 prefix on a point-to-point link, you have exactly two addresses available: PREFIX::0/127 and PREFIX::1/127. The problem the RFC cites is that the router being assigned PREFIX::1/127 might add the Subnet-Router Anycast address, which would be PREFIX::0/127. Then the router on the other end of the link, configured with PREFIX::0/127 will fail the Duplicate Address Detection test.
The reason this issue is not really much of a concern is that the Subnet-Router Anycast address should not be needed or used on a point-to-point link. In fact, the RFC itself states that this problem has not been observed in general, probably because the Subnet-Router Anycast address is not widely used.
At the same time, the mandated use of /64 subnets to support such functions as Stateless Address Autoconfiguration, PIM-SM with embedded RP addresses, and various Neighbor Discovery functions are not relevant to point-to-point links where these functions are not used. That’s not to say that there will never be a case where some underlying support function needed on a point-to-point link will require a /64 to work; the base IPv6 specification does expect to see a 64-bit Interface ID. But this is speculative, and not really a compelling reason to make an address design choice.
The real argument for using /64 on point-to-point links remains what I have already stated: The simplicity, consistency, and flexibility of using a single subnet size throughout your network.
This usage is also supported in the standards. Section 3 of RFC 5375, “IPv6 Unicast Address Assignment Considerations,” plainly states: “Using /64 subnets is strongly recommended, also for links connecting only routers. A deployment compliant with the current IPv6 specifications cannot use other prefix lengths.” There you have it in black and white, ladies and gentlemen.
There is also no need to worry that the addressing bodies are going to penalize you for being wasteful. Here’s what ARIN says in its IPv6 Address Plan General Guidelines: “No subnets will use prefixes longer than /64.” And later on the same page: “The IETF expects that you will assign a /64 for point-to-point links.”
So is there a case to be made for using /127 subnets? Well, yes.
In the other corner is RFC 6164, “Using 127-Bit IPv6 Prefixes on Inter-Router Links.” This document starts off saying pretty much what I said above about the concerns of RFC 3627: That Subnet-Router Anycast addresses shouldn’t be a problem on point-to-point links. Then it gets to a more valid concern: Ping-pong attacks.
A ping-pong attack exploits implementations which follow the now obsolete RFC 2463 specification of ICMPv6. That RFC says that if an IPv6 interface receives a packet that belongs to the subnet to which the interface is attached, but not to an address of that interface, forward the packet back onto the subnet. So an attacker can flood a bunch of packets to unused addresses on a link and the packets will bounce back and forth (ping-pong) between the two routers, using up bandwidth and router resources.
One way to guard against such an attack, and the position of RFC 6164, is to insure that there are no unused addresses on the point-to-point link – use a /127, so there are only two addresses. But there is a better way to guard against the ping-pong vulnerability, and that is to use routers that support the modern version of ICMPv6. RFC 4443 corrects the error in the earlier specification, requiring an interface to drop a packet addressed to an address on the subnet rather than forward the packet back onto the subnet.
RFC 4443 has been around since March of 2006. There is no reason for a vendor to continue to support a version of ICMPv6 that has been obsolete for five years. And it is, in my opinion, absurd for a vendor to advocate using a /127 subnet on point-to-point links, in violation of all other IPv6 recommendations, simply to avoid updating their ICMPv6 code. Rather than bend your IPv6 address design to accommodate a vendor inadequacy, pressure your vendor to modernize.
There is another potential vulnerability citied in RFC 6164: If a point-to-point link supports Neighbor Discovery Protocol (NDP), a packet to an unused IPv6 address on the subnet will cause an Incomplete entry in the routers’ neighbor cache and cause a Neighbor Solicitation message to be sent on the link. A flood of packets to many unused addresses might fill up a neighbor cache, and congest the link with NS messages, constituting a DoS action. RFC 6164 recommends preventing such an attack by, again, using /127 prefixes.
But there is an easier way to prevent these neighbor cache depletion attacks. Only point-to-point Ethernet links should have the capability to support NDP (a protocol designed for use on LANs). So the solution is to simply disable NDP on point-to-point Ethernet links.
So. Use of /127s on point-to-point links violates recommended IPv6 subnet usage. They put a band-aid on an obsolete version of ICMPv6 so that some vendors do not have to modernize their code. They prevent neighbor cache depletion attacks, but disabling NDP on point-to-point Ethernet links is a simpler prevention of those attacks.
Which brings us back around to using /127s for address conservation. And we’ve seen already that the reasoning for this when we are happily wasting just as many addresses on LANs with /64 addresses is shaky reasoning.
All in all, I don’t have strong convictions against using /127s on point-to-point links. /127s on point-to-points and /64 on everything else is still comfortably close to one-size-fits-all. I tell my clients the pros and cons I’ve presented here, and emphasize that the supposed address conservation achieved with /127s is illusory and based on shaky logic. If they insist on using them anyway, well, okay. I’m fine with that.
But there is one prefix that you should not use.
What About /126?
Some networkers are designating /126 prefixes for subnets rather than /127, on the misguided assumption that they should use an IPv6 equivalent of an IPv4 /30: four addresses per point-to-point subnet, two for the interfaces, one as the “subnet address” (host bits all zero) and one as the broadcast address (host bits all one).
One more time: IPv4 thinking. Not only that, it’s old even for IPv4 thinking. On a point-to-point link neither the subnet address nor the broadcast address is used for anything. And in IPv6, there is not a broadcast address at all, so the all-ones host address is functionally meaningless. It’s just another address.
If you insist on conserving IPv6 addresses on router to router links use /127. A /126 wastes two whole addresses, and we can’t have that for heaven’s sake.
If, despite all my ranting, you still just cannot decide whether a /64 or a /127 is best to use, you might consider a compromise: Reserve a /64 for each point-to-point link, but then configure a /127 out of the /64. If future best practice falls on the side of /127, you’re all set and can use the rest of the /64s elsewhere. If it remains on the side of /64s, you can do a simple prefix length change on your link addresses to bring your network into compliance. Whether you use 64-bit subnets or 127-bit subnets on your point-to-point links, be sure you are making your decision based on sound engineering reasons and not on outdated IPv4 design principles.
And remember that ARIN and the other RIRs support using /64s on all subnets. If you find that your IPv6 allocation does not support enough subnets for your network, you do not need to begin subnetting down into the Interface-ID. You need to ask your RIR for a larger allocation. I made that statement in a presentation a few weeks ago, and someone from ARIN stood up and affirmed it. They want you to use /64s, and they will allocate to be sure you can.