如何将流量从私有网络路由到 openvpn 子网(并返回)

如何将流量从私有网络路由到 openvpn 子网(并返回)

我在 Linode 有几台服务器。我正在尝试设置它们,以便我可以使用 VPN 连接到其中一台机器,然后可以使用私有 linode 网络访问所有其他机器。这样,对私有服务(SSH 等)的公共访问将仅限于那些拥有 VPN 访问权限的人。

注意:我有没有防火墙尚未在这些服务器上运行。

root@internal:~# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

内部服务器(运行 openvpn 服务器)

eth0      Link encap:Ethernet  HWaddr f2:3c:91:db:68:b4  
          inet addr:23.239.17.12  Bcast:23.239.17.255  Mask:255.255.255.0
          inet6 addr: 2600:3c02::f03c:91ff:fedb:68b4/64 Scope:Global
          inet6 addr: fe80::f03c:91ff:fedb:68b4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:80780 errors:0 dropped:0 overruns:0 frame:0
          TX packets:102812 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:14317079 (14.3 MB)  TX bytes:17385151 (17.3 MB)

eth0:1    Link encap:Ethernet  HWaddr f2:3c:91:db:68:b4  
          inet addr:192.168.137.64  Bcast:192.168.255.255  Mask:255.255.128.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:172.20.1.1  P-t-P:172.20.1.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:2318 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1484 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:174573 (174.5 KB)  TX bytes:170941 (170.9 KB)

对以上内容的评论:

  • eth0 是公共接口
  • eth0:1 是专用网络的接口
  • VPN 隧道正常工作。从连接到 VPN 的客户端,我可以 ping 172.20.1.1 和 192.168.137.64。
  • 此服务器上设置了 net.ipv4.ip_forward=1

数据库服务器(nix03):

root@nix03:~# ifconfig eth0      Link encap:Ethernet  HWaddr f2:3c:91:73:d2:cc  
          inet addr:173.230.140.52  Bcast:173.230.140.255  Mask:255.255.255.0
          inet6 addr: 2600:3c02::f03c:91ff:fe73:d2cc/64 Scope:Global
          inet6 addr: fe80::f03c:91ff:fe73:d2cc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12348 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44434 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1166666 (1.1 MB)  TX bytes:5339936 (5.3 MB)

eth0:1    Link encap:Ethernet  HWaddr f2:3c:91:73:d2:cc  
          inet addr:192.168.137.63  Bcast:192.168.255.255  Mask:255.255.128.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

对以上内容的评论:

  • eth0 是公共接口
  • eth0:1 是专用网络的接口
  • 我可以在私有接口(192.168.137.64)上 ping 内部服务器。

当前问题

我希望能够通过 VPN 访问数据库服务器。我希望能够从我的 VPN 客户端(办公室的笔记本电脑)ping 192.168.137.63。但是,目前无法ping通。

在尝试排除故障时,我决定从数据库服务器端着手,看看是否可以 ping 内部服务器 (172.20.1.1) 上的 VPN 隧道。我意识到我需要在数据库服务器上设置一条路由,告诉它将发往 172.20.1.0/24 网络的数据包发送到哪里,所以我这样做了:

root@nix03:~# ip route add 172.20.1.0/24 via 192.168.137.64 root@nix03:~# ip route list default via 173.230.140.1 dev eth0
172.20.1.0/24 via 192.168.137.64 dev eth0
173.230.140.0/24 dev eth0  proto kernel  scope link  src 173.230.140.52
192.168.128.0/17 dev eth0  proto kernel  scope link  src 192.168.137.63 root@nix03:~# ip route get 172.20.1.1
172.20.1.1 via 192.168.137.64 dev eth0  src 192.168.137.63
    cache     

所以,我认为基于上述情况,当我 ping 172.20.1.1 时,我的服务器应该将数据包发送到 192.168.137.64(内部服务器)。由于 IP 转发,该服务器应该从 eth0:1 接收数据包并将其路由到 tun0(172.20.1.1)。

但是,正如您可能已经猜到的那样,从 nix03(数据库服务器) ping 172.20.1.1 不起作用。

我进行了一些数据包捕获,以查看我的 ICMP 数据包被发送到哪个 MAC 地址:

root@nix03:~# tcpdump -i eth0 -e icmp tcpdump:抑制详细输出,使用 -v 或 -vv 进行完整协议解码 在 eth0 上监听,链路类型 EN10MB(以太网),捕获大小 65535 字节 16:41:39.623759 f2:3c:91:73:d2:cc(oui 未知)> f2:3c:91:db:68:b4(oui 未知),以太网类型 IPv4(0x0800),长度 98:192.168.137.63 > 172.20.1.1:ICMP 回显请求,id 3324,seq 33653,长度 64 root@nix03:~# arp Address HWtype HWaddress Flags Mask Iface 192.168.137.64 ether f2:3c:91:db:68:b4 C eth0

这告诉我数据包应该到达内部服务器。至少,它们被发送到正确的 NIC。但是,当我在内部服务器的 eth0 和 eth0:1 上运行 tcpdump 时,我没有看到任何来自数据库服务器的 icmp 数据包。

我还能尝试什么?提前致谢。

更新 #1

“内部”服务器的路由表:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gw-li686.linode 0.0.0.0         UG    0      0        0 eth0
23.239.17.0     *               255.255.255.0   U     0      0        0 eth0
172.20.1.0      172.20.1.2      255.255.255.0   UG    0      0        0 tun0
172.20.1.2      *               255.255.255.255 UH    0      0        0 tun0
192.168.128.0   *               255.255.128.0   U     0      0        0 eth0

答案1

我最终不得不向内部服务器添加 NAT 规则。我不确定这是否有必要,但它确实有效:

*nat
:PREROUTING ACCEPT [21:1248]
:INPUT ACCEPT [21:1248]
:OUTPUT ACCEPT [21:1529]
:POSTROUTING ACCEPT [21:1529]
# enable NAT for VPN clients so they can hit the private network
-A POSTROUTING -s 172.20.1.0/24 -o eth0 -j MASQUERADE
COMMIT

答案2

我遇到了同样的问题,并得出结论 Linode 不适合这种 VPN 配置。

首先:您尝试执行的操作(设置路由)从 192.168.137.63(nix03 上的 eth0:1)到 172.20.1.1(内部的 tun0)确实是正确的,并且在非 Linode 设置中有效。我描述了Linode 论坛中的设置相同我收到了一位前 Linode 员工的回复,他告诉我 Linode 禁止这种设置

此外,即使像您那样将 VPN 流量 NAT 到内部网络确实是另一种正确的方法,请记住 192.168.128.0/24 子网不是您私有的,而是所有与您在同一数据中心拥有虚拟机的 Linode 客户的私有子网。尝试 nmap 来检查我所说的内容:

nmap -sP 192.168.128.0/17

因此,在 Linode 案例中,如果你真的想要:

公共访问私人服务(SSH 等)将被限制为仅限具有 VPN 访问权限的用户。

您需要仔细设置防火墙,以仅允许精确的 IP 地址访问,因为子网仅在以下情况下才是私有的:Linode 数据中心顾客的词语含义。

相关内容