将 IP 路由到 OpenVPN 客户端

将 IP 路由到 OpenVPN 客户端

我的 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。

相关内容