我的 VPS 上有外部 IPv4-IP。我想将其中一个路由到 VPN 客户端 OpenVPN (tun)。只有一个 VPN 客户端应该使用 VPN,我想将所有流量路由到我的第二个外部 IP 到这个 VPN - 以获取某些服务(如家庭邮件服务器)的静态地址。所以我做了以下事情:
- 具有两个 IP 的 VPS(109.230.XXX.5;109.230.XXX.6)
- 第一个 IP 用于 VPN 本身和其他服务,如 webserver 和 icecast2
- 第二个 IP 应路由至 OpenVPN-Client
- OpenVPN 在 109.230.XXX.5 上监听 - 在 tun0 上具有内部子网 10.8.0.0/24
- OpenVPN 客户端位于 NAT 后面,OpenVPN 的 IP 地址为 10.8.0.6,而我家里的路由器 (10.0.0.1) 的 IP 地址为 10.0.0.6
- 外部 IP 为 217.235.XXX.32(动态)
OpenVPN 服务器上的 iptables 包括:
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT # Allow forwarding for VPN iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE # Enable NAT for VPN iptables -t nat -A PREROUTING -d 109.230.XXX.6 -j DNAT --to-destination 10.8.0.6 # route 109.230.XXX.6 to my server.home'
如果我尝试 ping 109.230.XXX.6,tcpdump 会显示:
$ tcpdump -ni tun0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 65535 bytes 17:03:07.883564 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 13, length 64 17:03:08.884923 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 14, length 64 17:03:09.886750 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 15, length 64 17:03:10.889176 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 16, length 64 17:03:11.888974 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 17, length 64
回复通过 eth0(连接到我家路由器的端口)发出。它看起来像以下内容:
$ tcpdump -ni eth0 | grep reply tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 17:07:49.304936 IP 10.8.0.6 > 217.235.XXX.32: ICMP echo reply, id 8989, seq 1, length 64 17:07:50.302311 IP 10.8.0.6 > 217.235.XXX.32: ICMP echo reply, id 8989, seq 2, length 64 17:07:51.305998 IP 10.8.0.6 > 217.235.XXX.32: ICMP echo reply, id 8989, seq 3, length 64 17:07:52.302204 IP 10.8.0.6 > 217.235.XXX.32: ICMP echo reply, id 8989, seq 4, length 64
当然,我家里的路由器会丢弃数据包 - 它不在 NAT 表中。那么如何配置服务器和客户端(- 我的家庭服务器),以将地址路由到我的家庭服务器?我的 VPS 有两个 IP,我想使用其中一个来达到此目的 - 以免因为不使用而浪费 IP。
提前致谢!
答案1
处理此问题的一种方法是更改 VPN 客户端上的默认路由,使其使用 VPN 连接作为其默认网关,而不是使用路由器。如果您只这样做,它将严重中断,因为封装的数据包本身将被路由回 VPN。因此,在替换默认路由之前,您需要使用路由器作为网关创建一条仅指向 VPN 服务器地址的路由。
另一个需要考虑的改进是,当使用这个特定的公共 IP 地址时,消除 VPS 上的 NAT。VPN 客户端本身可以知道它的公共 IP 地址是什么,而不依赖于 NAT。实现这一点的诀窍是,它不将该 IP 地址分配给 VPS 上的“物理”接口,而是仅显示为 VPN 接口上的 PtP 地址。然后,您必须在“物理”接口上启用 proxy_arp。