Skip to content

Commit fce79b4

Browse files
author
Alexey Perevalov
committed
Support IPv6
Several clues: 1. Interface address and gateway should be received from e.g. slirp4netns. There is already a comment on it in code. Need to fix slirp4netns and others. 2. Setting static IPv6 address fd00::1 to tap0 looks weired, since e.g. slirp4netns already could give dynamic address from fd00::/64 network, but there is a race. Rootlesskit can't set default route via fd00::2 unless IPv6 address and route from fd00::/64 is set to tap0 Signed-off-by: Alexey Perevalov <[email protected]>
1 parent b11ee46 commit fce79b4

File tree

8 files changed

+63
-36
lines changed

8 files changed

+63
-36
lines changed

pkg/child/child.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,18 @@ func activateLoopback() error {
152152
return nil
153153
}
154154

155-
func activateDev(dev, ip string, netmask int, gateway string, mtu int) error {
155+
func activateDev(dev string, ips []messages.NetworkDriverIP, gateway []string, mtu int) error {
156156
cmds := [][]string{
157157
{"ip", "link", "set", dev, "up"},
158158
{"ip", "link", "set", "dev", dev, "mtu", strconv.Itoa(mtu)},
159-
{"ip", "addr", "add", ip + "/" + strconv.Itoa(netmask), "dev", dev},
160-
{"ip", "route", "add", "default", "via", gateway, "dev", dev},
159+
}
160+
161+
for _, ip := range ips {
162+
cmds = append(cmds, []string{"ip", "addr", "add", ip.IP + "/" + strconv.Itoa(ip.PrefixLen), "dev", dev})
163+
}
164+
165+
for _, gw := range gateway {
166+
cmds = append(cmds, []string{"ip", "route", "add", "default", "via", gw, "dev", dev})
161167
}
162168
if err := common.Execs(os.Stderr, os.Environ(), cmds); err != nil {
163169
return fmt.Errorf("executing %v: %w", cmds, err)
@@ -216,7 +222,7 @@ func setupNet(stateDir string, msg *messages.ParentInitNetworkDriverCompleted, e
216222
}
217223
Info, _ := driver.ChildDriverInfo()
218224
if !Info.ConfiguresInterface {
219-
if err := activateDev(dev, msg.IP, msg.Netmask, msg.Gateway, msg.MTU); err != nil {
225+
if err := activateDev(dev, msg.IPs, msg.Gateways, msg.MTU); err != nil {
220226
return err
221227
}
222228
}
@@ -259,7 +265,7 @@ func setupNet(stateDir string, msg *messages.ParentInitNetworkDriverCompleted, e
259265
if err := ns.WithNetNSPath(detachedNetNSPath, func(_ ns.NetNS) error {
260266
Info, _ := driver.ChildDriverInfo()
261267
if !Info.ConfiguresInterface {
262-
return activateDev(dev, msg.IP, msg.Netmask, msg.Gateway, msg.MTU)
268+
return activateDev(dev, msg.IPs, msg.Gateways, msg.MTU)
263269
}
264270
return nil
265271
}); err != nil {

pkg/messages/messages.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,18 @@ type ParentInitIdmapCompleted struct {
5353
type ChildInitUserNSCompleted struct {
5454
}
5555

56+
type NetworkDriverIP struct {
57+
IP string
58+
PrefixLen int
59+
}
60+
5661
type ParentInitNetworkDriverCompleted struct {
5762
// Fields are empty for HostNetwork.
58-
Dev string
59-
IP string
60-
Netmask int
61-
Gateway string
62-
DNS []string
63-
MTU int
63+
Dev string
64+
IPs []NetworkDriverIP
65+
Gateways []string
66+
DNS []string
67+
MTU int
6468
// NetworkDriverOpaque strings are specific to driver
6569
NetworkDriverOpaque map[string]string
6670
}

pkg/network/lxcusernic/lxcusernic.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,10 @@ func (d *childDriver) ConfigureNetworkChild(netmsg *messages.ParentInitNetworkDr
186186
if len(p.DNS()) == 0 {
187187
return "", errors.New("got no DNS")
188188
}
189-
netmsg.IP = p.YourIPAddr.To4().String()
189+
190190
netmask, _ := p.SubnetMask().Size()
191-
netmsg.Netmask = netmask
192-
netmsg.Gateway = p.Router()[0].To4().String()
191+
netmsg.IPs = []messages.NetworkDriverIP{messages.NetworkDriverIP{IP: p.YourIPAddr.To4().String(), PrefixLen: netmask}}
192+
netmsg.Gateways = []string{p.Router()[0].To4().String()}
193193
netmsg.DNS = []string{p.DNS()[0].To4().String()}
194194
go dhcpRenewRoutine(c, dev, p.YourIPAddr.To4(), p.IPAddressLeaseTime(time.Hour), detachedNetNSPath)
195195
return dev, nil

pkg/network/parentutils/parentutils.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import (
66
"strconv"
77

88
"github.com/rootless-containers/rootlesskit/v2/pkg/common"
9+
"github.com/sirupsen/logrus"
910
)
1011

1112
func PrepareTap(childPID int, childNetNsPath string, tap string) error {
13+
logrus.Debugf("PrepareTap")
1214
cmds := [][]string{
1315
nsenter(childPID, childNetNsPath, []string{"ip", "tuntap", "add", "name", tap, "mode", "tap"}),
1416
nsenter(childPID, childNetNsPath, []string{"ip", "link", "set", tap, "up"}),

pkg/network/pasta/pasta.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,21 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
208208
Dev: tap,
209209
MTU: d.mtu,
210210
}
211-
netmsg.IP = address.String()
212-
netmsg.Netmask = netmask
213-
netmsg.Gateway = gateway.String()
211+
netmsg.IPs = []messages.NetworkDriverIP{
212+
messages.NetworkDriverIP{
213+
IP: address.String(),
214+
PrefixLen: netmask,
215+
},
216+
}
217+
netmsg.Gateways = []string{gateway.String()}
214218
netmsg.DNS = []string{dns.String()}
215219

216220
d.infoMu.Lock()
217221
d.info = func() *api.NetworkDriverInfo {
218222
return &api.NetworkDriverInfo{
219223
Driver: DriverName,
220224
DNS: []net.IP{net.ParseIP(netmsg.DNS[0])},
221-
ChildIP: net.ParseIP(netmsg.IP),
225+
ChildIP: net.ParseIP(netmsg.IPs[0].IP),
222226
DynamicChildIP: false,
223227
}
224228
}

pkg/network/slirp4netns/slirp4netns.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
217217
detachedNetNSPath)
218218
}
219219
opts = append(opts, tap)
220+
221+
logrus.Debugf("start %v with args: %v", d.binary, opts)
220222
cmd := exec.Command(d.binary, opts...)
221223
// FIXME: Stdout doen't seem captured
222224
cmd.Stdout = d.logWriter
@@ -242,39 +244,47 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
242244
return nil, common.Seq(cleanups), fmt.Errorf("waiting for ready fd (%v): %w", cmd, err)
243245
}
244246
netmsg := messages.ParentInitNetworkDriverCompleted{
245-
Dev: tap,
246-
DNS: make([]string, 0, 2),
247-
MTU: d.mtu,
247+
Dev: tap,
248+
IPs: make([]messages.NetworkDriverIP, 0, 2),
249+
DNS: make([]string, 0, 2),
250+
Gateways: make([]string, 0, 2),
251+
MTU: d.mtu,
248252
}
249253
if d.ipnet != nil {
250254
// TODO: get the actual configuration via slirp4netns API?
251255
x, err := iputils.AddIPInt(d.ipnet.IP, 100)
252256
if err != nil {
253257
return nil, common.Seq(cleanups), err
254258
}
255-
netmsg.IP = x.String()
256-
netmsg.Netmask, _ = d.ipnet.Mask.Size()
259+
260+
netmask, _ := d.ipnet.Mask.Size()
261+
262+
netmsg.IPs = append(netmsg.IPs, messages.NetworkDriverIP{x.String(), netmask})
257263
x, err = iputils.AddIPInt(d.ipnet.IP, 2)
258264
if err != nil {
259265
return nil, common.Seq(cleanups), err
260266
}
261-
netmsg.Gateway = x.String()
267+
netmsg.Gateways = append(netmsg.Gateways, x.String())
262268
x, err = iputils.AddIPInt(d.ipnet.IP, 3)
263269
if err != nil {
264270
return nil, common.Seq(cleanups), err
265271
}
266272
netmsg.DNS = append(netmsg.DNS, x.String())
267273
} else {
268-
netmsg.IP = "10.0.2.100"
269-
netmsg.Netmask = 24
270-
netmsg.Gateway = "10.0.2.2"
274+
netmsg.IPs = append(netmsg.IPs, messages.NetworkDriverIP{IP: "10.0.2.100", PrefixLen: 24})
275+
netmsg.Gateways = append(netmsg.Gateways, "10.0.2.2")
271276
netmsg.DNS = append(netmsg.DNS, "10.0.2.3")
272277
}
273278

274279
if d.enableIPv6 {
275280
// for now slirp4netns only supports fd00::3 as v6 nameserver
276281
// https://github.com/rootless-containers/slirp4netns/blob/ee1542e1532e6a7f266b8b6118973ab3b10a8bb5/slirp4netns.c#L272
277282
netmsg.DNS = append(netmsg.DNS, "fd00::3")
283+
284+
// TODO(aperevalov --cidr option of slirp4netns now supports only ipv4 address
285+
// add ipv6 gateway
286+
netmsg.Gateways = append(netmsg.Gateways, "fd00::2")
287+
netmsg.IPs = append(netmsg.IPs, messages.NetworkDriverIP{IP: "fd00::1", PrefixLen: 64})
278288
}
279289

280290
apiDNS := make([]net.IP, 0, cap(netmsg.DNS))
@@ -287,7 +297,7 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
287297
return &api.NetworkDriverInfo{
288298
Driver: DriverName,
289299
DNS: apiDNS,
290-
ChildIP: net.ParseIP(netmsg.IP),
300+
ChildIP: net.ParseIP(netmsg.IPs[0].IP),
291301
DynamicChildIP: false,
292302
}
293303
}

pkg/network/vpnkit/vpnkit.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,13 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
123123
logrus.Debugf("connected to VPNKit vmnet")
124124
// TODO: support configuration
125125
netmsg := messages.ParentInitNetworkDriverCompleted{
126-
Dev: d.ifname,
127-
IP: vif.IP.String(),
128-
Netmask: 24,
129-
Gateway: "192.168.65.1",
130-
DNS: []string{"192.168.65.1"},
131-
MTU: d.mtu,
126+
Dev: d.ifname,
127+
IPs: []messages.NetworkDriverIP{
128+
messages.NetworkDriverIP{IP: vif.IP.String(), PrefixLen: 24},
129+
},
130+
Gateways: []string{"192.168.65.1"},
131+
DNS: []string{"192.168.65.1"},
132+
MTU: d.mtu,
132133
NetworkDriverOpaque: map[string]string{
133134
opaqueMAC: vif.ClientMAC.String(),
134135
opaqueSocket: vpnkitSocket,
@@ -140,7 +141,7 @@ func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPat
140141
return &api.NetworkDriverInfo{
141142
Driver: DriverName,
142143
DNS: []net.IP{net.ParseIP(netmsg.DNS[0])},
143-
ChildIP: net.ParseIP(netmsg.IP),
144+
ChildIP: net.ParseIP(netmsg.IPs[0].IP),
144145
DynamicChildIP: false,
145146
}
146147
}

pkg/parent/parent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ func Parent(opt Opt) error {
289289
if opt.PortDriver != nil {
290290
msgParentInitPortDriverCompleted.U.ParentInitPortDriverCompleted.PortDriverOpaque = opt.PortDriver.OpaqueForChild()
291291
cctx := &port.ChildContext{
292-
IP: net.ParseIP(msgParentInitNetworkDriverCompleted.U.ParentInitNetworkDriverCompleted.IP).To4(),
292+
IP: net.ParseIP(msgParentInitNetworkDriverCompleted.U.ParentInitNetworkDriverCompleted.IPs[0].IP).To4(),
293293
}
294294
go func() {
295295
portDriverErr <- opt.PortDriver.RunParentDriver(portDriverInitComplete,

0 commit comments

Comments
 (0)