我的电脑:Ubuntu 15.10。我有一块有线网卡enp0s3
。我想创建一个 veth 对veth0
和,veth1
并将它们桥接起来enp0s3
,并设置veth1
为新的 netns ns1
,以便 中的进程ns1
可以通过链路层访问互联网。
但是奇怪的是veth1
ping不通enp0s3
,下面是我的操作步骤。
root@qs-vs:~# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:62:3c:59 brd ff:ff:ff:ff:ff:ff
root@qs-vs:~# ip netns add ns1
root@qs-vs:~# ip link add type veth
root@qs-vs:~# ip link set veth1 netns ns1
root@qs-vs:~# ip link add bridge type bridge
root@qs-vs:~# ip link set enp0s3 master bridge
root@qs-vs:~# ip link set veth0 master bridge
root@qs-vs:~# ip link set up veth0
root@qs-vs:~# ip link set up enp0s3
root@qs-vs:~# ip link set up bridge
root@qs-vs:~# ip netns exec ns1 ip link set up veth1
root@qs-vs:~# ip addr add 192.168.222.1/24 dev enp0s3
root@qs-vs:~# ip netns exec ns1 ip addr add 192.168.222.101/24 dev veth1
root@qs-vs:~# ping 192.168.222.101
PING 192.168.222.101 (192.168.222.101) 56(84) bytes of data.
From 192.168.222.1 icmp_seq=1 Destination Host Unreachable
From 192.168.222.1 icmp_seq=2 Destination Host Unreachable
From 192.168.222.1 icmp_seq=3 Destination Host Unreachable
From 192.168.222.1 icmp_seq=4 Destination Host Unreachable
From 192.168.222.1 icmp_seq=5 Destination Host Unreachable
From 192.168.222.1 icmp_seq=6 Destination Host Unreachable
^C
--- 192.168.222.101 ping statistics ---
7 packets transmitted, 0 received, +6 errors, 100% packet loss, time 6028ms
pipe 3
我也尝试过使用 enp0s3 打开 promisc,但没有帮助。
答案1
上述内容有两个错误。首先,通过使用 桥接 IF veth
,enp0s3
您将发送 ping 到您的 PC 之外,而您的意图是与您自己的 PC 的另一部分进行通信。其次,建立接口的命令的语法veth
是错误的。
您应该将veth
接口与另一个虚拟接口桥接起来tap0
;然后您将看到 ping 返回。请按如下方式尝试:
NNS=WhateverYouWantToCallTheNewNetworkNameSpace
ip netns add $NNS
ip link add veth-a$NNS type veth peer name veth-b$NNS
ip link set veth-a$NNS up
ip tuntap add tap$NNS mode tap user root
ip link set tap$NNS up
ip link add br$NNS type bridge
ip link set tap$NNS master br$NNS
ip link set veth-a$NNS master br$NNS
ip addr add 10.0.0.1/24 dev br$NNS
ip link set br$NNS up
ip link set veth-b$NNS netns $NNS
ip netns exec $NNS ip addr add 10.0.0.2/24 dev veth-b$NNS
ip netns exec $NNS ip link set veth-b$NNS up
ip netns exec $NNS ip link set dev lo up
我添加这个lo
接口只是因为将来你会发现它很有用。现在你可以 ping 了,
ping -c1 10.0.0.2
您将会看到 ping 回来了。
编辑:
我如何通过 veth-b$NNS 访问互联网,并且 veth-b$NNS 的 MAC 必须对我的 ISP 可见
没有办法将这两个 暴露veth
给您的 ISP。不过,下面的方法应该可以正常工作:
出于某些我不明白的原因,必须做以下事情前所有先前的命令:
NNS=WhateverYouWantToCallTheNewNetworkNameSpace /bin/mkdir -p /etc/netns/$NNS echo "nameserver 8.8.8.8" > /etc/netns/$NNS/resolv.conf echo "nameserver 8.8.4.4" >> /etc/netns/$NNS/resolv.conf
这将为您提供 DNS 解析。但请记住,这必须在上述命令之前完成!
在您的主机上,允许 IPv4 转发和伪装:
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
向新的网络命名空间添加网关:
ip netns exec $NNS ip route add default via 10.0.0.1
xterm
现在输入您的新网络命名空间,我通过创建一个然后在其中输入新 NNS 中必需的命令来实现:ip netns exec $NNS su -c xterm YourName &
如果您不喜欢 xterm,您可以使用任何您喜欢的终端(如果您没有 xterm,只需安装它,apt-get install xterm
)。
这应该可行。
答案2
ip netns add mynetns
ip netns exec mynetns ip link list
ip netns exec mynetns ip link set dev lo up
# ip netns exec mynetns ping 127.0.0.1
ip link add veth0 type veth peer name veth1
ip link set veth1 netns mynetns
ip netns exec mynetns ifconfig veth1 10.1.1.1/24 up
ifconfig veth0 10.1.1.2/24 up
#ping 10.1.1.1
#ip netns exec mynetns ping 10.1.1.2
ip netns exec mynetns route
ip netns exec mynetns iptables -L
ip netns exec mynetns bash