Iptables

通過 VPN 僅路由來自特定介面的數據包

  • March 26, 2018

所以我在主機上有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

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