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

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

我已经设置了一个 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

相关内容