Networking

當tun0不是系統預設路由時如何將流量從br0路由到tun0

  • December 24, 2018

我有一個具有 IP 10.0.0.1/24的橋接網路br0,我有一個連接到 IP 10.0.0.2的客戶端。我還有一個 VPN 連接(tun0),它的 IP 由 DHCP 分配,所以它的 IP 可能會有所不同。VPN 連接不是系統的預設路由,因此設備上的所有流量都通過正常eth0路由(不是 VPN 路由)。(主機上啟用了 IPv4 轉發)

我想要實現的是,任何連接到br0(在我的情況下是 LXC 容器)且網關設置為10.0.0.1的客戶端都應該通過 VPN 連接對其流量進行 NAT 和路由。

由於無法直接將tun0設備連接到br0,我嘗試使用iptables獲取轉發的流量。

因此,我認為我必須採取的步驟是強制來自br0的流量被偽裝,然後通過使用以下命令轉發到tun0 :

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A FORWARD -i br0 -o tun0 -j ACCEPT

我還添加了狀態跟踪,但它不起作用:

iptables -A INPUT -i br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

要添加輔助預設路由,我在文件“/etc/iproute2/rt_tables”中添加了“1 vpnout”條目,並添加了預設路由:

ip route add default dev vpn-out table vpnout

哪個不起作用,並且下一個命令的結果相同

ip route add default via dev vpn-out table vpnout
ip rule add from 10.0.0.0/24 table vpnout
ip rule add to 10.0.0.0/24 table vpnout

但在那之後,我仍然無法從連接到br0的客戶端 ping 8.8.8.8。有什麼我錯過的嗎?

因此,由於@Fiisch 的建議,最後我終於找到了缺失的設置。

這是使其工作的最終命令:

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A FORWARD -i br0 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o br0 -j ACCEPT

iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

ip route add default dev tun0 table vpnout
ip route add 10.0.0.0/24 dev br0 table vpnout

ip rule add from 10.0.0.0/24 table vpnout
ip rule add to 10.0.0.0/24 table vpnout

引用自:https://unix.stackexchange.com/questions/490662