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

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

首页 » 技术心得 » 2016年3月22日凌晨

A

通过 OpenVPN OpenWrt 路由器实现两地局域网互联。

拓扑示意图如下

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

准备条件:

1. 路由器刷 OpenWrt BB 14.07固件,或者 Gargoyle(OpenWrt 的web前端之一)1.7.x固件;

2. OpenVPN相关证书的制作请参考 OpenWrt Wiki;另外,通过 OpenWrt trunk 里的 luci-app-openvpn程序,或者 Gargoyle固件 的 openvpn web管理插件也可以制作相关证书;

3. 分别在 A路由器和 B路由器上设置好上网功能,同时 A路由器还需要启用 DDNS动态域名(比如 xxx.3322.org,以便接受来自外网的 VPN客户端的访问)和 SSH Server,详请自行网上搜索,本文只涉及 OpenVPN相关的配置。

A路由器 VPN Server端的设置

通过比如 Putty 软件登录路由器后,安装 openvpn

opkg update

opkg install openvpn-openssl openvpn-easy-rsa

/etc/init.d/openvpn enable #设置随路由器开机自启动

ln -s /usr/sbin/openvpn /etc/openvpn/ovpnsvrtun #创建一个软链接文件

虽然 OpenWrt trunk 版本里有 luci-app-openvpn,Gargoyle固件 也提供了 openvpn的web管理插件,但试用下来感觉都不是很方便(比如GUI界面可供选择的参数不够全,可自定义的配置只能一个,等等),于是决定还是手工配置。

通过比如 WinSCP 软件登录路由器,新建一个服务端配置文件,比如 /etc/openvpn/svrtun.conf

daemon

dev tun21 #tun设备编号可自定义

port 1194 #端口号可自定义

proto udp #建议使用udp协议

server 10.8.1.0 255.255.255.0 #VPN主网段

comp-lzo yes

keepalive 10 60

verb 3

ca /etc/openvpn/ca.crt #相关证书需上传至相应的目录下

dh /etc/openvpn/dh1024.pem cert /etc/openvpn/server.crt key /etc/openvpn/server.key ifconfig-pool-persist /etc/openvpn/ipp.txt #记录客户端虚拟ip地址

ccd-exclusive

client-config-dir /etc/openvpn/ccd #客户配置文件目录

status-version 2

status status

# Custom Configuration

push "route 192.168.1.0 255.255.255.0" #把A路由器内网的路由推送给VPN客户端

# 把两条客户端网段的路由告知服务端,默认已有 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

注:各项参数的说明详请见 OpenVPN官网

然后在自定义防火墙文件 /etc/firewall.user 中添加如下四行内容

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

#如果OpenWrt/Gargoyle固件默认禁止了跨网段访问,则需要增加一行

#iptables -A FORWARD -o tun21 -s 192.168.1.0/24 -j ACCEPT

注:这里的设置允许两个 VPN网段和 B路由器内网访问 A路由器内网,请根据实际情况自行修改访问权限。另,修改完成后须执行命令 /etc/init.d/firewall restart 以重启防火墙

针对 client这个客户端(即,B路由器),还要创建对应的配置文件 /etc/openvpn/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主网段通告自己内网的路由

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

ifconfig-push 10.8.2.1 10.8.2.2

最后修改启动脚本 /etc/init.d/openvpn 末尾的 start_service函数的内容

start_service() {

#    config_load 'openvpn'

#    config_foreach start_instance 'openvpn'

#注释掉如上两行并添加如下的一行

/etc/openvpn/ovpnsvrtun svrtun.conf &

}

注:修改完成后须执行命令 /etc/init.d/openvpn start 以启动 openvpn服务

B路由器 VPN Client端的设置

同样需要安装 openvpn

opkg update

opkg install openvpn-openssl openvpn-easy-rsa

/etc/init.d/openvpn enable

ln -s /usr/sbin/openvpn /etc/openvpn/ovpnclient

新建一个客户端配置文件,比如 /etc/openvpn/client.conf,内容如下

daemon

client #这个不能改,不是client客户端证书名

dev tun11 proto udp

remote xxx.3322.org 1194 resolv-retry 30

nobind

persist-key

persist-tun

comp-lzo yes

verb 3

ca /etc/openvpn/ca.crt #相关证书需上传至相应的目录下

cert /etc/openvpn/client.crt key /etc/openvpn/client.key status-version 2

status status

然后在自定义防火墙文件 /etc/firewall.user 中添加如下二行内容

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路由器本身

#如果OpenWrt/Gargoyle固件默认禁止了跨网段访问,则需要增加一行

#iptables -A FORWARD -o tun11 -s 192.168.2.0/24 -j ACCEPT

注:修改完成后须执行命令 /etc/init.d/firewall restart 以重启防火墙

还要修改启动脚本 /etc/init.d/openvpn 末尾的 start_service函数的内容

start_service() {

#    config_load 'openvpn'

#    config_foreach start_instance 'openvpn'

/etc/openvpn/ovpnclient client.conf &

}

注:修改完成后须执行命令 /etc/init.d/openvpn start 以启动 openvpn服务

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

顺便提一下,通过 OpenVPN 还可以让 Tomato路由器和 OpenWrt路由器互联,Tomato的相关设置(无论是配置为服务端还是客户端)可参考 前文

补充1:

如果想要让不同 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

然后重启两个路由器即可。

补充2:

参考 TomatoVPN作者的 脚本,可分别在 A路由器和 B路由器上新建一个检查用脚本(防止 openvpn进程意外被杀),比如 /root/ovpnup.sh

#!/bin/sh

killall -0 ovpn$1 2> /dev/null

if [ $? != 0 ]

then

    logger \"$0: Starting ovpn$1\"

    /etc/openvpn/ovpn$1 –syslog "openvpn($1)" –cd /etc/openvpn –config $1.conf &

else

    logger \"$0: ovpn$1 already running: $(pidof ovpn$1)\"

fi

注:新建后需执行 chmod +x /root/ovpnup.sh,以添加可执行属性。

然后把该脚本添加到定时任务 /etc/crontabs/root

4 */2 * * * /root/ovpnup.sh svrtun #每两小时检查一次,针对A路由器

#针对B路由器则需改成如下一行

4 */2 * * * /root/ovpnup.sh client

补充3:

可以添加更多的 VPN配置,比如在 A路由器上新建一个 bridge模式(相比tun设备的route模式,安全性差一点但更方便) VPN Server的配置文件 /etc/openvpn/svrtap.conf

daemon

dev tap11 #需在A路由器的LAN网络设置里绑定 tap11设备,以使桥接生效

port 1194

proto tcp

server-bridge 192.168.1.1 255.255.255.0 192.168.1.101 192.168.1.105 #和A路由器内网桥接,ip地址池范围101~105要避免跟A路由器的DHCP Server冲突

comp-lzo yes

keepalive 10 60

verb 3

ca /etc/openvpn/ca.crt

dh /etc/openvpn/dh.pem

cert /etc/openvpn/svr.crt

key /etc/openvpn/svr.key

ifconfig-pool-persist /etc/openvpn/ipp.txt

ccd-exclusive

client-config-dir /etc/openvpn/ccd

client-to-client

status-version 2

status status

# Custom Configuration

注:对应的 VPN客户端(比如安装了 openvpn-2.0.9-gui-1.0.3 的WinXP笔记本电脑)可用如下配置

client

dev tap

proto tcp

remote xxx.3322.org 1194

ca ca.crt

cert client2.crt key client2.key resolv-retry infinite

nobind

mute-replay-warnings

comp-lzo

verb 4

然后在 A路由器上创建一个软链接文件

ln -s /usr/sbin/openvpn /etc/openvpn/ovpnsvrtap

修改启动脚本 /etc/init.d/openvpn 末尾的 start_service函数的内容

start_service() {

#    config_load 'openvpn'

#    config_foreach start_instance 'openvpn'

/etc/openvpn/ovpnsvrtun –syslog "openvpn(svrtun)" –cd /etc/openvpn –config svrtun.conf &

/etc/openvpn/ovpnsvrtap svrtap.conf &

}

还要在 A路由器的防火墙里添加一行

iptables -I INPUT 1 -p tcp –dport 1194 -j ACCEPT

最后在定时任务 /etc/crontabs/root 中添加一行

5 */2 * * * /root/ovpnup.sh svrtap

完成后重启路由器A,至此,安装了 openvpn-2.0.9-gui-1.0.3 的WinXP笔记本电脑就可以登录VPN服务端,获取地址 192.168.1.101并可访问 A路由器的内网了。

参考文章

http://bbs.chinaunix.net/thread-830695-1-1.html

标签:

版权声明:若无特殊注明,本文皆为《 David 》原创,转载请保留文章出处。

本文链接:通过OpenWrt路由器和OpenVPN实现两地局域网互联 http://isakray.com/post-17.html

正文到此结束

版权所有 未经授权不得转载
球盖网 » 通过OpenWrt路由器和OpenVPN实现两地局域网互联

发表评论

提供最优质的资源集合

关于本站 联系我们