我正在尝试在连接到 netns 内部设备的网络和 netns 外部网络之间进行路由,仅使用 iptables FORWARD 和 ip route,就像在同一个 netns 内的接口之间一样,但没有取得太大进展。也许我误解了一些基本的东西,但我遇到了障碍,到目前为止在互联网上搜索了多少次都没有找到任何有用的东西。
我将 bond0 连接到交换机,bond0.1 位于 196.168.100.1/24 上的默认 netns 中,bond0.555 位于 192.168.136.1/24 上的 netns sip 内。netns 内部进程与各自设备的通信工作正常。(在本例中,我在 netns 内部运行 asterisk,因为它需要不同的默认路由等。对于此特定解决方案,该部分不会改变。)
192.168.100.1是vlan1上所有设备的默认路由
192.168.136.1是vlan555上所有设备的默认路由
现在我希望能够从服务器和 netns 外部从 vlan1 到 vlan555 进行通信。我尝试过的方法是:
ip link add veth0 type veth peer name veth0 netns sip
ip link set veth0 up
ip netns exec sip ip link set veth0 up
ip addr add 172.25.36.1/24 dev veth0
ip netns exec sip ip addr add 172.25.36.2/24 dev veth0
ip route add 192.168.136.0/24 via 172.25.36.1
ip netns exec sip ip route add 192.168.100.0/24 via 172.25.36.2
iptables -A FORWARD -s 192.168.136.0/24 -d 192.168.100.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.136.0/24 -s 192.168.100.0/24 -j ACCEPT
ip netns exec sip iptables -A FORWARD -s 192.168.100.0/24 -d 192.168.136.0/24 -j ACCEPT
ip netns exec sip iptables -A FORWARD -d 192.168.100.0/24 -s 192.168.136.0/24 -j ACCEPT
ip netns exec sip sysctl -w net.ipv4.ip_forward=1
此后,我可以从默认 netns ping 192.168.136.1,也可以从 sip netns ping 192.168.100.1,但我无法通过 netns 访问相应网络的任何设备,也无法从 vlan1 上的设备访问 192.168.136.1,也无法从 vlan555 上的设备访问 192.168.100.1。
我确实尝试在 netns 内部的 bond0.555 和 veth0 之间建立桥接,但似乎没有什么区别。我真的不想在默认 netns 中桥接,但我还没有尝试过。
再次,不确定我是否遗漏了一些明显的内容或误解了一些基本内容,但如果有任何帮助我将不胜感激。
答案1
所以最后出现了 2 个问题(其中一个在问题中得到了纠正,但我仍然提到它,因为它在使用时经常出现ip netns exec
)。
shell 重定向问题
ip netns exec
虽然在主机上运行良好(没有
ip netns exec sip
),但这种命令:ip netns exec sip echo 1 > /proc/sys/net/ipv4/ip_forward
仍将对主机起作用,因为首先执行 shell 重定向。它将
echo
在啜网络命名空间,并将其输出重定向到主机的设置。这与使用时看到的问题相同sudo
,必须使用相同的方法:要么使用tee
,要么有一个等效的命令,根本不需要重定向。这里两个等效的命令是:echo 1 | ip netns exec sip tee /proc/sys/net/ipv4/ip_forward >/dev/null ip netns exec sip sysctl -q -w net.ipv4.ip_forward=1
这里可能没有什么区别,因为当新的网络命名空间(
ip netns
的啜) 被创建后,它将继承创建时的设置。由于主持人已经路由了,所以应该已经啜。但其他类似的配置旨在啜反而会扰乱主持人的秩序。网关选择错误
ip addr add 172.25.36.1/24 dev veth0 ip route add 192.168.136.0/24 via 172.25.36.1 ip netns exec sip ip addr add 172.25.36.2/24 dev veth0 ip netns exec sip ip route add 192.168.100.0/24 via 172.25.36.2
命令不会抱怨。使用自己的 IP 作为网关是另一种方法来告诉不使用任何网关(这甚至可能在不同的操作系统上都有效)。效果与告诉链接直接到相关接口相同,因此这里两个路由命令的行为大多与它们没有使用
via
但使用dev veth0
类似:ip route add 192.168.136.0/24 dev veth0 ip netns exec sip ip route add 192.168.100.0/24 dev veth0
这没有任何帮助。
纠正方法是使用对等系统(主机或啜) 的 IP 作为网关,而不是以前的路由命令。这些命令指示每个系统使用其他系统:
ip route add 192.168.136.0/24 via 172.25.36.2 ip netns exec sip ip route add 192.168.100.0/24 via 172.25.36.1