私のラップ:Ubuntu15.10。そして、有線のNIC enp0s3
があります。vethペアveth0
とveth1
を作成し、それらをenp0s3
でブリッジします。 veth1
を新しいnetnsns1
に設定して、ns1
のプロセスがリンク層を介してインターネットにアクセスできるようにします。
しかし、veth1
がenp0s3
にpingできないのは奇妙です。以下は私のステップです。
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をオンにしてみましたが、役に立ちません。
上記には2つの間違いがあります。まず、veth
IFとenp0s3
をブリッジすることで、自分のPCの別の部分と通信することを目的として、PCの外部にpingを送信します。次に、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に表示する必要があります
2つのveth
をISPに公開する方法はありません。それでも、以下は問題なく機能するはずです。
以下は、何らかの理由で私が理解していないので、実行する必要がありますbefore前のすべてのコマンド:
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
)。
これはうまくいくはずです。