正常路由 http 和 ssh 流量,其他所有流量均通过 vpn 隧道

正常路由 http 和 ssh 流量,其他所有流量均通过 vpn 隧道

我已经读了相当多的内容,感觉已经很接近了,我正在抓狂……帮助!

我有一个 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 tun0tcpdump -i eth0看不到这些流量)。

我尝试的是:

  • 创建第二个路由表,保存 192.168.1.6/24 路由​​信息(从main上表复制)
  • 添加iptables -t mangle -I PREROUTING规则来标记发往端口 80 的数据包
  • 添加一个ip rule匹配损坏数据包的路由,并将其指向第二个路由表
  • 添加一个 IP 规则to 192.168.1.6from 192.168.1.6指向第二个路由表(虽然这是多余的)
  • 将 ipv4 过滤器验证更改为net.ipv4.conf.tun0.rp_filter=0nonenet.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 空间。

相关内容