Linux-Networking

通過不帶 NAT 的 netns 在物理網路之間進行路由

  • April 30, 2019

我正在嘗試在連接到 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 重定向。它將echosip網路命名空間中執行,並將其輸出重定向到主機的設置。這與使用時遇到的問題相同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 netnssip )時,它會從創建它的位置繼承設置。由於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

引用自:https://serverfault.com/questions/964968