我的老板特别偏执,希望我帮他组织某种 VPN 链接。我想出了以下方案:
Client VPN1 VPN2
10.0.1.x[tun0]------10.0.1.1[tun0]
[1.1.1.1][eth0] 10.0.2.x[tun1]----------10.0.2.1[tun0]
2.2.2.2[eth0] 3.3.3.3[eth0]------internet
我可以通过 iptables 转发从客户端使用 VPN1,如下所示:
vpn1 # iptables -A FORWARD -s 10.0.1.0/24 -j ACCEPT
vpn1 # iptables -A FORWARD -d 10.0.1.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT
vpn1 # iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 2.2.2.2
如果我将其设为默认网关,我可以从 VPN1 使用 VPN2,或者如果我选择指定的主机,如下所示:
vpn1 # route add -host 8.8.8.8 dev tun1
我无法使用客户端的完整 VPN1-VPN2-Internet 链。我尝试将流量从 tun0 转发到 tun1,反之亦然,如下所示:
vpn1 # iptables -A FORWARD -i tun0 -o tun1 -j ACCEPT
vpn1 # iptables -A FORWARD -i tun1 -o tun0 -j ACCEPT
在这种情况下,我可以看到 ICMP 请求从两个 VPN1 tun 接口上的客户端 IP 发出,但无法得到任何响应。
如何通过完整链转发来自客户端的所有流量?
编辑:(全部在 vpn1 上)
tcpdump -i tun0 icmp 显示 10.0.1.6(客户端)的请求进入互联网
tcpdump -i tun1 没有显示任何内容
tcpdump -i eth0 显示与 tun0 相同,10.0.1.6(客户端)发送请求
我的想法是 iptables 规则应该将 tun0 转发到 tun1 反之亦然,但由于某种原因,来自 tun0 的流量到达 eth0 然后流向互联网,这可能是问题所在吗?
答案1
我设法让这个东西工作了。基本上,我需要将所有来自客户端到 VPN1 的 tun0 接口的数据包转发到 VPN1 tun1 IP 地址(10.0.2.6)。
iptables -A FORWARD -s 10.0.1.0/24 -j ACCEPT
iptables -A FORWARD -d 10.0.1.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 10.0.2.6
其次,我需要通过添加以下规则来使用 iproute2 系统:
这将向表 120 添加默认路由
ip route add default via 10.0.2.6 table 120
此基于规则的路由使用数据包的 src 作为条件
ip rule add from 10.0.1.0/24 table 120
一切顺利!现在进行测试,我在客户端上执行 traceroute 8.8.8.8:
1 10.0.1.1 (10.0.1.1) 223.570 ms 444.898 ms 444.875 ms
2 10.0.2.1 (10.0.2.1) 444.845 ms 666.709 ms 889.544 ms
....
现在只是一些像自动化和发布脚本这样的小事......谢谢你的帮助!