Networking
當tun0不是系統預設路由時如何將流量從br0路由到tun0
我有一個具有 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