web-dev-qa-db-ja.com

enp0s3をvethのピアとブリッジする方法は?

私のラップ:Ubuntu15.10。そして、有線のNIC enp0s3があります。vethペアveth0veth1を作成し、それらをenp0s3でブリッジします。 veth1を新しいnetnsns1に設定して、ns1のプロセスがリンク層を介してインターネットにアクセスできるようにします。

しかし、veth1enp0s3に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をオンにしてみましたが、役に立ちません。

1
TorosFanny

上記には2つの間違いがあります。まず、vethIFと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に公開する方法はありません。それでも、以下は問題なく機能するはずです。

  1. 以下は、何らかの理由で私が理解していないので、実行する必要があります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解決が可能になります。ただし、これは上記のコマンドの前に実行する必要があることを忘れないでください。

  1. ホストで、IPv4転送とマスカレードを許可します。

    echo 1 > /proc/sys/net/ipv4/ip_forward 
    iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
    
  2. 新しいネットワーク名前空間にゲートウェイを追加します。

    ip netns exec $NNS ip route add default via 10.0.0.1
    
  3. ここで、新しいネットワーク名前空間を入力します。xtermを作成し、その中に必ず新しいNNSにあるコマンドを入力します。

    ip netns exec $NNS su -c xterm YourName &
    

Xtermが気に入らない場合は、好きな種類の端末を使用できます(xtermがない場合は、インストールするだけです、apt-get install xterm)。

これはうまくいくはずです。

1
MariusMatutiae