记忆中のSakray

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

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

拓扑示意图如下

vpn-topology-structure.jpg



出于安全性和可管理性,根据 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 --syslog "openvpn(svrtun)" --cd /etc/openvpn --config 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 --syslog "openvpn(client)" --cd /etc/openvpn --config 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 --syslog "openvpn(svrtap)" --cd /etc/openvpn --config 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


通过OpenWrt路由器和OpenVPN实现两地局域网互联
版权声明:若无特殊注明,本文皆为《 David 》原创,转载请保留文章出处。
本文链接:通过OpenWrt路由器和OpenVPN实现两地局域网互联 http://isakray.com/post-17.html
正文到此结束

WRITTEN BY

avatar

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗

评论信息框

吃奶的力气提交吐槽中...

已有1条吐槽

匿名

2019-07-23 14:48 江苏省南京市电信
图挂了
 Windows 10 x64   Google Chrome 75.0.3770.142