前段时间发现小米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
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的文件
内容如下
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目录
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
我这个目录是空的,也没下载
重启服务
systemctl restart strongswan
开启内核转发
编辑/etc/sysctl.conf
用下面的内容替换相同项,如果没有就新增,我这里全是新增
#开启内核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
重新加载配置
sysctl -p
配置防火墙
编辑 /etc/sysconfig/iptables
我发现没有这个文件... 那么先安装
dnf install iptables-services
添加以下内容,注意顺序最好一致
# 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
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后无法访问外网