通过 openvpn (tun0) 从内部网络 (eth1) 路由流量

Route traffic from internal network (eth1) through openvpn (tun0)

我有两个虚拟机,它们都在同一个内部网络 (eth1) 中,但只有一个(网关)实际上连接到互联网(通过 eth0)并且有 openvpn 运行(在 tun0 上)。

在 VM 网关中,我想通过 tun0 路由 eth1,但我做不到。

这是实际设置:

     10.152.152.12                                    
     VM-workstation <===eth1===> VM-gateway <===eth0==> {internet}
                                      /\
                                      ||
                                      \
                                       \===tun0===> {openvpn tunnel}

VM 网关内的网络配置

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.211.1.18     128.0.0.0       UG    0      0        0 tun0
0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.152.128.0    0.0.0.0         255.255.192.0   U     0      0        0 eth1
10.211.1.18     0.0.0.0         255.255.255.255 UH    0      0        0 tun0
128.0.0.0       10.211.1.18     128.0.0.0       UG    0      0        0 tun0
220.123.19.246  10.0.2.2        255.255.255.255 UGH   0      0        0 eth0

#220.123.19.246 is the ip address of the vpn server


$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:c8:73:5d  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:157704 errors:0 dropped:0 overruns:0 frame:0
          TX packets:85478 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:139871643 (133.3 MiB)  TX bytes:9667249 (9.2 MiB)
          Interrupt:19 Base address:0xd000

eth1      Link encap:Ethernet  HWaddr 08:00:27:99:f1:e4  
          inet addr:10.152.152.10  Bcast:10.152.191.255  Mask:255.255.192.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1649 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1306 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:139887 (136.6 KiB)  TX bytes:122465 (119.5 KiB)
          Interrupt:16 Base address:0xd040

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:43763 errors:0 dropped:0 overruns:0 frame:0
          TX packets:43763 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:114248277 (108.9 MiB)  TX bytes:114248277 (108.9 MiB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.211.1.17  P-t-P:10.211.1.18  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:1295 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2092 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:968529 (945.8 KiB)  TX bytes:269286 (262.9 KiB)


$ sysctl net.ipv4.conf.all.forwarding 
net.ipv4.conf.all.forwarding = 1

在 VM 网关内我可以正确使用 tun0

$ ping -I tun0 4.2.2.2
PING 4.2.2.2 (4.2.2.2) from 10.211.1.17 tun0: 56(84) bytes of data.
64 bytes from 4.2.2.2: icmp_seq=1 ttl=55 time=423.2 ms
64 bytes from 4.2.2.2: icmp_seq=2 ttl=55 time=421.7 ms
^C
--- 4.2.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1801ms
rtt min/avg/max/mdev = 421.762/422.484/423.207/12.737 ms

我尝试过的事情(没有成功)

正如我之前所说,我想通过 tun0 路由来自 VM 工作站(在 eth0 上)的所有流量。 我尝试使用 iptables 来重定向流量,但它只部分工作,而且它没有使用 tun0

iptables -t nat -A PREROUTING -i eth1 -s 10.152.128.0/18 ! -d 10.152.128.0/18 -J REDIRECT
iptables -t nat -A POSTROUTING -o eth0 -s 10.152.128.0/18 -J MASQUERADE

我也尝试过使用 FORWARD,但它根本不起作用

iptables -A FORWARD -i eth1 -o tun0 -J ACCEPT
iptables -A FORWARD -i tun0 -o eth1 -J ACCEPT

我尝试了 ip route,但它根本不起作用:

ip rule add from 10.152.128.0/18 table 200
ip route add default dev tun0 table 200

我觉得有一个简单的解决方案,但我找不到它

您发布的第二个解决方案(FORWARD)应该可以使用。但是您需要为您的系统启用 IP 转发,否则这将无法工作。你可以像这样启用它

echo 1 > /proc/sys/net/ipv4/ip_forward

注意:OpenVPN 服务器不知道您正在证明从 eth1 到 tun0 的路由,因此他不知道如何响应来自您的 LAN 的流量( 10.152.128.0/18)。因此,您还需要告知您的 OpenVPN 服务器有关此特定客户端可访问的本地网络。 Here 解释了如何做到这一点。此外,您还需要告知您的 VM-Workstation 在正常网络接口上到 VPN 网络的现在可用路由。

编辑: 如果您只想通过 vpn 网关路由流量,代理确实是正确的方法。不要忘记启用转发 ofc。 这应该可以解决问题:

iptables -t nat -A POSTROUTING -s 10.152.128.0/18 -o tun0 -j MASQUERADE

使用此方法需要您通知 VM 工作站有关 VM 网关是默认网关的信息。