Hello guys! I got into problem with installing IPv6 default gateway on centos7 guest while running dhcpv6. === Scheme === Guest has two network interfaces. eth0 is connected to Host-Only network over virbr0. This network has dhcpv6 set up. [root@s143 ~]# virsh net-dumpxml Host-Only <network connections='1'> <name>Host-Only</name> <uuid>11aa4e6a-9014-4dae-86b9-b13159896efe</uuid> <bridge name='virbr0' stp='off' delay='0'/> <mac address='52:54:00:1e:17:49'/> <ip family='ipv4' address='10.37.130.2' prefix='24'> <dhcp> <range start='10.37.130.1' end='10.37.130.254'/> </dhcp> </ip> <ip family='ipv6' address='fdb2:2c26:f4e4::1' prefix='64'> <dhcp> <range start='fdb2:2c26:f4e4::' end='fdb2:2c26:f4e4::ffff'/> </dhcp> </ip> </network> eth1 is connected to Bridged network over br0 bridge on host enp4s0 interface. [root@s143 ~]# virsh net-dumpxml Bridged <network connections='1'> <name>Bridged</name> <uuid>1ffa16f9-6a52-4710-9b58-52b8463cdece</uuid> <forward mode='bridge'/> <bridge name='br0'/> </network> [root@s143 ~]# virsh iface-dumpxml br0 <interface type='bridge' name='br0'> <protocol family='ipv4'> <ip address='10.94.1.161' prefix='16'/> </protocol> <protocol family='ipv6'> <ip address='2001:aaad::a5e:a28E' prefix='64'/> <ip address='fe80::be5f:f4ff:fe44:2cbb' prefix='64'/> </protocol> <bridge> <interface type='ethernet' name='vme42460d71'> <link state='unknown'/> <mac address='fe:1c:42:46:0d:71'/> </interface> <interface type='ethernet' name='enp4s0'> <link speed='1000' state='up'/> <mac address='bc:5f:f4:44:2c:bb'/> </interface> </bridge> </interface> === Problem === Now I want to set ipv6 address 2001:aaad::a5e:a28F to guest eth1 (bridged to host) and install a default route ip -6 route add default via 2001:aaad::a5e:a290 dev eth1 // metric 1024 So I want all the IPv6 traffic w/o route to go into eth1, then through host bridge to gateway (same for host and guest). The problem is that I see following in my guest: // the metric changes somehow, but this does not matter. default via fe80::5054:ff:fe1e:1749 dev eth0 proto static metric 100 pref medium default via 2001:aaad::a5e:a290 dev eth1 metric 1024 pref medium And the first (via link-local) route is preferred on routing. [root@s143 ~]# ip -6 address show dev virbr0 6: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 inet6 fdb2:2c26:f4e4::1/64 scope global valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe1e:1749/64 scope link valid_lft forever preferred_lft forever The problem is: guest:/ # radvdump # # radvd configuration generated by radvdump 2.11 # based on Router Advertisement from fe80::5054:ff:fe1e:1749 # received by interface eth0 # interface eth0 { AdvSendAdvert on; # Note: {Min,Max}RtrAdvInterval cannot be obtained with radvdump AdvManagedFlag on; AdvOtherConfigFlag on; AdvReachableTime 0; AdvRetransTimer 0; AdvCurHopLimit 64; AdvDefaultLifetime 1800; <---------------- AdvHomeAgentFlag off; AdvDefaultPreference medium; AdvLinkMTU 1500; AdvSourceLLAddress on; prefix fdb2:2c26:f4e4::/64 { AdvValidLifetime 3600; AdvPreferredLifetime 3600; AdvOnLink on; AdvAutonomous off; AdvRouterAddr off; }; # End of prefix definition RDNSS fe80::5054:ff:fe1e:1749 { AdvRDNSSLifetime 3600; }; # End of RDNSS definition }; # End of interface definition So, dnsmasq includes its link-local address into RA and announces itself as default gateway valid for 30min. Guest sees this RA and installs a route in accordance. As a result, the default gateway requested by user is overridden and thus not used. We cannot just disable RA since we still need IPv6 address on guest eth0 (dhcp6 part of functionality). === Possible solutions === I see two possible solutions. 1) Tinker with routes. As I said, the metric of installed RA routes may change and it's difficult to override them for sure (maybe with metric 0 or 1?) Moreover, this may confuse user and requires specific knowledge (IPv6, RA, etc.). 2) Forbid guest to learn default route from RA sysctl -w net.ipv6.conf.eth0.accept_ra_defrtr=0 - This should be made for all virbr-based networks. - This may confuse user as well. 3) Forbid dnsmasq to announce virbr0 link-local address as default gateway. This can be made with adding 'ra-param=*,0,0' to /var/lib/libvirt/dnsmasq/Host-Only.conf // interface=* (any), interval=0 (default), router_lifetime=0 (I am NOT you gateway, Luke). // tested on dnsmasq-2.75-3.fc22 but should work from 2.67 now the RA looks as following: linux-bnqo:/ # radvdump # # radvd configuration generated by radvdump 2.11 # based on Router Advertisement from fe80::5054:ff:fe1e:1749 # received by interface eth0 # interface eth0 { AdvSendAdvert on; # Note: {Min,Max}RtrAdvInterval cannot be obtained with radvdump AdvManagedFlag on; AdvOtherConfigFlag on; AdvReachableTime 0; AdvRetransTimer 0; AdvCurHopLimit 64; AdvDefaultLifetime 0; AdvHomeAgentFlag off; AdvDefaultPreference medium; AdvLinkMTU 1500; AdvSourceLLAddress on; prefix fdb2:2c26:f4e4::/64 { AdvValidLifetime 3600; AdvPreferredLifetime 3600; AdvOnLink on; AdvAutonomous off; AdvRouterAddr off; }; # End of prefix definition RDNSS fe80::5054:ff:fe1e:1749 { AdvRDNSSLifetime 3600; }; # End of RDNSS definition }; # End of interface definition === Conclusion ==== Please correct me if my setup itself is wrong and causes problems. Maybe there are another solutions possible, w/o modifying libvirt/guest? Would you accept patches related to 3rd solution? Looking forward to your replies. Thanks in advance! -- Your sincerely, Maxim Perevedentsev |
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list