![开放VPN路由](https://linux22.com/image/36742/%E5%BC%80%E6%94%BEVPN%E8%B7%AF%E7%94%B1.png)
到目前为止,我已经使用未加密的 openvpn 隧道成功在服务器 A 和服务器 B 之间创建了虚拟链接。我正在尝试通过服务器 A 路由服务器 B 的部分流量。服务器 B 有 5 个外部 IP,我想添加 5 个本地 VPN IP,将流量重定向到服务器 A 的 5 个 IP,这将为服务器 B 提供 10 个不同的传出 IP世界。显然,需要在两台服务器上完成一些路由,但经过一天的谷歌搜索和阅读后我没有得到任何结果。
我做到了
ip route add default via 10.0.0.2 dev tun0 table vpn_table
ip rule add from 10.0.0.1/32 table vpn_table
ip rule add to 10.0.0.2/32 table vpn_table
ip route flush cache
在服务器 B 上,与服务器 A 上的情况相同,但交换了 IP。然而,当我在服务器B上wget --bind-address=10.0.0.1 somewebsite
这样做时,它不起作用,我猜是因为服务器 A 不知道如何处理该请求。
有人能指出我正确的方向吗?
编辑
有人建议服务器A不需要ip规则,所以我现在的情况是:
- 设置 openvpn 链接
- 在服务器BI上执行上面提到的四个ip命令
我想我仍然缺少服务器 A 上的一些路由信息。这是我wget --bind-address=10.0.0.1 http://www.cnn.com
在服务器 B 上执行时服务器 A 上的 tcpdump 输出的内容:
tcpdump: WARNING: arptype 65534 not supported by libpcap - falling back to cooked socket
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
07:11:58.787908 IP 10.0.0.1.42802 > 157.166.248.10.80: S 2416144580:2416144580(0) win 14600 <mss 1410,sackOK,timestamp 858359606 0,nop,wscale 7>
07:11:59.786129 IP 10.0.0.1.42802 > 157.166.248.10.80: S 2416144580:2416144580(0) win 14600 <mss 1410,sackOK,timestamp 858359856 0,nop,wscale 7>
07:12:01.788535 IP 10.0.0.2 > 10.0.0.1: ICMP host 157.166.248.10 unreachable, length 68
07:12:01.788545 IP 10.0.0.2 > 10.0.0.1: ICMP host 157.166.248.10 unreachable, length 68
服务器 B 上的 Wget 说
Connecting to www.cnn.com (www.cnn.com)|157.166.248.11|:80... failed: No route to host.
编辑 2014 年 5 月 19 日
在服务器 A 上添加了 SNAT,现在服务器 A 上的 tcpdump 正在给我(93.184.216.119 = www.example.com,1.2.3.4 = 服务器 A 的外部 IP,现在是来自 10.0.0.1 的数据包的来源)
09:29:44.114475 IP 10.0.0.1.54691 > 93.184.216.119.80: S 717252699:717252699(0) win 14600 <mss 1410,sackOK,timestamp 903625938 0,nop,wscale 7>
09:29:45.113546 IP 10.0.0.1.54691 > 93.184.216.119.80: S 717252699:717252699(0) win 14600 <mss 1410,sackOK,timestamp 903626188 0,nop,wscale 7>
09:29:47.116587 IP 1.2.3.4 > 10.0.0.1: ICMP host 93.184.216.119 unreachable, length 68
09:29:47.116668 IP 1.2.3.4 > 10.0.0.1: ICMP host 93.184.216.119 unreachable, length 68
09:29:47.119289 IP 10.0.0.1.54691 > 93.184.216.119.80: S 717252699:717252699(0) win 14600 <mss 1410,sackOK,timestamp 903626689 0,nop,wscale 7>
09:29:50.120591 IP 1.2.3.4 > 10.0.0.1: ICMP host 93.184.216.119 unreachable, length 68
因此,服务器 A 上的 SNAT 似乎正在工作,但不知何故无法连接到所请求的网站。服务器A iptables列表:
SNAT all -- 10.0.0.1 anywhere to:1.2.3.4
服务器A ip规则列表:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
服务器 A 'route -n' 的一部分:
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
网关是 0.0.0.0 可能与此有关吗?
答案1
有几个问题:
将数据包路由到它们来自的地方是没有意义的。即
ip rule add from 10.0.0.1/32 table vpn_table
必须在服务器 A 上省略(
ip rule add to...
也没有必要);服务器 A 有“正常”路由。不过,您需要在服务器 B 上设置这样的规则(对于 B 的 IP 地址)。您需要在服务器 A 上进行 SNAT。类似于
iptables -t nat -A POSTROUTING -s 10.0.0.1 -j SNAT --to-source 1.2.3.4