Iptables

通過 Openvpn 隧道路由特定客戶端

  • April 5, 2019

我在我的 centos 盒子中執行了 openvpn 客戶端,我將其用作內部網路的路由器。我有兩個介面可以到達外面的世界。

eth0 - normal internet 
tun0 - openvpn tunnel 

我通過放置“route-noexec”選項禁用 opevpn 自動路由拉取,現在我手動處理所有路由。在我打開 openvpn 隧道後,我的路由表是這樣的。

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.80.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.8.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
192.168.44.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.11.0    0.0.0.0         255.255.255.0   U     0      0        0 dummy0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         192.168.44.1    0.0.0.0         UG    0      0        0 eth0

現在我有一個內部主機,它連接到我的 centos 盒子上的介面 192.168.80.0

192.168.80.50

我需要通過介面 tun0 路由來自該使用者的所有流量,並通過 eth0 路由所有其他流量

我嘗試添加這樣的 POSTROUTING 規則

iptables -t nat -A POSTROUTING -s 192.168.80.50 -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING  -o eth0 -j MASQUERADE

但所有客戶端都只通過 eth0,包括 192.168.80.50。我怎樣才能做到這一點?

根據SuperUser 上的這個答案

為某些 IP 創建路由表:

ip rule add from <sourceIP>/<mask> table <name>

然後聲明一個新的路由來匹配路由表<name>

ip route add default via <router> dev tun0 table <name> 

為需要使用 VPN 的人提供子網會更容易,因為使用此配置,您需要在表中指定所有 IP<name>

如果您想通過 VPN 隧道為選定的 VPN 客戶端放置所有流量,您必須在“客戶端”設置此 - 在此使用者配置中。在客戶端配置文件中,它是選項:“redirect-gateway autolocal”。在 VPN 伺服器上,您可能必須為此 VPN 客戶端 IP 設置 SNAT 或 MASQUERADE。

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