我正在尝试配置 openvpn 以便只有来自某些进程的流量通过 vpn,但这些进程可以连接到任何地方。
我尝试通过让 openvpn 不进行任何路由配置(--route-noexec
)并让应用程序明确连接到 tun 接口(例如curl --interface tun0 'http://www.ipchicken.com'
:)来做到这一点,但connect()
似乎超时了。
为了让 tun 界面正常运行,我还需要执行其他步骤吗?
答案1
route-nopull
http://openvpn.net/index.php/open-source/documentation/manuals/69-openvpn-21.html
与 --client 或 --pull 一起使用时,接受服务器推送的选项(路由除外)。在客户端上使用时,此选项可有效禁止服务器向客户端的路由表添加路由,但请注意,此选项仍允许服务器设置客户端 TUN/TAP 接口的 TCP/IP 属性。
因此,将 route-nopull 添加到您的 OpenVPN 配置文件中。我写了一篇关于如何使用OpenVPN VPN 与 cURL/PHP。
答案2
您可以通过对来自您的tun0
接口的数据包使用不同的路由表来实现此目的。
# ip route add $VPN_NETWORK dev tun0
# ip route add default via $VPN_GATEWAY_IP table 1
# ip rule add iif tun0 table 1
第一条路由进入默认表(表 254),第二条路由进入表 2,第三行将来自tun0
接口的数据包绑定到第二条路由表,您可以为此表命名/etc/iproute2/rt_tables
:
# echo '1 vpn' >> /etc/iproute2/rt_tables
如果您的 VPN 网关是10.8.0.1/16
,则必须输入:
# ip route add 10.8.0.0/16 dev tun0
# ip route add default via 10.8.0.1 table vpn
# ip rule add iif tun0 table vpn
这就是所谓的Policy Routing
,您必须CONFIG_IP_MULTIPLE_TABLE
在内核配置中启用它才能工作。