通过OpenVPN使用iptables的多个服务器的NAT

我成功地为我的家庭需要创build了一个OpenVPNnetworking(在VPS中托pipe的服务器 )10.8.0.0/255.255.0.0,支持OpenVPN客户端的客户端可以通过服务器连接并成功连接它们。

也有一些机器(如NAS)不支持OpenVPN,但我想通过VPNnetworking与他们连接。 我的解决scheme是有一个小型机器(如Raspberry Pi [ IP地址:192.168.1.109 ])作为一个OpenVPN客户端,并正确转发数据包到目标机器,但我不喜欢这里提出的解决scheme,因为:

  1. 我不想在不同的本地networking(和我的家)之间产生子网冲突;
  2. 我家有一些机器不想通过VPN访问。

所以我在每台机器上创build了一个客户端证书来连接到VPN(我的情况是2),然后尝试通过iptables做一个NAT来使用VPN IP地址访问这些机器。 我设法成功连接到VPN。 这是Raspberry Pi的ifconfig的输出:

 eth0 Link encap:Ethernet HWaddr b8:27:eb:40:44:76 inet addr:192.168.1.109 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::ed10:b13d:8e57:7a64/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:208623 errors:0 dropped:10506 overruns:0 frame:0 TX packets:183838 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:181180734 (172.7 MiB) TX bytes:35462529 (33.8 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:1175 errors:0 dropped:0 overruns:0 frame:0 TX packets:1175 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:69061 (67.4 KiB) TX bytes:69061 (67.4 KiB) tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.26 PtP:10.8.0.25 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:83 errors:0 dropped:0 overruns:0 frame:0 TX packets:82 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:8940 (8.7 KiB) TX bytes:9786 (9.5 KiB) tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.34 PtP:10.8.0.33 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:18 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:912 (912.0 B) TX bytes:0 (0.0 B) 

iptables的帮助下,我想将IP地址10.8.0.26映射到192.168.1.20110.8.0.34到192.168.1.202 。 经过多次尝试后,我设法创build了下面描述的规则(使用命令iptables -t nat --list ):

 Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT all -- anywhere 10.8.0.26 to:192.168.1.201 DNAT all -- anywhere 10.8.0.34 to:192.168.1.202 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 10.8.0.0/16 192.168.1.0/24 to:192.168.1.109 

如果我把一个机器的规则,他们正常工作。 当我把他们两个(如上所述)第二个NAT不起作用(在这种情况下,从10.8.0.34到192.168.1.202)!

你认为可能的问题是什么? 我最好的猜测是,在第二种情况下,响应应该从10.8.0.34开始返回,但它可能通过错误的接口(tun0)发送。 ip route命令返回这个:

 0.0.0.0/2 via 192.168.1.1 dev eth0 0.0.0.0/1 via 10.8.0.25 dev tun0 default via 192.168.1.1 dev eth0 metric 202 10.8.0.0/24 via 10.8.0.25 dev tun0 10.8.0.25 dev tun0 proto kernel scope link src 10.8.0.26 10.8.0.33 dev tun1 proto kernel scope link src 10.8.0.34 64.0.0.0/2 via 192.168.1.1 dev eth0 81.XXX.YYY.ZZZ via 192.168.1.1 dev eth0 128.0.0.0/2 via 192.168.1.1 dev eth0 128.0.0.0/1 via 10.8.0.25 dev tun0 192.0.0.0/2 via 192.168.1.1 dev eth0 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.109 metric 202 

你认为什么是一个可能的解决scheme?

编辑1:

我在这里介绍一下networking的一个小图,以便更好地说明拓扑结构。

 /---------------------------\ | OpenVPN Server | /-----------------------------------\ | Public IP: 81.XXX.YYY.ZZZ | ----- ... ----- | Home Router Local Ip: 192.168.1.1 | | VPN IP: 10.8.0.1 | \-----------------------------------/ \---------------------------/ | | | | | | | | | | | | | | | | /--\/--\/--\/--\/--\/--\/--\/--\ |S1||S2||S3||S4||S5||S6||S7||S8| \--/\--/\--/\--/\--/\--/\--/\--/ S[*]: All machine have local ip in 192.168.1.0/255.255.255.0 S1: Server that has capabilities to run OpenVPN client (for example 10.8.0.12) S2: The Raspberry PI that runs the 2 instances of OpenVPN Client (10.8.0.26, 10.8.0.34) S3-4: The local servers where the are not capable for running the OpenVPN client (192.168.1.201, 192.168.1.202) S5-8: Local server that I don't want to be availiable in the OpenVPN network. 

编辑2:我问了ton 超级用户的问题,这是比较合适的。