珂珂的个人博客 - 一个程序猿的个人网站

centos stream 9部署strongswan

前段时间发现小米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后无法访问外网




上一篇:个人代码全部开源

下一篇:AMD 5800H 小主机折腾记


0 评论

查看所有评论

给个评论吧