OpenVPN Site-to-Site VPN between Asus Merlin And Ubnt EdgeRouter

前言

Network Topology
Network Topology

RT-AC68U 使用PPPoE拨号上网,但是分配的IP是100.64.204.111, 看着像公网IP实际却是Carrier-grade NAT.

现在需要将RT-AC68U与一台在公网的EdgeRouter使用OpenVPN Site-to-Site连接起来,并在RT-AC68U端实现policy-based routing。
需要让RT-AC68U下的所有设备能访问EdgeRouter LAN的网络,并根据需求透过VPS访问指定互联网。

本实验参考下列文章:
Set up OpenVPN Site-to-Site on UBNT EdgeRouter Lite
EdgeRouter OpenVPN Connectivity Monitor
EdgeRouter 策略路由实现分析
EdgeRouter Policy Based Routing Using DNSMASQ IPSET

环境准备

RT-AC68U

系统:Merlin 380.68_4
公网:无公网IP
LAN:192.168.1.0/24
OpenVPN:OpenVPN端IP 10.99.100.4

EdgeRouter

系统:1.9.7+
公网:域名 edgerouter.rst.im
LAN:192.168.2.0/24
OpenVPN:端口 UDP/1194,OpenVPN端IP 10.99.100.3

OpenVPN

UDP
共享密钥模式

OpenVPN Site-to-Site VPN

EdgeRouter端OpenVPN配置

操作模式下生成密钥

配置模式下参考如下配置

RT-AC68U端配置

路由界面,“高级设置”=>“VPN”=>“VPN客户端”=>“OpenVPN”。

Client control

Select client instance:选择一个客户端配置,这里选了Client 1

Basic Settings

Description描述,随便填
Start with WAN:选“”,这样PPPoE拨号成功后会自动连VPN。
接口类型TUN
通信协议UDP
Server Address and Port:地址 edgerouter.rst.im,端口 1194
防火墙自动/Automatic
验证模式Static Key,此处点击右侧“Content modification of Keys & Certificates.”,将 /config/auth/openvpn-test-secret 里的内容,贴进“Static Key”去,仅粘贴内容 —– BEGIN xxx —– / —– END xxx —– 。(包括这两行线)
Auth digestDefault
Create NAT on tunnel
Local/remote endpoint addresses:第一个框本地IP 10.99.100.4,第二个框EdgeRouter的OpenVPN端IP 10.99.100.3。

Advanced Settings

压缩Disabled
其他默认。

自定义设置

Policy-Based Routing on Asus Merlin

从EdgeRouter端考虑,需要将从OpenVPN Tunnel过来的流量自动筛选转发到VPS对应的设备,所以上述的EdgeRouter的配置会变成

RT-AC68U端,需要配置PBR规则,需要对OpenVPN Tunnel的设备开启NAT(虽然上边勾选了,但是实测有问题,所以下边的具体配置会写命令解决)。

在RT-AC68U的OpenVPN配置页面,“Redirect Internet traffic”设置为“Policy Rules(strict)”,
添加两条PBR规则:

完成这两项,路由的ip rules里就会多两条:

参考之前的文章,EdgeRouter 策略路由实现分析,我需要做的是,增加一条ip rule,把iptables标记过的流量直接转发到ovpnc1,再用iptables应用规则去标记LAN的请求

基本命令如下:

直接使用 iptables 调用 ipset 会出现如下错误:
iptables: No chain/target/match by that name.
需要先 modprobe xt_set。

由于iptables命令每次重启都要执行,所以需要开启RT-AC68U的JFFS,并在“系统管理”,“系统设置”里,开启“Enable JFFS custom scripts and configs”。开启之后的另外一个好处是可以自动增加额外的dnsmasq配置,这部分参考Setup WPAD on Asus Merlin

开启ssh后,ssh到RT-AC68U

编辑内容

脚本不解释了。
有个坑点,openvpn的up/down scripts使用同一个的时候,代码里无法判定是up还是down,而且每次启动可能都会有1~2次init,停止的时候可能一个有init一个没有。所以最后只能去测试远端IP能否ping通来判定是up还是down。为了避免重复添加规则,所有add的方法都是先检查了规则是否存在再进行添加操作的。

接下来配置dnsmasq。

参考下边的文件内容,创建自己的配置文件

执行 service restart_dnsmasq 重启dnsmasq。

其他

有个问题没解决,从EdgeRouter端暂时还没能连上AC68U的ssh/web console,理论上加iptables转发就行了。

OpenVPN Site-to-Site VPN between Asus Merlin And Ubnt EdgeRouter by @sskaje: https://sskaje.me/2017/10/openvpn-site-to-site-vpn-asus-merlin-ubnt-edgerouter/