如何将 enp0s3 与 veth 对等体桥接?

如何将 enp0s3 与 veth 对等体桥接?

我的电脑:Ubuntu 15.10。我有一块有线网卡enp0s3。我想创建一个 veth 对veth0和,veth1并将它们桥接起来enp0s3,并设置veth1为新的 netns ns1,以便 中的进程ns1可以通过链路层访问互联网。

但是奇怪的是veth1ping不通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 vethenp0s3您将发送 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。不过,下面的方法应该可以正常工作:

  1. 出于某些我不明白的原因,必须做以下事情所有先前的命令:

    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)。

这应该可行。

答案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

相关内容