我已经读了相当多的内容,感觉已经很接近了,我正在抓狂……请帮助!
我有一个 OpenVPN 客户端,其服务器设置了本地路由,还更改了默认网关(我知道我可以使用 --route-nopull 来阻止这种情况)。我希望所有传出的 http 和 ssh 流量都通过本地网关,其他所有流量都通过 VPN。
- 本地IP为192.168.1.6/24,网关192.168.1.1。
- OpenVPN 本地 IP 为 10.102.1.6/32,网关 192.168.1.5
- OpenVPN 服务器位于 {OPENVPN_SERVER_IP}
以下是openvpn连接后的路由表:
# ip route show table main
0.0.0.0/1 via 10.102.1.5 dev tun0
default via 192.168.1.1 dev eth0 proto static
10.102.1.1 via 10.102.1.5 dev tun0
10.102.1.5 dev tun0 proto kernel scope link src 10.102.1.6
{OPENVPN_SERVER_IP} via 192.168.1.1 dev eth0
128.0.0.0/1 via 10.102.1.5 dev tun0
169.254.0.0/16 dev eth0 scope link metric 1000
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.6 metric 1
这使得除发往 192.168.1.0/24 的数据包之外的所有数据包都通过 VPN 隧道传输。
执行操作wget -qO- http://echoip.org
显示了 vpn 服务器的地址,正如预期的那样,数据包的源地址为 10.102.1.6(vpn 本地 ip),并通过tun0
... 路由,如报告所示tcpdump -i tun0
(tcpdump -i eth0
看不到这些流量)。
我尝试的是:
- 创建第二个路由表,保存 192.168.1.6/24 路由信息(从
main
上表复制) - 添加
iptables -t mangle -I PREROUTING
规则来标记发往端口 80 的数据包 - 添加一个
ip rule
匹配损坏数据包的路由,并将其指向第二个路由表 - 添加一个 IP 规则
to 192.168.1.6
并from 192.168.1.6
指向第二个路由表(虽然这是多余的) - 将 ipv4 过滤器验证更改为
net.ipv4.conf.tun0.rp_filter=0
nonenet.ipv4.conf.eth0.rp_filter=0
我也尝试了一条iptables mangle output
规则iptables nat prerouting
。它仍然失败,我不确定我遗漏了什么:
iptables mangle prerouting
:数据包仍通过 VPN 传输iptables mangle output
:数据包超时
难道为了实现我想要的效果,在wget http://echoip.org
路由数据包之前,我应该将数据包的源地址更改为 192.168.1.6 吗?但如果我这样做,来自 http 服务器的响应将被路由回 192.168.1.6,并且由于它仍然绑定到(vpn 接口),wget
所以不会看到它?tun0
有好心人能帮忙吗?openvpn 连接后要执行哪些命令才能实现我想要的效果?
期待头发重新长出来...
答案1
0.0.0.0/1 via 10.102.1.5 dev tun0
这是你的问题。
0.0.0.0/1 是一个非常大的 IP 范围(0.0.0.0 - 127.255.255.255),它是路由表中的第一个条目,因此任何属于该范围的 IP 地址都将被强制路由tun0
。该范围非常大,以至于它涵盖了互联网上可路由 IP 空间的大部分。因此,对我来说,解析为 69.163.172.52 的 echoip.org 包含在 0.0.0.0/1(0.0.0.0 - 127.255.255.255)内。
要查看我是否正确,请尝试 wgethttp://serverfault.com,对我来说解析为 198.252.206.16,看看它是否出自 eth0。它应该出自 eth0,因为它在 (0.0.0.0 - 127.255.255.255) 之外。
一般来说,我通常会使我的 tun0 IP 空间尽可能具体。10.102.0.0/16 via 10.102.1.5
例如。
除非您的目标是出于安全/监控原因将所有互联网流量路由到特定的出口点,否则我会尝试缩小您的隧道 IP 空间。