前段时间发现小米11 ultra 自带的vpn 只有IKEv2/IPSec MSCHAPv2 、IKEV2/IPSec PSK、IKEv2/IPSec RSA 这几个选项了,没有PPTP 、L2TP 之类的了。于是打算研究下怎么部署ikev2服务器,我这里没有科学上网的需求,阿里云服务器也是国内的,目的是出门在外能安全访问家里的内网。
起初想在openwrt中部署,但没有找到选项.. iKuai 倒是有,但只有企业版才有此功能。所以先找其他教程,刚开始找到的是ubuntu的教程,先在本地PVE服务器的LXC容器中试验下,由于只有ipv6 还是其他原因好像没有成功。今天尝试在阿里云服务器上试试,由于阿里云我的是centos ,网上也没咋找到centos stream9的安装案例,先用以前的教程尝试,最终还是成功了。有一个发现是和ubuntu 很不一样,ubuntun是配置的/etc/ipsec.conf和/etc/ipsec.secrets 而我发现centos安装strongswan根本没这两个文件。又有教程说的centos是配置/etc/strongswan/ipsec.conf 这个文件倒是有,但我没有配置它。其实可以参照官网的,但我懒得去看了。
安装 epel 源
dnf install epel-release
更新系统
dnf update
以上这两部我没有做,dnf update 和yum update 好像一样都是要更新1.2G的文件
很多教程都是自签名证书,我就在猜想是否可以用let's encrypt免费证书,再另一篇中看到确实可以用 Let’s Encrypt 的免费证书。申请证书过程再另一篇文章中了。
首先安装strongswan
1 | dnf install strongswan |
配置路径在一篇文章中看到:在5.8版本之前,strongswan 默认使用 ipsec.conf 配置文件,之后改用 swanctl.conf 配置。网上充斥着大量老的配置方式,确很少能看到基于 swanctl 配置的。
查看/etc/strongswan/swanctl/swanctl.conf 发现最后有include conf.d/*.conf
那么显然可以在conf.d目录中新建配置
我这里新建了一个叫 /etc/strongswan/swanctl/conf.d/vpn.kecq.com.conf的文件
内容如下
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | connections { ikev2-eap-mschapv2 { version = 2 unique = never rekey_time = 0s fragmentation = yes dpd_delay = 60s send_cert = always pools = ipv4-addrs, ipv6-addrs proposals = aes256-sha256-prfsha256-modp2048, aes256gcm16-prfsha384-modp1024, default local_addrs = %any local { certs = cert.pem id = xx.xxx.com #替换为自己的域名 } remote { auth = eap-mschapv2 eap_id = %any } children { ikev2-eap-mschapv2 { local_ts = 0.0.0.0 /0 ,:: /0 rekey_time = 0s dpd_action = clear esp_proposals = aes256-sha256, aes128-sha1, default } } } } pools { ipv4-addrs { addrs = 10.10.0.0 /24 dns = 223.5.5.5,223.6.6.6,8.8.8.8,1.1.1.1 # vpn客户端ping延迟100多ms 怀疑是国外dns,结果改成国内dns还是一样... } ipv6-addrs { addrs = fec1::0 /24 dns = 2400:3200::1,2400:3200:baba::1,2001:4860:4860::8888,2606:4700:4700::1111 # vpn客户端ping延迟100多ms 怀疑是国外dns,结果改成国内dns还是一样... } } secrets { private-xxx { # xxx 任意 file = privkey.pem } eap-user1 { #user1 和下面的 user2 任意 id = user1 secret = "123456" }, eap-user2 { id = user2 secret = "123456" } } |
然后将证书软链接到strongswan目录
1 2 3 | ln -s /etc/letsencrypt/live/xx .xxx.com /cert .pem /etc/strongswan/swanctl/x509/cert .pem ln -s /etc/letsencrypt/live/xx .xxx.com /privkey .pem /etc/strongswan/swanctl/private/privkey .pem ln -s /etc/letsencrypt/live/xx .xxx.com /chain .pem /etc/strongswan/swanctl/x509ca/ca .pem |
另外一篇文章中申请的证书默认就是这些文件名。
另外有评论说let's encrypt的中间证书有变化,需要注意
Let’s Encrypt Authority X3变成 R3了,之前的教程下载 letsencrype 中间证书的代码
wget https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem -O /etc/strongswan/ipsec.d/cacerts/lets-encrypt-x3-cross-signed.pem
现在要改为
wget https://letsencrypt.org/certs/lets-encrypt-r3-cross-signed.pem -O /etc/strongswan/ipsec.d/cacerts/lets-encrypt-r3-cross-signed.pem
我这个目录是空的,也没下载
重启服务
1 | systemctl restart strongswan |
开启内核转发
编辑/etc/sysctl.conf
用下面的内容替换相同项,如果没有就新增,我这里全是新增
1 2 3 4 5 6 7 | #开启内核ipv4转发 net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 #开启内核ipv6转发 net.ipv6.conf.all.forwarding = 1 |
重新加载配置
1 | sysctl -p |
配置防火墙
编辑 /etc/sysconfig/iptables
我发现没有这个文件... 那么先安装
1 | dnf install iptables-services |
添加以下内容,注意顺序最好一致
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # sample configuration for iptables service # you can edit this manually or use system-config-firewall # please do not ask us to add additional ports/services to this default configuration *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A POSTROUTING -s 10.10.0.0 /24 -o eth0 -m policy -- dir out --pol ipsec -j ACCEPT -A POSTROUTING -s 10.10.0.0 /24 -o eth0 -j MASQUERADE COMMIT *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -i eth0 -p ah -j ACCEPT -A INPUT -i eth0 -p esp -j ACCEPT -A INPUT -i eth0 -p udp -m udp --dport 500 -j ACCEPT -A INPUT -i eth0 -p udp -m udp --dport 4500 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -i eth0 -m policy -- dir in --pol ipsec -j ACCEPT -A FORWARD -d 10.10.0.0 /24 -o eth0 -m policy -- dir out --pol ipsec -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT |
重启防火墙使规则生效,注意上面的eth0 看自己的网卡是否也是eth0
1 | systemctl restart iptables |
另外还需要在阿里云中放行500和4500端口
授权策略:允许
协议类型:自定义UDP
端口范围:500/4500
授权类型:地址段访问
授权对象:0.0.0.0/0
优先级:100
描述:随便填
到这里服务器就配置完了。后面我发现不配置防火墙只需要在阿里云中放行500和4500 也能连接,但这样应该不好吧。
Windows 客户端
我先在电脑上Windows 11 尝试,直接成功。
但在windows server 2019中无法连接报错:IKE 身份验证凭证不可接受
看到有评论说是CA证书问题,那么我先看let's encrypt 的根是否在系统受信任的根证书颁发机构
先看看let's encrypt 的root证书是啥,打开一个我的网站点击锁图标->连接安全
那么是ISRG Root X1
在windows 11中果然有这个,但windows server 2019 中果然没有,但2019网站访问img.kecq.com是没问题的。那么先导出这个根证书,上面界面的右下角有导出按钮。
然后导入到windows server 2019。 查看方法
控制面板搜证书,然后点击 管理计算机证书,看到受信任的根证书颁发机构确实没有ISRG Root x1
直接双击导出的证书导入
然后再连接,果然成功,当然自签名证书更需要导入CA了。然后发现可以一个用户名多个客户端同时用。
然后发现连接vpn后不能访问外网,查到还需要另一个设置
点击网络适配器的ipv4属性
再点击高级
取消勾选 在网络上使用默认网关和禁止基于类的路由添加。如果打上勾是所有浏览都走VPN
尝试2个客户端连接vpn 用10.10.0.x 访问对方发现复制文件速度几十兆,可能因为还在同一个内网192.168.8.x ?
安卓
发现我的小米11 ultra 有个IPSec 标识符必须填,虽然上面写的“未使用”但如果不填无法保存。随便填以下保存后还是无法连接报“失败,不安全”猜测是否同上面一个没有导入CA。
于是尝试导入上面的CA 发现还是不行。。但strongswan 官方安装客户端可以连接成功。
另外strongswan客户端需要在高级设置中设置自定义子网,不然连接vpn后无法访问外网