IPv6: Getting two hosts on same subnet to talk

This is the first part of a multi step project in getting IPv6 to work on my network. The top level post is here. The first step in getting things working is to get two hosts on the same network talking. This is the simplest configuration… No routers, no DNS, no DHCP, just two hosts and a switch. We’ll add the rest of the bits in a later post.

So, my 2 VM’s are both running Linux. One is Centos 6 and one is Centos 7. My network configuration looks like this (on the Centos 6 host):

[root@localhost ~]# more /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE="eth0"
BOOTPROTO="dhcp"
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"

Nothing out of the ordinary with the exception of having IPV6 turned on. The same is true on the Centos 7 host. I can see it running by looking at the interface output:

[root@localhost ~]# ip addr | grep -E '(^[0-9]|inet6)'
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    inet6 ::1/128 scope host 
2: eth0:  mtu 1500 qdisc mq state UP qlen 1000
    inet6 fe80::20c:29ff:fe1e:178e/64 scope link 

Couple things to note is the scope part of the address. IPv6 addresses have an addition piece of information that helps the system figure out where the send packets. So, if I have multiple addresses I can use the scope to tell the server which interface traffic goes through (See the Wikipedia IPV6 page on zones for more information). In our case we are using link local addresses which aren’t globally routable but are used for traffic on the same subnet.

But, it works for us since our hosts are on the same subnet:

[root@a ~]# ping6 -I eno16777984 fe80::20c:29ff:fe1e:178e
PING fe80::20c:29ff:fe1e:178e(fe80::20c:29ff:fe1e:178e) from fe80::20c:29ff:fecc:a0ad eno16777984: 56 data bytes
64 bytes from fe80::20c:29ff:fe1e:178e: icmp_seq=1 ttl=64 time=0.569 ms
64 bytes from fe80::20c:29ff:fe1e:178e: icmp_seq=2 ttl=64 time=0.379 ms
64 bytes from fe80::20c:29ff:fe1e:178e: icmp_seq=3 ttl=64 time=0.374 ms
64 bytes from fe80::20c:29ff:fe1e:178e: icmp_seq=4 ttl=64 time=0.366 ms
^C
--- fe80::20c:29ff:fe1e:178e ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.366/0.422/0.569/0.085 ms

And if we look at the tcpdump from the other host, we’ll see the bidirectional traffic

[root@localhost ~]# tcpdump -i eth0 ip6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:16:25.259154 IP6 fe80::20c:29ff:fecc:a0ad > fe80::20c:29ff:fe1e:178e: ICMP6, echo request, seq 1, length 64
11:16:25.259226 IP6 fe80::20c:29ff:fe1e:178e > fe80::20c:29ff:fecc:a0ad: ICMP6, echo reply, seq 1, length 64

So the next step is to bring a router into the picture which is the hard part of this project.