![如何在 Linode 上实现没有 NAT 的 OpenVPN 客户端路由](https://linux22.com/image/633083/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linode%20%E4%B8%8A%E5%AE%9E%E7%8E%B0%E6%B2%A1%E6%9C%89%20NAT%20%E7%9A%84%20OpenVPN%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%B7%AF%E7%94%B1.png)
我已经设置了一个 OpenVPN 网络,并且它工作正常,我可以从远程客户端访问内部/LAN 计算机。但我的问题是,来自远程计算机的所有流量在 LAN 计算机上显示为好像来自 OpenVPN 服务器计算机,而不是来自客户端计算机。
为了更好地解释,请考虑我的网络拓扑:
机器 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 进行适当的更改以使其永久生效。
在 OpenVPN 配置中,我有:
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
为了测试哪个 IP 被路由,我创建了一个小型 PHP 脚本,名为显示IP地址:
<?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。
答案1
回答我自己的问题:
进一步了解一下背景情况,这些机器托管在 Linode 上。事实证明,他们在交换机中使用静态映射来将流量路由到 LAN 上的特定节点。由于 VPN 源 IP 不属于这些静态映射,因此流量没有被路由到任何地方。
所以这原来是 Linode 特有的问题,但希望它可以帮助其他人了解这一点。
答案2
由于您发现机器 A 和机器 B 之间的连接实际上并不是交换以太网,并且它只能使用已分配的 IP 地址处理流量,因此您需要寻找其他解决方案。
这可以通过使用隧道来实现。可以使用各种类型的隧道。一种是使用 VPN,这可能是最简单的方法,因为机器 A 已经是 VPN 服务器。然后,您只需将机器 B 设为 VPN 客户端,然后添加路由表条目以通过该 VPN 连接转发所需的前缀。
另一种选择是使用 GRE 隧道或简单的 IP over IP。这些隧道和相关路由可以静态配置,这将使它们比 VPN 方法更具优势。
答案3
在机器 A 上,您有一个 NAT 规则,这会导致它在将数据包路由到机器 B 之前更改客户端 IP。您需要做的第一件事就是删除该 NAT 规则,这样数据包就会不经修改地转发到机器 B。
如果机器 B 上的路由表不完整,此更改可能会导致连接停止工作。在这种情况下,数据包被正确地传送到机器 B,但它没有路由来传送回复。这将导致它根本不响应或将响应发送到互联网而不是 VPN 服务器。
在机器 B 上,你可以尝试使用以下命令添加路由ip route add 10.200.200.0/24 via 192.168.0.10