当用户连接到不受信任的网络时,我使用 openvpn 以加密方式通过服务器路由所有用户流量。
- openvpn网关是10.8.0.5。
- openvpn服务器的实际IP是50.1.1.1。
- 不受信任的网络网关是 20.1.1.1。
这是客户端上的路由表
default via 10.8.0.5 dev tun0 proto static metric 50
default via 20.1.1.1 dev wlp6s0 proto static metric 600
50.1.1.1 via 20.1.1.1 dev wlp6s0 proto static metric 600
总体而言,此设置运行良好。所有流量都通过 openvpn 服务器路由。
现在,用户想要使用公司 smtp 服务器发送一封电子邮件,该服务器恰好是运行 openvpn 服务器的同一台机器(=> 相同的 ip)。
由于路由表中的第 3 条规则,此流量现在正在通过不受信任的网络进行路由,这会导致两个问题:
- 流量不受 VPN 加密保护
- 如果不可信网络仅将端口 80/443 列入白名单或阻止 smtp 端口,则用户无法发送电子邮件
我该如何缓解这个问题?为 vpn&smtp 服务器使用不同的 IP 是不可能的。
答案1
使用水平分割 DNS,可以通过将 smtp 服务器域解析为 VPN 内部 IP 来解决此问题。但是,对于一个简单的问题,这是一个相当复杂的解决方案。客户端上/etc/hosts
为 VPN 连接编辑的 post-up 和 pre-down 脚本将是一个类似的解决方案,但有其他缺点,例如,如果 VPN 进程以非标准方式退出,hosts 文件中的条目不正确。
因此,我更喜欢一个不同的选项(也许与 OpenVPN 集成),以另一种方式解决这个问题,以便除 VPN 端口之外的所有流量都通过 VPN 进行路由。
答案2
您可以在客户端上实施基于策略的路由,并根据目标端口通过不同的路由表路由流量。
http://www.linuxhorizon.ro/iproute2.html
http://www.sparksupport.com/blog/application-based-routing-in-linux_port-based-routing
这可确保所有非 VPN 流量都通过 VPN 正确路由,但需要在客户端进行一些相当复杂的更改。