SLIRP4NETNS(1) User Commands SLIRP4NETNS(1) (NAME) slirp4netns - (SYNOPSIS) slirp4netns [OPTION]... PID|PATH|FD [TAPNAME] (DESCRIPTION) slirp4netns ("slirp") . veth(4) slirp4netns (root) . : o MTU: 1500 o CIDR: 10.0.2.0/24 o Gateway/Host: 10.0.2.2 ( + 2) o DNS: 10.0.2.3 ( + 3) o DHCP: 10.0.2.15 ( + 15) o DHCP: 10.0.2.30 ( + 30) o IPv6 CIDR: fd00::/64 o IPv6 Gateway/Host: fd00::2 o IPv6 DNS: fd00::3 (OPTIONS) -c, --configure TAP . IP 10.0.2.100 ( + 100) . IPv6 . v0.4.0 loopback (lo) . -e, --exit-fd=FD FD slirp4netns. FD slirp4netns poll(2) FD . -r, --ready-fd=FD FD . FD slirp4netns "1" FD FD . v0.4.0 FD (-c) API (-a) . -m, --mtu=MTU ( v0.2.0) MTU (=65521). -6, --enable-ipv6 ( v0.2.0 ) IPv6 -a, --api-socket ( v0.3.0) API --cidr ( v0.3.0) CIDR 10.0.2.0/24 --disable-host-loopback ( v0.3.0) 127.0.0.1:* --netns-type=TYPE ( v0.4.0) ([path|pid|tapfd] =pid) tapfd /dev/net/tun . --configure TAPNAME . --userns-path=PATH ( v0.4.0) --enable-sandbox ( v0.4.0) (mount namespace) /etc /run . /etc/resolv.conf /etc /run . (root) (capabilities) CAP_NET_BIND_SERVICE . --enable-seccomp ( v0.4.0 ) seccomp(2) . --enable-sandbox . --outbound-addr=IPv4 ( v1.1.0 ) ipv4 slirp (bind) --outbound-addr=INTERFACE ( v1.1.0 ) slirp ( ipv4) --outbound-addr=IPv6 ( v1.1.0 ) ipv6 slirp --outbound-addr6=INTERFACE ( v1.1.0 ) slirp ( ipv6) --disable-dns ( v1.1.0) DNS ( 10.0.2.3) --macaddress ( v1.1.9) MAC TAP ( -c ) --target-type=TYPE ( v1.2.0) ([netns|bess] =netns). bess ( v1.2.0 ) User Mode Linux . bess --configure --netns-type --userns-path . -h, --help ( v0.2.0) -v, --version ( v0.2.0) .SH " (EXAMPLE)" : user/network/mount (host)$ unshare --user --map-root-user --net --mount (namespace)$ echo $$ > /tmp/pid (host)$ (prompt) (namespace)$ . unshare ( Debian Arch CentOS 7.X ): (host)$ sudo sh -c 'echo "user.max_user_namespaces=28633" >> /etc/sysctl.d/userns.conf' (host)$ if [ -f /proc/sys/kernel/unprivileged_userns_clone ]; then sudo sh -c 'echo "kernel.unprivileged_userns_clone=1" >> /etc/sysctl.d/userns.conf'; fi (host)$ sudo sysctl --system : slirp4netns (host)$ slirp4netns --configure --mtu=65520 $(cat /tmp/pid) tap0 starting slirp, MTU=65520 : tap0 (namespace)$ ip a 1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 3: tap0: mtu 65520 qdisc fq_codel state UNKNOWN group default qlen 1000 link/ether c2:28:0c:0e:29:06 brd ff:ff:ff:ff:ff:ff inet 10.0.2.100/24 brd 10.0.2.255 scope global tap0 valid_lft forever preferred_lft forever inet6 fe80::c028:cff:fe0e:2906/64 scope link valid_lft forever preferred_lft forever (namespace)$ echo "nameserver 10.0.2.3" > /tmp/resolv.conf (namespace)$ mount --bind /tmp/resolv.conf /etc/resolv.conf (namespace)$ curl https://example.com bind-mount /etc/resolv.conf /etc/resolv.conf loopback (127.0.0.X dnsmasq(8) systemd-resolved.service(8)) . /etc/resolv.conf networkmanager(8) systemd-resolved.service(8) /etc (mount) /etc/resolv.conf (unmount) /etc/resolv.conf . (namespace)$ mkdir /tmp/a /tmp/b (namespace)$ mount --rbind /etc /tmp/a (namespace)$ mount --rbind /tmp/b /etc (namespace)$ mkdir /etc/.ro (namespace)$ mount --move /tmp/a /etc/.ro (namespace)$ cd /etc (namespace)$ for f in .ro/*; do ln -s $f $(basename $f); done (namespace)$ rm resolv.conf (namespace)$ echo "nameserver 10.0.2.3" > resolv.conf (namespace)$ curl https://example.com rootlesskit rootlesskit --copy-up=/etc : (host)$ rootlesskit --net=slirp4netns --copy-up=/etc bash (namespace)$ cat /etc/resolv.conf nameserver 10.0.2.3 PING (ROUTING PING PACKETS) ping net.ipv4.ping_group_range (root) . : (host)$ sudo sh -c 'echo "net.ipv4.ping_group_range=0 2147483647" > /etc/sysctl.d/ping_group_range.conf' (host)$ sudo sysctl --system INADDR_LOOPBACK (127.0.0.1) (: 10.0.2.2) . --disable-host-loopback INADDR_LOOPBACK . /etc/resolv.conf DNS (: 10.0.2.3) . iptables DNS . (host)$ nsenter -t $(cat /tmp/pid) -U --preserve-credentials -n (namespace)$ iptables -A OUTPUT -d 10.0.2.3 -p udp --dport 53 -j ACCEPT (namespace)$ iptables -A OUTPUT -d 10.0.2.3 -j DROP API (API SOCKET) slirp4netns API QMP UNIX : (host)$ slirp4netns --api-socket /tmp/slirp4netns.sock ... add_hostfwd: ( IPv4) (namespace)$ json='{"execute": "add_hostfwd", "arguments": {"proto": "tcp", "host_addr": "0.0.0.0", "host_port": 8080, "guest_addr": "10.0.2.100", "guest_port": 80}}' (namespace)$ echo -n $json | nc -U /tmp/slirp4netns.sock {"return": {"id": 42}} host_addr "0.0.0.0" . guest_addr --configure . list_hostfwd: (namespace)$ json='{"execute": "list_hostfwd"}' (namespace)$ echo -n $json | nc -U /tmp/slirp4netns.sock {"return": {"entries": [{"id": 42, "proto": "tcp", "host_addr": "0.0.0.0", "host_port": 8080, "guest_addr": "10.0.2.100", "guest_port": 80}]}} remove_hostfwd: (namespace)$ json='{"execute": "remove_hostfwd", "arguments": {"id": 42}}' (namespace)$ echo -n $json | nc -U /tmp/slirp4netns.sock {"return": {}} : o SHUT_WR shutdown(2) . keep-alive timeout . o slirp4netns API ("stops the world"). o . o JSON return error . (DEFINED NAMESPACE PATHS) : (host)$ slirp4netns --netns-type=path ... /path/to/netns tap0 netns-type=TYPE path pid pid . --userns-path=PATH (host)$ slirp4netns --netns-type=path --userns-path=/path/to/userns /path/to/netns tap0 IP IPv4 IPv6 . (host)$ slirp4netns --outbound-addr=10.2.2.10 --outbound-addr6=fe80::10 ... IP (interface) . (host)$ slirp4netns --outbound-addr=eth0 --outbound-addr6=eth0 ... (INTER-NAMESPACE COMMUNICATION) (nesting) slirp4netns . (host)$ nsenter -t $(cat /tmp/pid) -U --preserve-credentials -n -m (namespace)$ mount -t tmpfs none /run (namespace)$ ip netns add foo (namespace)$ ip netns add bar (namespace)$ ip link add veth-foo type veth peer name veth-bar (namespace)$ ip link set veth-foo netns foo (namespace)$ ip link set veth-bar netns bar (namespace)$ ip netns exec foo ip link set veth-foo name eth0 (namespace)$ ip netns exec bar ip link set veth-bar name eth0 (namespace)$ ip netns exec foo ip link set lo up (namespace)$ ip netns exec bar ip link set lo up (namespace)$ ip netns exec foo ip link set eth0 up (namespace)$ ip netns exec bar ip link set eth0 up (namespace)$ ip netns exec foo ip addr add 192.168.42.100/24 dev eth0 (namespace)$ ip netns exec bar ip addr add 192.168.42.101/24 dev eth0 (namespace)$ ip netns exec bar ping 192.168.42.100 slirp4netns . slirp4netns vde_plug(1) slirp4netns . (host)$ vde_plug --daemon switch:///tmp/switch null:// (host)$ nsenter -t $(cat /tmp/pid-instance0) -U --preserve-credentials -n (namespace-instance0)$ vde_plug --daemon vde:///tmp/switch tap://vde (namespace-instance0)$ ip link set vde up (namespace-instance0)$ ip addr add 192.168.42.100/24 dev vde (namespace-instance0)$ exit (host)$ nsenter -t $(cat /tmp/pid-instance1) -U --preserve-credentials -n (namespace-instance1)$ vde_plug --daemon vde:///tmp/switch tap://vde (namespace-instance1)$ ip link set vde up (namespace-instance1)$ ip addr add 192.168.42.101/24 dev vde (namespace-instance1)$ ping 192.168.42.100 (INTER-HOST COMMUNICATION) VXLAN . Kubernetes (rootless) VXLAN Usernetes : https://github.com/rootless-containers/usernetes BESS ( USER MODE LINUX) slirp4netns ( v1.2.0 ) BESS User Mode Linux . : slirp4netns (host)$ slirp4netns --target-type=bess /tmp/bess.sock : User Mode Linux (host)$ linux.uml vec0:transport=bess,dst=/tmp/bess.sock,depth=128,gro=1 root=/dev/root rootfstype=hostfs init=/bin/bash mem=2G (UML)$ ip addr add 10.0.2.100/24 dev vec0 (UML)$ ip link set vec0 up (UML)$ ip route add default via 10.0.2.2 User Mode Linux BESS slirp4netns . User Mode Linux : https://www.kernel.org/doc/html/latest/virt/uml/user_mode_linux_howto_v2.html#bess-socket-transport.SH " (BUGS)" 4.20 /proc/sys/net/ipv4/tcp_rmem 87380 131072 . (port forwarding) slirp4netns : https://github.com/rootless-containers/slirp4netns/issues/128. /proc/sys/net/ipv4/tcp_rmem (namespace) . 4.15 (root) . (host)$ nsenter -t $(cat /tmp/pid) -U --preserve-credentials -n -m (namespace)$ c=$(cat /proc/sys/net/ipv4/tcp_rmem); echo $c | sed -e s/131072/87380/g > /proc/sys/net/ipv4/tcp_rmem (SEE ALSO) network_namespaces(7), user_namespaces(7), veth(4) (AVAILABILITY) slirp4netns << >> 2 ( ) https://github.com/rootless-containers/slirp4netns . Rootless Containers January 2022 SLIRP4NETNS(1)