Ignores IPv6 addresses when configuring network
Closes #60 PiperOrigin-RevId: 198887885 Change-Id: I9bf990ee3fde9259836e57d67257bef5b85c6008
This commit is contained in:
parent
3547c48867
commit
65dadc0029
|
@ -188,14 +188,14 @@ func createInterfacesAndRoutesFromNS(conn *urpc.Client, nsPath string) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
ifaddrs, err := iface.Addrs()
|
allAddrs, err := iface.Addrs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error fetching interface addresses for %q: %v", iface.Name, err)
|
return fmt.Errorf("error fetching interface addresses for %q: %v", iface.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// We build our own loopback devices.
|
// We build our own loopback devices.
|
||||||
if iface.Flags&net.FlagLoopback != 0 {
|
if iface.Flags&net.FlagLoopback != 0 {
|
||||||
links, err := loopbackLinks(iface, ifaddrs)
|
links, err := loopbackLinks(iface, allAddrs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error getting loopback routes and links for iface %q: %v", iface.Name, err)
|
return fmt.Errorf("error getting loopback routes and links for iface %q: %v", iface.Name, err)
|
||||||
}
|
}
|
||||||
|
@ -203,6 +203,24 @@ func createInterfacesAndRoutesFromNS(conn *urpc.Client, nsPath string) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Keep only IPv4 addresses.
|
||||||
|
var ip4addrs []*net.IPNet
|
||||||
|
for _, ifaddr := range allAddrs {
|
||||||
|
ipNet, ok := ifaddr.(*net.IPNet)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("address is not IPNet: %+v", ifaddr)
|
||||||
|
}
|
||||||
|
if ipNet.IP.To4() == nil {
|
||||||
|
log.Warningf("IPv6 is not supported, skipping: %v", ipNet)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ip4addrs = append(ip4addrs, ipNet)
|
||||||
|
}
|
||||||
|
if len(ip4addrs) == 0 {
|
||||||
|
log.Warningf("No IPv4 address found for interface %q, skipping", iface.Name)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// Get the link for the interface.
|
// Get the link for the interface.
|
||||||
ifaceLink, err := netlink.LinkByName(iface.Name)
|
ifaceLink, err := netlink.LinkByName(iface.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -250,16 +268,12 @@ func createInterfacesAndRoutesFromNS(conn *urpc.Client, nsPath string) error {
|
||||||
|
|
||||||
// Collect the addresses for the interface, enable forwarding,
|
// Collect the addresses for the interface, enable forwarding,
|
||||||
// and remove them from the host.
|
// and remove them from the host.
|
||||||
for _, ifaddr := range ifaddrs {
|
for _, addr := range ip4addrs {
|
||||||
ipNet, ok := ifaddr.(*net.IPNet)
|
link.Addresses = append(link.Addresses, addr.IP)
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("address is not IPNet: %t %+v", ifaddr, ifaddr)
|
|
||||||
}
|
|
||||||
link.Addresses = append(link.Addresses, ipNet.IP)
|
|
||||||
|
|
||||||
// Steal IP address from NIC.
|
// Steal IP address from NIC.
|
||||||
if err := removeAddress(ifaceLink, ipNet.String()); err != nil {
|
if err := removeAddress(ifaceLink, addr.String()); err != nil {
|
||||||
return fmt.Errorf("error removing address %v from device %q: %v", iface.Name, ipNet, err)
|
return fmt.Errorf("error removing address %v from device %q: %v", iface.Name, addr, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,7 +294,7 @@ func loopbackLinks(iface net.Interface, addrs []net.Addr) ([]boot.LoopbackLink,
|
||||||
for _, addr := range addrs {
|
for _, addr := range addrs {
|
||||||
ipNet, ok := addr.(*net.IPNet)
|
ipNet, ok := addr.(*net.IPNet)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("address is not IPNet: %t %+v", addr, addr)
|
return nil, fmt.Errorf("address is not IPNet: %+v", addr)
|
||||||
}
|
}
|
||||||
links = append(links, boot.LoopbackLink{
|
links = append(links, boot.LoopbackLink{
|
||||||
Name: iface.Name,
|
Name: iface.Name,
|
||||||
|
@ -314,21 +328,25 @@ func routesForIface(iface net.Interface) ([]boot.Route, *boot.Route, error) {
|
||||||
if r.Gw == nil {
|
if r.Gw == nil {
|
||||||
return nil, nil, fmt.Errorf("default route with no gateway %q: %+v", iface.Name, r)
|
return nil, nil, fmt.Errorf("default route with no gateway %q: %+v", iface.Name, r)
|
||||||
}
|
}
|
||||||
|
if r.Gw.To4() == nil {
|
||||||
|
log.Warningf("IPv6 is not supported, skipping default route: %v", r)
|
||||||
|
continue
|
||||||
|
}
|
||||||
if def != nil {
|
if def != nil {
|
||||||
return nil, nil, fmt.Errorf("more than one default route found %q, def: %+v, route: %+v", iface.Name, def, r)
|
return nil, nil, fmt.Errorf("more than one default route found %q, def: %+v, route: %+v", iface.Name, def, r)
|
||||||
}
|
}
|
||||||
emptyAddr := net.IPv6zero
|
|
||||||
if r.Gw.To4() != nil {
|
|
||||||
emptyAddr = net.IPv4zero
|
|
||||||
}
|
|
||||||
// Create a catch all route to the gateway.
|
// Create a catch all route to the gateway.
|
||||||
def = &boot.Route{
|
def = &boot.Route{
|
||||||
Destination: emptyAddr,
|
Destination: net.IPv4zero,
|
||||||
Mask: net.IPMask(emptyAddr),
|
Mask: net.IPMask(net.IPv4zero),
|
||||||
Gateway: r.Gw,
|
Gateway: r.Gw,
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if r.Dst.IP.To4() == nil {
|
||||||
|
log.Warningf("IPv6 is not supported, skipping route: %v", r)
|
||||||
|
continue
|
||||||
|
}
|
||||||
routes = append(routes, boot.Route{
|
routes = append(routes, boot.Route{
|
||||||
Destination: r.Dst.IP.Mask(r.Dst.Mask),
|
Destination: r.Dst.IP.Mask(r.Dst.Mask),
|
||||||
Mask: r.Dst.Mask,
|
Mask: r.Dst.Mask,
|
||||||
|
|
Loading…
Reference in New Issue