通過不帶 NAT 的 netns 在物理網路之間進行路由
我正在嘗試在連接到 netns 內部設備的網路和 netns 外部網路之間進行路由,僅使用 iptables FORWARD 和 ip route 與相同 netns 內的介面之間的路由相同(ish),但沒有取得太大進展。也許我誤解了一些基本的東西,但是我遇到了一個障礙,到目前為止,在網際網路上進行的任何搜尋都沒有產生任何有用的東西。
我將bond0連接到我的交換機,bond0.1位於196.168.100.1/24的預設netns中,bond0.555位於192.168.136.1/24的netns sip中。從 netns 內部的程序到各自設備的通信工作正常。(在這種情況下,我在 netns 中執行星號,因為它需要不同的預設路由等。對於這個特定的解決方案,這部分不會改變。)
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 訪問相應網路的任何設備,也無法從 192.168.136.1 vlan1 上的設備,或 vlan555 上設備的 192.168.100.1。
我確實嘗試在 bond0.555 和 veth0 之間的 netns 內架起一座橋樑,但這似乎沒有任何區別。我真的不希望在預設的 netns 中橋接,但也沒有嘗試過。
同樣,不確定我是否遺漏了一些明顯的東西或誤解了一些基本的東西,但任何幫助將不勝感激。
所以最後有兩個問題(其中一個在問題中得到了糾正,但我仍然提到它,因為它經常伴隨著使用
ip netns exec
)。
- 外殼重定向問題
ip netns exec
在主機上正常工作(不帶
ip netns exec sip
)時,這種命令:ip netns exec sip echo 1 > /proc/sys/net/ipv4/ip_forward
仍將作用於主機,因為首先執行 shell 重定向。它將
echo
在sip網路命名空間中執行,並將其輸出重定向到主機的設置。這與使用時遇到的問題相同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
sip )時,它會從創建它的位置繼承設置。由於host已經在路由,所以已經是sip。但是sip上的其他類似配置可能會破壞主機。
- 網關選擇錯誤
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
這無濟於事。
更正方法是使用對等系統(主機或sip)的 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