Skip to content

Commit

Permalink
Merge pull request #438 from redoste/fix-ipv6-dns
Browse files Browse the repository at this point in the history
Fix DNS not being accessible with slirp4netns on hosts with IPv6-only nameservers
  • Loading branch information
AkihiroSuda committed May 14, 2024
2 parents af744bc + ada96bd commit e484dd6
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 11 deletions.
11 changes: 9 additions & 2 deletions pkg/child/resolvconf.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package child

func generateResolvConf(dns string) []byte {
return []byte("nameserver " + dns + "\n")
import "strings"

func generateResolvConf(dns []string) []byte {
var sb strings.Builder

for _, nameserver := range dns {
sb.WriteString("nameserver " + nameserver + "\n")
}
return []byte(sb.String())
}
2 changes: 1 addition & 1 deletion pkg/messages/messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ type ParentInitNetworkDriverCompleted struct {
IP string
Netmask int
Gateway string
DNS string
DNS []string
MTU int
// NetworkDriverOpaque strings are specific to driver
NetworkDriverOpaque map[string]string
Expand Down
2 changes: 1 addition & 1 deletion pkg/network/lxcusernic/lxcusernic.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ func (d *childDriver) ConfigureNetworkChild(netmsg *messages.ParentInitNetworkDr
netmask, _ := p.SubnetMask().Size()
netmsg.Netmask = netmask
netmsg.Gateway = p.Router()[0].To4().String()
netmsg.DNS = p.DNS()[0].To4().String()
netmsg.DNS = []string{p.DNS()[0].To4().String()}
go dhcpRenewRoutine(c, dev, p.YourIPAddr.To4(), p.IPAddressLeaseTime(time.Hour), detachedNetNSPath)
return dev, nil
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/network/pasta/pasta.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,13 +169,13 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
netmsg.IP = address.String()
netmsg.Netmask = netmask
netmsg.Gateway = gateway.String()
netmsg.DNS = dns.String()
netmsg.DNS = []string{dns.String()}

d.infoMu.Lock()
d.info = func() *api.NetworkDriverInfo {
return &api.NetworkDriverInfo{
Driver: DriverName,
DNS: []net.IP{net.ParseIP(netmsg.DNS)},
DNS: []net.IP{net.ParseIP(netmsg.DNS[0])},
ChildIP: net.ParseIP(netmsg.IP),
DynamicChildIP: false,
}
Expand Down
18 changes: 15 additions & 3 deletions pkg/network/slirp4netns/slirp4netns.go
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
}
netmsg := messages.ParentInitNetworkDriverCompleted{
Dev: tap,
DNS: make([]string, 0, 2),
MTU: d.mtu,
}
if d.ipnet != nil {
Expand All @@ -262,19 +263,30 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
if err != nil {
return nil, common.Seq(cleanups), err
}
netmsg.DNS = x.String()
netmsg.DNS = append(netmsg.DNS, x.String())
} else {
netmsg.IP = "10.0.2.100"
netmsg.Netmask = 24
netmsg.Gateway = "10.0.2.2"
netmsg.DNS = "10.0.2.3"
netmsg.DNS = append(netmsg.DNS, "10.0.2.3")
}

if d.enableIPv6 {
// for now slirp4netns only supports fd00::3 as v6 nameserver
// https://github.com/rootless-containers/slirp4netns/blob/ee1542e1532e6a7f266b8b6118973ab3b10a8bb5/slirp4netns.c#L272
netmsg.DNS = append(netmsg.DNS, "fd00::3")
}

apiDNS := make([]net.IP, 0, cap(netmsg.DNS))
for _, nameserver := range netmsg.DNS {
apiDNS = append(apiDNS, net.ParseIP(nameserver))
}

d.infoMu.Lock()
d.info = func() *api.NetworkDriverInfo {
return &api.NetworkDriverInfo{
Driver: DriverName,
DNS: []net.IP{net.ParseIP(netmsg.DNS)},
DNS: apiDNS,
ChildIP: net.ParseIP(netmsg.IP),
DynamicChildIP: false,
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/network/vpnkit/vpnkit.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
IP: vif.IP.String(),
Netmask: 24,
Gateway: "192.168.65.1",
DNS: "192.168.65.1",
DNS: []string{"192.168.65.1"},
MTU: d.mtu,
NetworkDriverOpaque: map[string]string{
opaqueMAC: vif.ClientMAC.String(),
Expand All @@ -139,7 +139,7 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
d.info = func() *api.NetworkDriverInfo {
return &api.NetworkDriverInfo{
Driver: DriverName,
DNS: []net.IP{net.ParseIP(netmsg.DNS)},
DNS: []net.IP{net.ParseIP(netmsg.DNS[0])},
ChildIP: net.ParseIP(netmsg.IP),
DynamicChildIP: false,
}
Expand Down

0 comments on commit e484dd6

Please sign in to comment.