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

时间:2016-02-11 23:37:45

标签: networking routing iptables openvpn gateway

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

在VM-gateway中我想通过tun0路由eth1,但我无法做到。

这是实际设置:

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

VM-gateway内的网络配置

$ 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-gateway内部,我可以正确使用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

我觉得这是一个简单的解决方案,但我无法找到它

1 个答案:

答案 0 :(得分:1)

您发布的第二个解决方案(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网关路由流量,代理确实是正确的方法。别忘了启用转发功能。 这应该可以解决问题:

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

使用此方法需要您通知VM-Workstation VM-Gateway是它的默认网关。