首页 > Linux, Tomato > 通过Tomato路由器和OpenVPN实现两地局域网互联

通过Tomato路由器和OpenVPN实现两地局域网互联

2014年6月14日 LTNS     访问次数 360 发表评论 阅读评论

很久以前折腾过基于 OpenVPN实现两个 Tomato路由器内网的互联互通,在此简单地重新整理一下,拓扑示意图如下

 
出于安全性和可管理性,根据 OpenVPN官网的HOWTO,决定采用 tun方式,除了 VPN主网段(10.8.1.0/24),还设置了一个 10.8.2.0/24的 VPN网段,以便通过 iptables命令实现不同的访问权限。

 
准备条件:
1. 两个刷了 Tomato Mods,如 TomatoVPN、TomatoUSB、RAF、Shibby、Toastman等修改版固件(都有 OpenVPN功能,本文以 Shibby Mod为例),的路由器。另外,A路由器最好有 JFFS功能,这样配置起来比较方便
2. openvpn-2.0.9-gui-1.0.3版本,官网下载 点此

先在 Windows操作系统下安装 openvpn-2.0.9-gui-1.0.3,然后参考文章1或文章2,制作如下六个文件

ca.crt #Server端和 Client端通用的 CA证书
dh1024.pem #Server端用的三个文件
server.crt
server.key
client.crt #Client端(B路由器)用的二个文件
client.key

还可以继续制作 10.8.2.0/24网段的 VPN客户端用的证书和配置文件,比如

client2.crt
client2.key
client2.ovpn

注:具体使用方法和 ovpn配置文件的内容可参考 这里

接下来分别在 A路由器和 B路由器上设置好上网功能,同时 A路由器还需要启用 DDNS动态域名(比如 xxx.3322.org,以便 VPN客户端可以从外网访问到 VPN服务端)和 SSH Server,具体设置方法请自行上网搜索(比如 Shibby Mod的设置可见 这里),本文只涉及 OpenVPN相关的配置。

 
A路由器 VPN Server端的设置

进入 VPN Tunneling > OpenVPN Server配置页面

这里的自定义配置内容包括

ifconfig-pool-persist /jffs/ipp.txt     #记录客户端虚拟ip地址
ccd-exclusive     #启用 ccd功能
client-config-dir /jffs/ccd     #指定 ccd路径
# 把两条客户端网段的路由告知服务端,默认已有 10.8.1.0的所以无需再指定了
route 10.8.2.0 255.255.255.0
route 192.168.2.0 255.255.255.0
# 如下三行启用客户端相互可见功能和相关的路由
#push "route 10.8.2.0 255.255.255.0"
#push "route 192.168.2.0 255.255.255.0"
#client-to-client     #会自动推送 10.8.1.0的路由到各客户端



保存页面。

再到 Administration > Scripts 页面设置一下防火墙

iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun21 -s 10.8.1.0/24 -d 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -i tun21 -s 10.8.2.0/24 -d 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -i tun21 -s 192.168.2.0/24 -d 192.168.1.0/24 -j ACCEPT

注:tun21是我这里路由器 Advanced > Routing 页面提示的 VPN接口,请根据实际情况自行修改;
     另,这里的设置允许两个 VPN网段和 B路由器内网访问 A路由器内网,请根据实际情况自行修改访问权限

针对 client这个客户端(即,B路由器),用 Winscp软件 登录 A路由器后创建对应的配置文件 /jffs/ccd/client(文件名必须和客户端证书名一致),内容如下

ifconfig-push 10.8.1.5 10.8.1.6     #指定虚拟ip地址为 10.8.1.5
iroute 192.168.2.0 255.255.255.0    #B路由器向 VPN主网段通告自己内网的路由

注:如果 A路由器没有 JFFS功能,那就只能改用 /tmp路径了,比如通过脚本在启动时自动生成 /tmp路径下的相关文件,详请自行上网搜索。

同样的,还可以创建 /jffs/ccd/client2

ifconfig-push 10.8.2.1 10.8.2.2


 
B路由器 VPN Client端的设置

进入 VPN Tunneling > OpenVPN Client配置页面

保存页面。

再到 Administration > Scripts 页面设置一下防火墙

iptables -A FORWARD -i tun11 -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
#iptables -I INPUT -i tun11 -s 192.168.1.0/24 -j ACCEPT   #允许A路由器内网访问B路由器本身



最后重启两个路由器,B路由器作为 VPN客户端会自动登录 A路由器(VPN服务端),这样就实现了 A、B路由器内网相互之间的访问了。另外,VPN客户端 client2通过移动互联网登录 VPN服务端,可获取 10.8.2.1这个ip地址并可访问 A路由器的内网(192.168.1.0/24)。

 

补充:
如果想要让不同 VPN网段的客户端相互访问,比如允许 10.8.2.1访问 192.168.2.0/24,除了需要在 VPN Server端的配置中启用 client-to-client及相关路由(见前述内容),还需要在 B路由器的防火墙中添加

iptables -A FORWARD -i tun11 -s 10.8.2.0/24 -d 192.168.2.0/24 -j ACCEPT



然后重启两个路由器。

 
 

参考文章
1. http://forum.51nb.com/thread-338034-1-1.html
2. http://forum.51nb.com/thread-334401-1-1.html
3. http://bbs.chinaunix.net/thread-830695-1-1.html

 

分类: Linux, Tomato 标签: , , , ,
3 * 3 = (必填)