我想通过computer_X
VPN 客户端路由除传出流量之外的所有流量(如果这样更容易的话,我还可以在客户端上安装 VPN 服务器)。
默认情况下,传入连接(例如对我的网络服务器 :80 或 :443 或 ssh :22 的请求)仍将通过我的 WAN 接口进行路由,但传出连接(例如来自我的 :80 请求)computer_X
应通过 VPN 客户端进行路由。
我添加了一条规则以始终使用广域网网关作为源自 my 的数据包的默认路由广域网接口。看:
# ip route show table 42
default via WAN_GATEWAY dev eth0
# ip rule list
0: from all lookup local
32765: from WAN_IP lookup 42
32766: from all lookup main
32767: from all lookup default
# ip r
default via WAN_GATEWAY dev eth0 onlink
10.8.0.0/24 via 10.8.0.2 dev tun0
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
WAN_SUBNET/26 via WAN_GATEWAY dev eth0
WAN_SUBNET/26 dev eth0 proto kernel scope link src WAN_IP
# ip a
eth0: inet WAN_IP ...
tun0: inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
现在我想通过我的路由路由所有传出流量屯0设备,但我不能只是ip route add default via 10.8.0.1
因为你不能在其自身上路由隧道?
但也许我仍然可以做默认路由
ip route default via 10.8.0.1
但还要为 VPN 连接创建一个特定的路由,就像这样?
ip route add table 32 default via WAN_IP
ip rule add from 10.8.0.0/8 table 32
我希望这可以防止 VPN 不通过自身进行路由。
或者我是否必须手动添加除 10.8.0.0/8 之外的所有子网的所有路由(以确保隧道不会自行建立隧道)?
ip route add 128.0.0.0/1 via 10.8.0.1
ip route add 64.0.0.0/2 via 10.8.0.1
ip route add 32.0.0.0/3 via 10.8.0.1
ip route add 16.0.0.0/4 via 10.8.0.1
ip route add 12.0.0.0/6 via 10.8.0.1
ip route add 11.0.0.0/7 via 10.8.0.1
ip route add 9.0.0.0/8 via 10.8.0.1
答案1
OpenVPN 默认情况下会在默认路由表中添加到 OpenVPN 服务器的路由。路由决策由最匹配的规则进行,如果没有规则匹配,则使用默认网关。由于 OpenVPN 服务器有更精确的规则,因此使用它来代替默认路由。
您应该使用默认配置通过 OpenVPN 路由所有流量,然后为您的特殊情况配置例外情况。
您可以配置一个单独的网络命名空间具有自己的路由配置并在其中运行服务。这可能需要您为命名空间分配单独的 IP 地址和/或在命名空间之间使用 NAT 配置。
单独的网络命名空间的替代方法是使用策略路由带有数据包标记。
用于iptables
标记10
来自源端口的数据包80,第443章和22 号:
iptables -t mangle -A OUTPUT -p tcp -m multiport --sports 80,443,22 -j MARK --set-mark 10
配置路由表。使用默认路由表的 OpenVPN 配置(通过 OpenVPN 隧道的所有流量,隧道本身除外)。对于标记的流量有一个单独的路由表。
# add new routing table 100 and set its default routing to your default gw
ip route add table 100 default via $DEFAULT_GW
# add rule to use the new table for packets marked 10
ip rule add fwmark 10 table 100
# flush routing cache
ip route flush cache