我如何在没有NAT的Linode上实现OpenVPN客户端路由

我已经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