分类目录归档:极客

翻回墙内听音乐

简介

在美久居,有一项非常不方便的地方,就是无法使用QQ音乐,网易云音乐来听中文歌。大多数歌曲都会显示无法播放。

这些应用的服务器端,会根据你的IP地址来判断你的位置。如果发现你在境外,就会拒绝你的播放请求。

解决这个问题有很多方法,最快的方法是使用VPN软件。然而软件VPN有两个问题,一是所有流量发送到国内不方便,而且还要人为开启连接;二是类似Sonos这样的离线播放器无法使用。

我们这里介绍通过配置Ubiquiti的EdgeRouter来实现全家在线听歌,非常便利。Ubiquiti这个品牌国内不太响亮,他在网络界算是比较特立独行,以互联网直销为主,主打性价比和稳定性,是市值百亿美元上市公司。他家的Edgerouter-X,被国内网友称为弱电箱之王,京东售价不到400元。

这里介绍如何设置家里路由器,方便访问墙内的音乐网站服务。同时我们还利用家里的路由器,作为移动VPN接入点,这样即使出门在外也能随时随地听歌。

下面是这个方案的示意图。这里有4个元素,手机,家里的路由器EdgeOS,中国的虚拟路由器VyOS,以及墙内的服务器,包括DNS服务器(114.114.114.114)以及音乐服务器(music.qq.com等)。

这个方法的原理比较简单,只需要实现几个步骤:

  • 建立VPN隧道,连接墙内VyoS和家里的EdgeRouter;
  • 智能引流,区分回国流量和其他互联网流量;
  • 定向流量转发,只有访问音乐网站的流量走隧道回墙内;
  • 手机通过IPSec VPN与本地路由器(USA)建立连接,所有的流量都通过隧道(蓝色)到达本地路由器,在那里,流量根据目的(域名)进行分流:访问墙内音乐网站的流量通过另外一条VPN隧道(红色)流向远端路由器(China),在那里解密出隧道,再通过互联网(绿色)访问相应的网站;而其他流量都从本地路由器直接转发到互联网。

本地路由器在上述方案中扮演了核心角色。其中一个重要的功能是智能分流,也就是根据域名来确定流量的走向。大家可以参考下面的功能概要图。

  1. 从手机通过IPSec隧道发送过来的流量(esp1) 经过WAN口防火墙转发到IPSec功能模块(红色);解密后的流量(蓝色)再次经过DNAT替换原来的DNS查询包目标地址为路由器内loopback接口地址(10.255.0.254),通过防火墙后发送到DNSMASQ模块(绿色);
  2. 家里设备流量通过局域网直接使用DNSMASQ作为DNS代理;
  3. DNSMASQ模块发现域名与预先设置的分流域名匹配,随之向墙内的上游DNS服务器(114.114.114.114)发出查询请求(紫色);
  4. 路由转发引擎根据路由表将该查询请求(紫色)转发到IPSec加密模块;加密过的流量通过WAN口发送到墙内的远端路由器。

介绍完原理,下面我们来看看具体如何配置。


预先准备

路由设备

实现本文介绍的功能,你需要在家里使用一台EdgeRouter,国内要有一台安装好VyOS的软路由(EdgeRouter也可以)。

配置拨号VPN以及回国IPSec隧道


DNSMASQ智能分流

内部DNS服务器

我们先给loopback接口设置地址:

configure
set interfaces loopback lo address 10.255.0.254/32

然后是修改/config/ipsec.d/ipsec.conf,把loopback地址设置为下发的客户端DNS服务器地址

...
#rightdns=8.8.8.8,8.8.4.4
rightdns=10.255.0.254
...

LAN口启用DNS转发服务

要让DNSMASQ起作用,前提是主机需要使用EdgeRouter的DNS服务。因此在配置EdgeRouter的DHCP服务器时,下发的DNS配置必须指向路由器,而不是公网DNS,如114.114.114.114或者8.8.8.8。

set service dhcp-server shared-network-name LAN subnet 10.0.0.0/24 dns-server 10.255.0.254

重定向DNS请求

某些Linux客户端,不一定会使用下发的DNS,因此,需要将所有的DNS请求都重定向到loopback接口。我们知道,DNS的协议非常简单,使用UDP的端口53,查询也就一个包,因此我们可以配置如下目标地址转换来实现重定向。

set service nat rule 1000 destination port 53
set service nat rule 1000 source address 10.255.255.0/24
set service nat rule 1000 inbound-interface eth0
set service nat rule 1000 inside-address address 10.255.0.254
set service nat rule 1000 inside-address port 53
set service nat rule 1000 log disable
set service nat rule 1000 protocol udp
set service nat rule 1000 type destination

防火墙地址集

我们需要建立一个防火墙地址集,用于收藏远端DNS服务器解析出来的IP地址。

set firewall group address-group MUSIC

启用DNSMASQ

第一步是启用DNSMASQ;然后,确保DNSMASQ会监听loopback接口上收到的DNS请求;

set service dhcp-server use-dnsmasq enable

set service dns forwarding cache-size 1500
set service dns forwarding except-interface=eth0
set service dns forwarding name-server 8.8.8.8
set service dns forwarding name-server 8.8.4.4

set service dns forwarding options listen-address=10.255.0.254

注意上文中,我们启用了一条options配置,设置list-address为loopback接口IP,这一条很关键,否则DNSMASQ不会响应来自IPSec隧道的请求。

域名分析

上述智能分流要用到的一个重要数据是相关的域名列表。我们知道,一个应用往往会用到多个域名。光dropbox,就会用到十多个不同的域名。dropbox比较有良心,官网直接列出自己使用的域名,但大多数商家没有这样做,因此我们需要自己有办法来分析哪些域名会被用到。

分析域名的一个最有用的工具就是tcpdump。我们知道DNS请求有一个特定的端口号:53,因此我们只要去截获匹配端口号53以及相应主机的IP,就可以捕获所有的相关DNS请求。参考EdgeOS命令如下:

sudo tcpdump -n -i switch0 port 53 and host 10.1.8.106

下面是捕获的截屏

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on switch0, link-type EN10MB (Ethernet), capture size 262144 bytes
06:46:53.276711 IP 10.1.8.106.52757 > 10.1.8.254.53: 3794+ A? google.com. (28)
06:46:53.277244 IP 10.1.8.254.53 > 10.1.8.106.52757: 3794 1/0/0 A 216.58.194.206 (44)

我们可以看到主机10.1.8.106向路由器发送了一条域名解析申请,域名是”google.com“,以及相应的回复。

我们可以用这个办法,在打开相关应用时,监控DNS请求,再把相应的域名添加到DNSMASQ的域名清单里。

第三方dnsmasq配置文件

如果你需要处理的域名很多,或者想用第三方收集的配置文件,将文件中的server/ipset一行行地添加到配置里,将是一件很繁琐的事情。

经过分析,我们发现在EdgeOS里,所有配置为service dns forwarding options 后面的文本,都会原样不动地转换为/etc/dnsmasq.conf里的对应一行。因此,我们可以调用dnsmasq的conf-file功能,以简化配置。

具体操作时,你可以将相应的配置文件,保存在/config目录下,例如保存为/config/dnsmasq/dnsmasq-china-muisc.conf;然后添加以下配置。

set service dns forwarding options conf-file=/config/dnsmasq/dnsmasq-china-muisc.conf.conf

下面是dnsmasq-china-muisc.conf的示范文件,

ipset=/ximalaya.com/xmcdn.com/163.com/126.net/163yun.com/MUSIC
server=/ximalaya.com/xmcdn.com/163.com/126.net/163yun.com/114.114.114.114
server=/kugou.com/kuwo.cn/114.114.114.114
ipset=/hicloud.com/huawei.com/MUSIC
server=/hicloud.com/huawei.com/114.114.114.114
ipset=/kugou.com/kuwo.cn/MUSIC
server=/y.qq.com/music.qq.com/114.114.114.114
ipset=/y.qq.com/music.qq.com/MUSIC
server=/music.tcdn.qq.com/114.114.114.114
ipset=/music.tcdn.qq.com/MUSIC
server=/taobao.com/114.114.114.114
server=/alicdn.com/alimama.com/alibabadns.com/tbcache.com/114.114.114.114
server=/alibabacorp.com/114.114.114.114
ipset=/taobao.com/MUSIC
ipset=/alicdn.com/alimama.com/alibabadns.com/tbcache.com/MUSIC
ipset=/alibabacorp.com/MUSIC
server=/sonos.com/114.114.114.114
ipset=/sonos.com/MUSIC
server=/sonoschina.com/114.114.114.114
ipset=/sonoschina.com/MUSIC

路由

DNS路由

为了使用国内的域名服务器来解析音乐网站,需要配置一条静态路由,让访问墙内DNS服务器(114.114.114.114)的流量都走GRE over IPSec隧道,转发到远端路由器。

set protocols static interface-route 114.114.114.114/32 next-hop-interface tun0 distance 100

策略路由

DNSMASQ已经把墙内音乐网站的IP地址收录到地址集MUSIC里。我们使用下面的策略路由规则,让所有访问墙内音乐网站的流量走GRE隧道tun0。

set protocols static table 50 interface-route 0.0.0.0/0 next-hop-interface tun0 distance 100

set firewall modify PBR rule 2410 action modify
set firewall modify PBR rule 2410 destination group address-group MUSIC
set firewall modify PBR rule 2410 modify table 50
set firewall modify PBR rule 2410 protocol all

set interfaces eth0 firewall in modify PBR

NAT

当转发的流量通过隧道到达墙内一端后,其源地址还是这边内网的地址,因此返回的流量就需要在墙内路由器上配置相关的路由,否则会因为那边查找不到相应的路由而被丢弃。有个简单的方法可以规避配置这个路由,就是在GRE隧道出口启用masqurade做出口地址转换。这样,进入隧道的流量的源地址包都是隧道口地址,而对端是自然知道返回路由的。

set service nat rule 5100 'nat for GRE tunnel tun0'
set service nat rule 5100 outbound-interface tun0
set service nat rule 5100 type masquerade

commit;save;exit

验证

你可以使用以下命令来验证配置是否正确:

  • show ip route
  • show ip route table 50
  • show firewall modify PBR statistics
  • sudo ipset -L MUSIC
  • sudo tcpdump -n -i eth0 port 53
  • sudo tcpdump -n -i tun0 port 53

在EdgeOS/VyOS上启用DNSMASQ

简介

DNSMASQ是英国程序员Simon Kelley开发的一件多功能DHCP服务器/DNS代理工具软件。墙内的IT极客们都非常熟悉它,因为它是逃离DNS污染的必用工具。

我们这里就重点介绍以下DNS转发和地址收集功能。在DNSMASQ配置文件里,你常常可以见到类似以下两行的配置:

server=/creekside.network/1.1.1.1
ipset=/creeksidenet.com/MY_ADDR_GRP

第一项配置,”server=/creekside.network/1.1.1.1″是告诉DNSMASQ,如果遇到以”creekside.network”为后缀的域名,都转发到IP地址是1.1.1.1的DNS服务器上进行解析;

第二项配置,”ipset=/creekside.network/MY_IP_ADDR_GRP“,指示DNSMASQ,把以“creeksidenet.com“为后缀的域名解析结果,都放到名为MY_ADDR_GRP的ipset集合里。

这两项功能对于企业很有用处。比如你在公司内网安装了一个文件服务器,为了方便访问,你可以给它设置一个内部用的域名,比如file.mycompany,在路由器里添加相应的DNSMASQ设置,就可以通过这个域名来访问你内部的资源。

EdgeOS

EdgeOS已经内置了DNSMASQ功能,你可以通过以下配置来启用它。

configure
set service dhcp-server use-dnsmasq enable
set service dns forwarding cache-size 1500
set service dns forwarding name-server 8.8.8.8
set service dns forwarding name-server 8.8.4.4
set service dns forwarding except-interface pppoe0
commit;save;exit

上述配置里,首先启用DNSMASQ(缺省不启用),然后设置DNS缓存大小,以及缺省使用的上游DNS域名服务器。

最后一行是除了pppoe0端口以外,其他端口都启用DNSMASQ。另外与之相斥的配置方法是设置listen-on来指定启用的端口,未指定的端口不启用。比如以下配置就是在eth1和tun0两个端口上启用DNSMASQ。

configure
set service dns forwarding listen-on eth1
set service dns forwarding listen-on tun0
commit;save;exit

另外一个非常好用的配置是options,凡是在options里配置的内容,都会被复制到/etc/dnsmasq.conf文件里。这样我们就可以启用DNSMASQ手册里的所有功能。其典型的配置语法如下:

configure
set service dns forwarding options "conf-file=/config/dnsmasq/dnsmasq-xxxlist-ipset.conf"
commit;save;exit

这个设置指示DNSMASQ从/config/dnsmasq/dnsmasq-xxxlist-ipset.conf装载配置选项。

USG

USG装载的是比较旧版本的EdgeOS,虽然也内置了DNSMASQ功能,但是由于它是用Unifi控制器管理的,有一个限制。系统缺省配置except-interface选项,而且无法删除。这个配置是和listen-on相斥的,如果我们按照官网UniFi – USG Advanced Configuration一文中添加了这一条配置,会造成commit失败,让USG不停地重启。

我们可以配置一条options选项来规避这个问题。

configure
set interfaces loopback lo address 10.255.255.254/32
set service dns forwarding options "listen-address=10.255.255.254"
commit;save;exit

一旦启用这一条,except-interface就失效了。因此在DHCP配置DNS选项时,都把DNS指向10.255.255.254这个地址。

VyOS

不知道VyOS开发团队是如何考虑的,VyOS 1.2版本以后就没有再预装DNSMASQ了,改成PowerDNS,不支持ipset选项。

经过一番摸索,我们找到解决方法,在这里介绍给大家。

从Debian安装DNSMASQ

我们知道,VyOS 1.2.5版本是在Debian Jessie上开发的,理论上我们从Debian官方源安装的软件是可以直接拿来用的。

要从官方源安装软件,需要配置/etc/apt/sources.list文件,不幸的是,VyOS开发团队为了防止我们安装软件,搞乱系统,把soureces.list清空了。不过这难不倒我们。下面的shell命令可以完成DNSMASQ的安装。

echo "deb http://deb.debian.org/debian/ jessie main contrib non-free
deb-src http://deb.debian.org/debian/ jessie main contrib non-free" | sudo tee /etc/apt/sources.list
sudo apt update && sudo apt install dnsmasq -y

好像已经大功告成了,但是事情没有那么简单。如果你重启VyOS,你会发现新安装的DNSMASQ以及相应的缺省配置文件 /etc/dnsmasq.conf 统统不见了。这是因为VyOS开发团队为了保护系统,使用了Overlay文件系统,用户对路由器系统的任何改变都无法永久保存,这样保证了系统的稳健性。

固化DNSMASQ

我们知道,/config目录是会永久保存的,即使系统升级,这个目录也不会被触及。因此,我们可以将dnsmasq程序保存到这个目录里。

sudo mkdir -p /config/dnsmasq/bin
sudo cp /usr/sbin/dnsmasq /config/dnsmasq/bin/

然后,我们可以创建一个基础的配置文件,

echo "log-facility=/var/log/dnsmasq.log
except-interface=eth0
cache-size=15000
server=1.1.1.1	# statically configured
server=8.8.4.4	# statically configured" | sudo tee /config/dnsmasq/dnsmasq.conf

为了在系统重启时自动启动dnsmasq,我们可以修改/config/scripts/vyos-postconfig-bootup.script脚本。

echo "/config/dnsmasq/bin/dnsmasq --conf-file=/config/dnsmasq/dnsmasq.conf" | \
    sudo tee -a /config/scripts/vyos-postconfig-bootup.script

启用DNSMASQ

同理,如果要让终端使用DNSMASQ,而不是系统缺省内置的PowerDNS,我们需要做以下设置。

首先,给loopback接口配置一个IP地址,并在相应的DHCP设置中把DNS指向loopback接口地址。

configure
set interfaces loopback lo address 10.255.255.254/32
set service dhcp-server shared-network-name LAN subnet 10.0.0.0/24 dns-server 10.255.255.254
commit;save;exit

在dnsmasq配置文件中添加以下设置。

echo "listen-address=10.255.255.254" | sudo tee -a  /config/dnsmasq/dnsmasq.conf

ipset

ipset是防火墙里常用的工具。它可以收集IP地址,用于各种防火墙策略。在EdgeOS/VyOS里,每个address-group实际上就对应相应的ipset集合。

如果你想要在dnsmasq.conf里使用一个MY_ADDR_GRP的ipset,可以在配置里做如下操作。

configure
set firewall group address-group MY_ADDR_GRP
commit;save;exit

终端里常用的ipset命令有:

  • 显示ipset内容,sudo ipset list MY_ADDR_GRP
  • 查找某个IP,sudo ipset test MY_ADDR_GRP 8.8.8.8

在EdgeOS/VyOS上启用IKEv2 拨号VPN

简介

我们在上一篇文章《如何快速在CentOS7上部署VPN服务器》介绍了在CentOS 7上部署IKEv2服务器的方法。这种最常见的部署方式还是有几个缺点,

  • 所有配置都是基于各个模块的对应配置文件,分散在不同的目录下,让备份和复制变得很麻烦;
  • 很多基础的网络功能模块都需要单独安装;
  • 手动配置出错导致系统崩溃的几率比较大。

这里我们介绍在EdgeOS/VyOS下,如何部署IKEv2 Roadwarrior VPN的方案。EdgeOS/VyOS集成了非常丰富的网络功能,配置可以脚本化,非常便于部署。然而,EdgeOS/VyOS内置的命令行并不直接支持IKEv2 Roadwarrior VPN,我们需要增加一些自己制作的配置文件。这些配置文件都统一保存在/config/ipsec.d目录下,在系统升级的时候不会丢失,也便于备份。

大家需要注意的是,低端的EdgeRouter路由器,会因为内存和处理性能的限制,无法同时支持较多的IPSec连接。基于x86的VyOS平台则完全没有这个限制。

预先准备

实现本文介绍的功能,你需要一台EdgeRouter或者安装好VyOS的软路由。

在参考本文开始配置以前,我们假定大家已经按照介绍VyOS一文完成了VyOS的初始化配置。使用EdgeOS的用户,可以使用系统自带的wizard完成初始配置。

你还需要有一个公网地址,以便客户端可以用来连接。我们并不需要静态地址,动态地址也可以,只要设置好相应的动态域名即可。具体方法请参考EdgeRouter配置DDNS动态域名一文。

签发证书

服务器密钥

我们先使用专门的RSA密钥工具生成服务器用证书密钥。如果你已经根据如何在EdgeRouter上配置站点到站点IPSec VPN隧道配置过基于RSA的隧道,可以跳过这一小节。我们把生成的RFC3110格式的公钥保存到/config/ipsec.d/rsa-keys/下,后续配置站点到站点的IPSec还会用到。

generate vpn rsa-key > localhost.pub
sudo mv ./localhost.pub /config/ipsec.d/rsa-keys/

然后,我们进入root模式,并创建工作目录。

sudo -i
mkdir -p /config/ipsec.d/{cacerts,certs,private}

再把现有的localhost.key复制到密钥目录。

sudo cp /config/ipsec.d/rsa-keys/localhost.key /config/ipsec.d/private/server-key.pem

EdgeOS

接下来,我们调用PKI命令创建一个自签发的CA证书。下面参考命令中,”CN=Creekside EdgeOS CA”是证书颁发机构名称,你可以根据自己的情况修改。

pki --gen --type rsa --outform pem > /config/ipsec.d/private/ca-key.pem 

pki --self --ca --type rsa --lifetime 3650 \
  --in /config/ipsec.d/private/ca-key.pem \
  --dn "CN=Creekside EdgeOS CA" \
  --outform pem > /config/ipsec.d/cacerts/ca-cert.pem

随后,我们使用刚才签发的CA证书,再为本机签发VPN服务器证书和密钥。请注意替换相应的服务器域名信息(范例中的”vpn.creekside.network”)。

pki --pub --in /config/ipsec.d/private/server-key.pem | \
  pki --issue --cacert /config/ipsec.d/cacerts/ca-cert.pem \
  --cakey /config/ipsec.d/private/ca-key.pem \
  --dn "CN=vpn.creekside.network" \
  --san="vpn.creekside.network" \
  --flag serverAuth --flag clientAuth --flag ikeIntermediate \
  --outform pem --digest sha256 > /config/ipsec.d/certs/server-cert.pem

VyOS

VyOS没有PKI这么好用的工具。好在系统内置了openssl,我们同样可以生成PKI用的证书文件。

我们调用openssl命令创建一个自签发的CA证书。下面参考命令中,在subj选项里,C=国家,O=组织,CN=证书颁发机构名称,这三项你可以根据自己的情况修改。

openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
    -keyout /config/ipsec.d/private/ca-key.pem \
    -out /config/ipsec.d/cacerts/ca-cert.pem \
    -addext "keyUsage=Certificate Sign, CRL Sign" \
    -subj "/C=US/O=CreekSide Networks/CN=Creekside VyOS CA"

随后,我们使用服务器密钥生成服务器证书申请文件。

openssl req -new -nodes \
  -key /config/ipsec.d/private/server-key.pem \
  -out /config/ipsec.d/certs/server.csr \
  -subj /CN="vpn.creekside.network"

在签发证书前,还要创建一个用于签发的extension文件,以便包括关键的SAN以及其他参数。 [alt_names]下,可以设置多个域名,分别以DNS.1, DNS.2 …列出。

echo "authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth,clientAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = vpn.creekside.network" > /config/ipsec.d/vpn-server.ext

最后,我们使用刚才生成的CA证书,签发VPN服务器证书。

openssl x509 -req -days 3650 -CAcreateserial \
  -in /config/ipsec.d/certs/server.csr \
  -CA /config/ipsec.d/cacerts/ca-cert.pem \
  -CAkey /config/ipsec.d/private/ca-key.pem  \
  -out /config/ipsec.d/certs/server-cert.pem \
  -extfile /config/ipsec.d/vpn-server.ext

配置IPSec连接参数

连接配置

使用下面命令创建/config/ipsec.d/ipsec.conf定制化配置文件。

echo "
# customized roadwarrior configuration by Creekside Networks LLC
config setup
    uniqueids=never

ca rootca
    cacert=/config/ipsec.d/cacerts/ca-cert.pem

conn winlx
    ike=aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=aes256-sha1,aes128-sha1,3des-sha1!
    keyexchange=ikev2
    compress=no
    type=tunnel
    fragmentation=yes
    forceencaps=yes
    dpddelay=300s
    dpdtimeout=30s
    dpdaction=clear
    forceencaps=yes
    ikelifetime=4h
    lifetime=2h
    eap_identity=%identity
    auto=add
    rekey=no
    left=%any
    leftcert=/config/ipsec.d/certs/server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.255.255.1/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never

conn apple
    also=winlx
    [email protected]
" > /config/ipsec.d/ipsec.conf

说明

  • 考虑到EdgeRouter硬件加速的限制,我们只配置了有限的PN加密认证算法;如果是基于x86的VyOS平台,可以在去除IKE/ESP算法后面的”!”号,系统会自动加载所有算法;
  • 苹果产品系列,remote id(等同于上述的leftid)是必填。因此我们这里将VPN服务器的域名作为remote id。你也可以用任何字符串,只要客户端设置时与此匹配就好。

密钥及用户账户

我们使用以下命令创建用户认证文件: /config/ipsec.d/ipsec.secrets。

echo "
# roadwarrior user accounts 

 : RSA /config/ipsec.d/private/server-key.pem

bob  : EAP bobpasswd
alice : EAP alicepasswd
"  > /config/ipsec.d/ipsec.secrets

exit

如果你可以参考最后两行行用户账户的格式 (用户名 :EAP 密码),添加更多的用户。用户名可以是任意字符串,你也可以使用邮箱作为用户名。在用户名和密码之间,使用” :EAP “来分割。

最后,别忘了使用exit命令退出root模式。

设置防火墙

WAN口规则

接下来,我们进入配置状态,配置相应的防火墙策略

configure

set firewall name WAN_LOCAL rule 200 action 'accept'
set firewall name WAN_LOCAL rule 200 description 'ipsec ike'
set firewall name WAN_LOCAL rule 200 destination port '500,4500'
set firewall name WAN_LOCAL rule 200 log 'disable'
set firewall name WAN_LOCAL rule 200 protocol 'udp'

set firewall name WAN_LOCAL rule 201 action 'accept'
set firewall name WAN_LOCAL rule 201 description 'ipsec esp'
set firewall name WAN_LOCAL rule 201 log 'disable'
set firewall name WAN_LOCAL rule 201 protocol 'esp'

set firewall name WAN_LOCAL rule 210 action 'accept'
set firewall name WAN_LOCAL rule 210 description 'ipsec traffic'
set firewall name WAN_LOCAL rule 210 log 'disable'
set firewall name WAN_LOCAL rule 210 protocol 'all'
set firewall name WAN_LOCAL rule 210 ipsec match-ipsec

set firewall name WAN_IN rule 210 action 'accept'
set firewall name WAN_IN rule 210 description 'ipsec traffic'
set firewall name WAN_IN rule 210 log 'disable'
set firewall name WAN_IN rule 210 protocol 'all'
set firewall name WAN_IN rule 210 ipsec match-ipsec

commit;save;exit

由于从IPSec隧道出来的数据包被视作来自WAN口,因此,需要在WAN口的IN和LOCAL两个规则集上都配置相应的规则允许数据包接入。

TCP MSS

由于esp的带来的额外负担(overhead)大约在90字节左右,考虑到PPPoE下局域网IP包最大长度被限制在1500-8=1492字节,因此TCP MSS值最大为1500-8-90-40=1362字节。考虑到可能会有GRE over IPSec,保守一点,我们可以设置为1300字节。

VyOS

configure
set firewall options interface eth0 adjust-mss 1300
commit;save;exit

EdgeOS

configure
set firewall options mss-clamp interface-type all
set firewall options mss-clamp 1300
commit;save;exit

配置NAT-exclude

因为是定制化VPN,所以需要专门配置NAT-exclude,把发送给VPN客户端的流量排除在正常WAN的NAT之外,否则,NAT过的流量,无法进入IPSec隧道返回。由于NAT规则是顺序执行的,这条配置需要排在WAN口masquerade规则的前面。

EdgeOS

configure
edit service nat rule 5010
set description "exclude roadwarrior ipsec"
set destination address 10.255.255.0/24
set exclude
set log disable
set outbound-interface eth0
set protocol all
set type masquerade
commit;save;exit

VyOS

configure
edit nat source rule 10
set description "exclude roadwarrior ipsec"
set destination address 10.255.255.0/24
set exclude
set log disable
set outbound-interface eth0
set protocol all
set translation address masquerade
commit;save;exit

启用VPN配置

最后我们把刚才定制过的VPN文件添加到配置里。

configure
set vpn ipsec include-ipsec-conf /config/ipsec.d/ipsec.conf
set vpn ipsec include-ipsec-secrets /config/ipsec.d/ipsec.secrets
commit;save;exit

配置客户端

我们需要把自签发的证书(/config/ipsec.d/cacerts/ca-cert.pem)拷贝出来,安装在客户端上。具体配置步骤,请参考如何设置IPSec VPN客户端一文。需要注意的是,Windows不能识别后缀为pem的证书文件,请下载后重命名为ca-cert.cer。

验证

以下命令可以用于验证和调试:

  • openssl x509 -text -in <证书文件>,用于查看证书内容
  • sudo ipsec statusall,查看ipsec状态
  • sudo ipsec listcerts,显示服务器证书信息
  • sudo ipsec restart, 重启Strongswan,当你改变了上述定制文件,需要用这个命令
  • sudo swanctl –log,显示strongswan日志,对于诊断用户端连接问题非常有用。