通过 OpenVPN 代理仅路由我的 Ubuntu 机器的 Web 流量

通过 OpenVPN 代理仅路由我的 Ubuntu 机器的 Web 流量

我的问题很简单,但我在互联网上找不到简洁的分步指南/示例。我有一个 OpenVPN 代理服务器,我只想通过它路由本地 Ubuntu 计算机的网络流量。我知道我们可以通过更改客户端配置来通过 OpenVPN 路由特定目的地(IP 或网络)(这里)。但对于特定流量(例如 web(80/443)),我知道我应该将其添加route-nopull到 client.config 中,并通过标记 web 流量并将其路由到 OpenVPN 网关来添加一些 iptables 规则,但我不确定如何执行此操作。任何建议都会很有帮助。

答案1

使用基于规则的策略路由。

Netfilter 会给数据包添加标记:

iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x1

那么 Linux 应该被告知,如果它看到这个标记,它应该使用备用路由表:

ip rule add fwmark 0x1 lookup 201

并且您需要该表中的一条路线:

ip route add default via [your-openvpn-peer-address] table 201

请注意,您仍然可能被非标准端口和 DNS 查询跟踪。使用相同方法,也可以轻松路由全部或部分端口 - 只需添加更多 netfilter 标记规则即可。

您也可以使用符号别名来代替内核表号。

echo "201 route-via-vpn" >> /etc/iproute2/rt_tables

然后在所有 ip 子命令中使用“route-via-vpn”表名代替数字:ip rule add ... lookup route-via-vpn,ip route add ... table route-via-vpn。

您可能需要在隧道建立后自动运行 netfilter、ip rule 和 ip route 命令,并在隧道关闭时运行反向命令(iptables -D、ip rule delete 或 ip route delete)。这可以通过 OpenVPN 脚本完成。

设置 OpenVPN 对等体来转发数据包由您决定。

答案2

感谢上述回答,但对我有用的是:

iptables -t mangle -A OUTPUT -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
sysctl -w net.ipv4.conf.tun0.rp_filter=2
ip rule add fwmark 0x1 lookup 201
ip route add default dev tun0 table 201

相关内容