Iptables
通過 VPN 僅路由來自特定介面的數據包
所以我在主機上有3個介面:
- 介面1面向外網
- 介面 2 是 tun0 vpn 介面
- 介面 3 本地網路介面
我的目標是通過 vpn 介面路由來自介面 3(本地網路)的所有流量,並通過預設介面 1 路由來自主機的所有流量
# ip route default via 192.168.1.1 dev eth0 10.8.8.0/24 dev tun0 proto kernel scope link src 10.8.8.27 128.0.0.0/1 via 10.8.8.1 dev tun0 192.168.0.0/24 dev eth2 proto kernel scope link src 192.168.0.1 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.56
(我在這裡讀過其他文章,但沒有一個真的很有幫助)
首先:如果路由器不使用隧道,則不應存在“半預設”路由 128.0.0.0/1(沒有另一半 0.0.0.0/1 ??):
# ip route del 128.0.0.0/1 via 10.8.8.1 dev tun0
由於它很可能是通過隧道軟體設置的,因此請處理其配置。
現在創建一個新表(隨機選擇:100),其中包含通過隧道的預設路由,並將其僅用於來自 eth2 的流量:
# ip route add default via 10.8.8.1 dev tun0 table 100 # ip rule add iif eth2 lookup 100
測試:
主機使用通常的預設路由,無論其源 IP 是什麼(根據問題,隧道的選擇器來自介面,而不是 IP):
# ip -o route get 8.8.8.8 8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.56 \ cache # ip -o route get 8.8.8.8 from 192.168.0.1 8.8.8.8 from 192.168.0.1 via 192.168.1.1 dev eth0 \ cache
來自 eth2 的流量將得到不同的處理:
# ip -o route get 8.8.8.8 from 192.168.0.2 iif eth2 8.8.8.8 from 192.168.0.2 via 10.8.8.1 dev tun0 table 100 \ cache iif eth2
如果您還希望本地 192.168.0.1 IP 通過隧道。它有點複雜,因為 192.168.0.1 需要在需要時將 IP 數據包發送到它自己的 LAN(在這種情況下不是 tun0)。需要將 LAN 路由也複製到表 100,添加基於源 IP 的規則(然後刪除無用的基於介面的先前規則):
# ip route add 192.168.0.0/24 dev eth2 table 100 # ip rule add from 192.168.0.0/24 lookup 100 ( # ip rule del iif eth2 lookup 100 )
現在還給出:
# ip -o route get 8.8.8.8 from 192.168.0.1 8.8.8.8 from 192.168.0.1 via 10.8.8.1 dev tun0 table 100 \ cache
這就是路由。請注意,如果沒有 NAT,隧道的另一端需要通過 10.8.8.27 到 192.168.0.0/24 的路由,否則它將不起作用。這應該是首選。
如果未設置遠端上的此路由,並且 NAT 足夠好,請使用以下命令對其進行配置:
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o tun0 -j MASQUERADE