如何通过网桥和 veth 对将命名空间连接到物理接口

如何通过网桥和 veth 对将命名空间连接到物理接口

我的尝试是仿照本教程

如果物理接口未分配给网桥,我可以从命名空间 ping 到网络。

# Create namespace
ip netns add namespace1

# Create veth pair.
ip link add veth1 type veth peer name br-veth1

# Associate the non `br-` side with the namespace.
ip link set veth1 netns namespace1

# Give namespace-side veth ip addresses.
ip netns exec namespace1 ip addr add 192.168.1.11/24 dev veth1

# Create a bridge device naming it `br1` and set it up.
ip link add name br1 type bridge

# Turn up the bridge.
ip link set br1 up

# Set the bridge veth from the default namespace up.
ip link set br-veth1 up

# Set the veth from the namespace up too.
ip netns exec namespace1 ip link set veth1 up

# Add the br-veth1 interface to the bridge by setting the bridge device as their master.
ip link set br-veth1 master br1

# Add the physical interface to the bridge
ip link set enp3s0 master br1

# Set the address of the `br1` interface (bridge device) to 192.168.1.10/24 and also set the broadcast address to 192.168.1.255 (the `+` symbol sets  the host bits to 255).
ip addr add 192.168.1.10/24 brd + dev br1

# add the default gateway in all the network namespace.
ip netns exec namespace1 ip route add default via 192.168.1.10

# Set us up to have responses from the network.
# -t specifies the table to which the commands should be directed to. By default, it's `filter`.
# -A specifies that we're appending a rule to the chain that we tell the name after it.
# -s specifies a source address (with a mask in this case).
# -j specifies the target to jump to (what action to take).
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
sysctl -w net.ipv4.ip_forward=1

答案1

不要使用veth+bridge!使用macvlan!

我最近和你一样在veth+bridge上苦苦挣扎,幸运的是我发现了这个链接今晚,上面写着:

在 MACVLAN 出现之前,如果您想从虚拟机或命名空间连接到物理网络,则需要创建 TAP/VETH 设备并将一侧连​​接到网桥,同时将物理接口连接到主机上的网桥,如下所示。

现在,借助 MACVLAN,您可以将与 MACVLAN 关联的物理接口直接绑定到命名空间,而无需桥接。

这就是我所做的:

$ sudo ip netns add ns0
$ sudo ip netns exec ns0 ip link set lo up
$ sudo ip link add macvlan0 link eth0 type macvlan mode bridge
$ sudo ip link set macvlan0 netns ns0
$ sudo ip netns exec ns0 ip link set macvlan0 up
$ sudo ip netns exec ns0 ip addr add 172.29.6.123/21 dev macvlan0
$ sudo ip netns exec ns0 ping 172.29.0.1
PING 172.29.0.1 (172.29.0.1) 56(84) bytes of data.
64 bytes from 172.29.0.1: icmp_seq=1 ttl=64 time=0.360 ms
64 bytes from 172.29.0.1: icmp_seq=2 ttl=64 time=0.412 ms

这是工作!

答案2

一切看起来都很好,直到最后两个命令(网络命名空间中的默认网关+主命名空间中的伪装)。

如果跳过这两个,您应该有一个配置,其中物理接口桥接到两个内部接口,一个是192.168.1.10主命名空间中桥的内部接口,另一个是192.168.1.11in namespace1

因此,这与将两个物理网络接口连接到同一子网的方式相同,一个来自主命名空间,一个来自namespace. (您可以使用 amacvlan而不是 veth-pair达到相同的效果)。

192.168.1.10转发和伪装都不是必要的,从主命名空间进入的默认路由是错误的。

如果两个命名空间的路由都是正确的(验证这一点),您应该能够 ping 通另一个接口,以及连接到物理接口的任何内容。

为了进行测试,我建议在;中启动一个xtermetc.namespace1然后您可以直接配置所有内容,而无需一直键入ip netns exec namespace1 ip ...

相关内容