我现在已经对这个主题做了相当多的研究,但到目前为止还没有找到可行的解决方案。有很多问题,其中大多数与我的问题不太相符,而且答案很少。所以,我希望在这里得到一些帮助。以下是设置:
我的本地网络使用地址范围10.1.0.0/24其中 10.1.0.1 是路由器,10.1.0.2 是我尝试从网络外部访问的机器。
路由器运行 dd-wrt 固件,并配置为 OpenVPN 服务器,其 VPN 地址范围为10.2.0.0/24。在服务器配置中,我尝试通过以下方式将路由推送到我的本地网络:
push "route 10.1.0.0 255.255.255.0"
我可以从工作中的客户端建立有效的 OpenVPN 连接,并且路由得到正确推送:
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default ds9-ds10.gate.u 0.0.0.0 UG 302 0 0 wlan0
10.1.0.0 10.2.0.1 255.255.255.0 UG 0 0 0 tun0
10.2.0.0 * 255.255.255.0 U 0 0 0 tun0
10.20.4.0 * 255.255.254.0 U 0 0 0 wlan0
10.20.4.0 * 255.255.254.0 U 302 0 0 wlan0
我还可以通过 ssh 进入我的路由器,或者使用它的 Web 界面,使用它的常规 ip 10.1.0.1(只有在推送路由时才有可能)或其 vpn ip 10.2.0.1。
路由器上启用了IP转发:
# cat /proc/sys/net/ipv4/ip_forward
1
我认为我现在应该能够使用它的 LAN IP 10.1.0.2 通过 ssh 连接到另一台机器(该机器配置为接受来自 10.1.0.0/24 和 10.2.0.0./24 地址的连接),因为现在所有到 10.1.0.0/24 的连接都应该通过 10.2.0.1 进行路由,但我仍然无法建立连接。
我看不到设置中缺少的位,可能是在路由器的某个地方。为什么我连接到 10.1.0.1(本地地址范围)的请求有效,但连接到路由器的机器却无法连接到 10.1.0.2?
编辑:
我不知道@MariusMatutiae 指出的问题。我读过几次关于需要静态路由的文章,但一直不清楚在哪里添加什么,我不得不承认我对细节的了解非常有限。不过,他在回复中的澄清非常有道理。按照他的建议,我修改了路由器上的路由表,现在包括
10.2.0.0 10.2.0.1 255.255.255.0 UG 0 0 0 tun2
得出下表:
root@DD-WRT:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 188-193-191-254 0.0.0.0 UG 0 0 0 vlan2
10.1.0.0 * 255.255.255.0 U 0 0 0 br0
10.2.0.0 10.2.0.1 255.255.255.0 UG 0 0 0 tun2
10.2.0.0 * 255.255.255.0 U 0 0 0 tun2
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
169.254.0.0 * 255.255.0.0 U 0 0 0 br0
188.193.184.0 * 255.255.248.0 U 0 0 0 vlan2
iptables 的 FORWARD 链包含以下行
pkts bytes target prot opt in out source destination
0 0 ACCEPT 0 -- tun2 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- * tun2 0.0.0.0/0 0.0.0.0/0
高于任何 DROP 或 REJECTtun2作为 OpenVPN 服务器的 tun 设备。我认为应该没问题。
但问题仍未解决。到底出了什么问题?
答案1
您认为该声明
push "route 10.1.0.0 255.255.255.0"
就路由而言,这是故事的结尾,但事实并非如此。这个语句所做的只是让客户端知道 VPN 服务器后面有一个私有 LAN,即 10.1.0.0/24。但是,VPN 服务器本身并不知道 VPN 网络 10.2.0.0/24 的存在,因为没有人指示它向其表中添加合适的路由。这就是您遇到问题的原因:事实上,您的客户端能连接到 LAN 的成员,但从未收到回复,因为路由器不知道如何将其回复路由回 VPN 客户端。
解决这个问题的方法是将此命令添加到路由器,
route add -net 10.2.0.0/24 gw 10.2.0.1
或者
route add -net 10.2.0.0/24 dev tun0
或者(在测试这是您唯一的问题之后)将此语句添加到您的 server.conf 文件中:
route 10.2.0.0 255.255.255.0
您需要此声明以及声明
push "route 10.1.0.0 255.255.255.0"
您可能会惊讶于路由器不知道返回 VPN 客户端的路由,因为您认为路由器和 VPN 服务器是同一台机器,但这正是路由器不知道服务器在做什么的原因:一般情况是两者由两台不同的机器托管。在这种情况下,您不是希望更改 VPN 服务器的路由表,因为这意味着 LAN 上的其他 PC 将不知道如何访问 VPN 客户端,而您必须通过更改所有 PC 的所有路由表来解决这个问题,以告诉它们 VPN 的网关是 VPN 服务器,而不是路由器。相反,在这种情况下,您真正希望做的是不是改变 VPN 服务器的路由表,并更改路由器的路由表,这样您只需执行一次此操作。