我已经build立了一个OpenVPNnetworking,并且从我可以从远程客户端访问内部/ LAN机器的意义上说,它工作正常。 但是,我的问题是,来自远程计算机的所有stream量都显示在LAN计算机上,就好像它来自OpenVPN服务器计算机,而不是来自客户端计算机。
为了更好地解释,考虑我的networking拓扑:

机器R连接到机器A上的OpenVPN服务器,并分配了IP地址10.200.200.5。
然后机器R向机器B上运行的Apache发出请求。请求到达正确,我得到响应。 问题是机器B看到来自192.168.0.10(机器A的IP)的请求,而不是10.200.200.5。
我想要后者。
我当前的设置
机器A
这是相关的iptables规则的一个片段:
*nat :PREROUTING ACCEPT [18:1080] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -o eth0 -j MASQUERADE *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] // snip # accept incoming VPN connections -A INPUT -p udp -m udp --dport 1194 -j ACCEPT # forward VPN traffic -A FORWARD -s 10.200.200.0/25 -d 192.168.128.0/17 -i tun0 -j ACCEPT -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
我也启用了ip_forwarding:
echo 1 > /proc/sys/net/ipv4/ip_forward
..并对/etc/sysctl.conf进行了适当的修改,使其成为永久的。
在OpenVPNconfiguration中,我有:
server 10.200.200.0 255.255.255.128 push "route 192.168.0.0 255.255.255.0"
机器B
由于机器A不是机器B的网关,所以我在机器B上手动添加了一个路由,如下所示:
ip route add 10.200.200.0/25 via 192.168.0.10 dev eth0
为了testing哪个IP被路由,我创build了一个名为showip.php的小PHP脚本:
<?php echo "Your IP is: ", $_SERVER['REMOTE_ADDR'], "\n"; ?>
机器R
# wget -q -O - http://192.168.0.11/showip.php Your IP is: 192.168.0.10
我怎样才能说10.200.200.5?
更新
为了澄清,在我的具体情况下,机器A有一个NIC(eth0),它同时服务于LAN和WAN。
回答我自己的问题:
作为进一步的背景,这些机器托pipe在Linode上。 事实certificate,他们在交换机中使用静态映射,以便将stream量路由到局域网上的特定节点。 由于VPN源IP不是这些静态地图的一部分,所以stream量不会被路由到任何地方。
所以这是一个Linode特定的问题,但希望它可以帮助别人知道这一点。
由于您发现机器A和机器B之间的连接并不是一个真正的交换式以太网,并且它只能使用您分配的IP地址来处理stream量,所以您需要find另一个解决scheme。
这可以通过使用隧道来实现。 有各种隧道,可以使用。 一种是使用VPN,这可能是最简单的,因为机器A已经是VPN服务器。 然后,您只需要使机器B成为VPN客户端,然后添加路由表条目以通过该VPN连接转发所需的前缀。
另一种select是使用GRE隧道或简单的IP over IP。 这些隧道和相关的路由可以静态configuration,这将使他们比VPN方法更有优势。
在机器A上,你有一条NAT规则,在将数据包路由到机器B之前,它会改变客户机的IP地址。首先你需要删除这个NAT规则,这样数据包就不用修改就被转发到机器B.
如果机器B上的路由表不完整,此更改可能会导致连接停止工作。 在这种情况下会发生什么情况是数据包正确传递到机器B,但它没有路由来传递回应。 这可能会使得它不响应或将响应发送到互联网而不是VPN服务器。
在机器B上,您可以尝试使用以下命令ip route add 10.200.200.0/24 via 192.168.0.10