我在美国的家庭网络位于运行其 DD-WRT 版本的 Buffalo 路由器 (G300NH) 后面。我使用内置的 PPTP VPN 客户端连接到英国的 VPN 提供商。我通过 VPN 路由某些流量(因此它有一个英国源地址,出于各种完全合法的原因),这是我按照 DD-WRT 文档中的说明和我的 VPN 提供商自己的说明实现的。我在防火墙脚本中放置了两个这样的命令:
route add -net xxx.xxx.0.0 netmask 255.255.0.0 dev ppp0
route add -net yyy.yyy.0.0 netmask 255.255.0.0 dev ppp0
我没有添加任何 iptables 规则,因为我的设置似乎不需要它们。它运行良好。xxx
子网的流量通过 VPN 传输,其他所有流量都通过我的 ISP 自己的管道传输。
问题出现在 VPN 断线时,这种情况偶尔会发生。DD-WRT 可以很好地自动重新连接,但每次发生这种情况时,路由都会被破坏。
如何自动完成重新建立路由的过程?我考虑过静态路由,但 VPN 连接的 IP 地址是动态分配的(这就是我使用的原因dev ppp0
)。
答案1
该sed
命令运行正常,只是 dd-wrt 直到 pptpd 守护进程启动后才创建 ip-up 文件。因此,我在启动脚本中添加了延迟以提供时间,并在添加路由后执行 ip-up 命令。这应该可以帮你解决问题。
这是路由器的启动命令:
sleep 40
sed -i '' -e 's|exit 0|route add -net xxx.xxx.0.0 netmask 255.255.0.0 dev ppp0\nroute add -net yyy.yyy.0.0 netmask 255.255.0.0 dev ppp0\n&\n|' /tmp/pptpd_client/ip-up
/tmp/pptpd_client/ip-up
您也可以这样做:
sleep 40
sed -i '' -e 's|exit 0|route add -net xxx.xxx.0.0 netmask 255.255.0.0 dev ppp0\n&\n|' /tmp/pptpd_client/ip-up
sed -i '' -e 's|exit 0|route add -net xxx.xxx.0.0 netmask 255.255.0.0 dev ppp0\n&\n|' /tmp/pptpd_client/ip-up
sed -i '' -e 's|exit 0|route add -net xxx.xxx.0.0 netmask 255.255.0.0 dev ppp0\n&\n|' /tmp/pptpd_client/ip-up
/tmp/pptpd_client/ip-up
根据需要添加尽可能多的路线。&
替换exit 0
。
答案2
dd-wrt 实现的问题在于 pptp 客户端正确设置了路由表,但服务器却没有。通常,您可以从客户端连接,但不能从服务器连接。每次建立连接时,这将修复服务器端的路由表,并可在重新启动和重新连接后正常工作。
从作为 pptp 服务器运行的 DD-WRT,单击“管理”选项卡,然后单击“命令”选项卡,然后输入以下内容:
/bin/sh -c 'echo "ip route add XX.XX.XX.0/24 dev ppp0" >> /tmp/pptpd/ip-up'
然后将其保存为“启动脚本”以使其永久生效。当然,将 XX 更改为客户端网络的子网。如果您有多个客户端子网,则只需添加上述多行,并为每个客户端网络添加正确的子网。
答案3
您可能希望将路由命令放入在链接启动时调用的 ip-up 脚本中。我不确定在 dd-wrt 中将它们放在哪里;我已经切换到 openwrt,但这里有一个可能有帮助的链接?
答案4
在某些 ddwrt 路由器上,您无法轻松地编辑或添加文件。
我使用的所有 4 个 ddwrt 路由器在运行 pptp 客户端时都会生成这些文件,因此无法更改或添加文件。
这是一个似乎适用于大多数路由器的解决方法http://stadar.org/content/ddwrt-pptp-client-add-routes-after-connection