我已经成功创建了一个 OpenVPN 网络(服务器托管在虚拟专用服务器) 10.8.0.0/255.255.0.0 满足我家的需求,支持OpenVPN客户端的客户端都可以通过服务器进行连接,并且能够成功进行相互连接。
还有一些机器(如 NAS)不支持 OpenVPN,但我想通过 VPN 网络与它们连接。我的解决方案是使用一台小型机器(如 Raspberry Pi [IP地址:192.168.1.109])作为 OpenVPN 客户端并正确地将数据包转发到目标机器,但我不喜欢所提出的解决方案这里因为:
- 我不希望不同的本地网络(和我的家)之间发生子网冲突;
- 我家里有些机器不想通过 VPN 访问。
因此,我为每台要连接到 VPN 的机器创建了 1 个客户端证书(我的情况是 2 个),并尝试通过使用 VPN IP 地址进行 NAT 来访问这些机器。我已成功连接到 VPN。以下是Raspberry Pi 的iptables
输出: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 P-t-P: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 P-t-P: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
我想要映射 IP10.8.0.26 至 192.168.1.201和10.8.0.34 至 192.168.1.202经过多次尝试,我成功创建了下面描述的规则(使用命令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
您认为可能的解决方案是什么?
编辑1:
为了更好地阐明拓扑结构,我在这里展示了网络的一个小图。
/---------------------------\
| 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:我已经问过这个问题很多次了超级用户,这更合适。