介绍在Linux上安装StrongSwan及Roadwarrior的配置方法。

Android12开始仅支持IKEv2。当前使用的SoftEther软件目前仅支持IKEv1,准备使用支持IKEv2的StrongSwan替代SoftEther。安装SoftEther方法参照Amazon Linux服务器上安装SoftEtherVPN

根据StrongSwan官方的介绍有如下3种连接方式,在这里介绍的是Roadwarrior连接方式。

  • Host-to-Host
  • Site-to-Site
  • Roadwarrior(carol为客户端既Roadwarrior,moon为StrongSwan服务器)

测试环境及使用的软件如下,根据介绍的内容完成安装及配置后,可在Android设备使用StrongSwan客户端访问StrongSwan服务器。

  • 系统:Amazon Linux2
  • StrongSwan版本:5.9.7(2022/9/10最新版本)
  • 证书:Certbot颁发证书
  • IKE版本:V2
  • 客户端认证方式:EAP-MSCHAPv2
  • local:0.0.0.0/0 (允许访问所有资源)
  • remote: 0.0.0.0/0 (允许所有IP地址访问StrongSwan)
  • StrongSwan客户端:Android版

事前准备

开始编译安装StrongSwan之前需要安装编译用的gcc包及StrongSwan需要的包。

gcc及systemd-devel的安装

启动Amazon Linux2 EC2之后,使用yum update命令进行Package的最新化后,安装编译安装所需的gcc及charon-systemd所需的systemd-devel。

# yum update -y
# yum install gcc systemd-devel

安装gmp包

yum安装m4及libgmp-dev包之后,编译安装gmp包。

# yum install m4 libgmp-dev
# cd /tmp
# wget https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
# xz -d gmp-6.2.1.tar.xz; tar xvf gmp-6.2.1.tar
# cd gmp-6.2.1
# ./configure
# make
# make check
# make install

修改内核参数

编辑/etc/sysctl.conf文件,在末尾添加以下内容允许Packet的转发。

# vi /etc/sysctl.conf
在/etc/sysctl.conf文件添加以下内容
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

生效配置
# sysctl -p

安装StrongSwan

将SgrongSwan下载至/tmp目录后,进行解压后进行编译安装。configure参数比较多,主要有如下3个。

  • 指定配置文件的路径为/etc(也是StrongSwan官方的推荐)
  • 使用systemd启动及停止StrongSwan,而无需自己定义systemd-unit
  • 激活eap-mschapv2等认证方式(默认eap-mschapv2认证方式不会被激活)
# cd /tmp
# wget https://download.strongswan.org/strongswan-5.9.7.tar.gz
# tar zxvf strongswan-5.9.7.tar.gz; cd strongswan-5.9.7
# ./configure --prefix=/usr --sysconfdir=/etc --enable-systemd \
              --enable-swanctl --disable-charon --disable-stroke \
              --disable-scepclient --enable-eap-dynamic \
              --enable-eap-md5 --enable-eap-mschapv2
# make
# make check
# make install

配置证书

首先参照Certbot获取免费SSL/TLS证明书文档,获取StrongSwan里使用的证明书。接下来将Certbot获取到的证书,软链接到/etc/swanctl目录下的对应目录。

# ln -s /etc/letsencrypt/live/moto.sys-blog.net/cert.pem /etc/swanctl/x509/
# ln -s /etc/letsencrypt/live/moto.sys-blog.net/chain.pem /etc/swanctl/x509ca/
# ln -s /etc/letsencrypt/live/moto.sys-blog.net/privkey.pem /etc/swanctl/private/

配置StrongSwan

完成StrongSwan安装及证书的配置后,进行StrongSwan的配置。创建/etc/swanctl/conf.d/moto.sys-blog.net.conf文件,并添加以下内容。

# vi /etc/swanctl/conf.d/moto.sys-blog.net.conf

添加以下内容
connections {
    ikev2-eap-mschapv2 {
        version = 2
        rekey_time = 0s
        pools = moto-pool
        fragmentation = yes
        local_addrs = %any
        local {
        auth = pubkey
            certs = cert.pem
            # your certication domain name
            id = moto.sys-blog.net
        }
        remote {
            auth = eap-mschapv2
            eap_id = %any
        }
        children {
            ikev2-eap-mschapv2 {
                local_ts = 0.0.0.0/0
            }
        }
        send_certreq = no
    }
}

pools {
    moto-pool {
        # virtual ip address,既分配给carol客户端的IP地址段
        addrs = 10.3.1.0/24
        dns = 10.1.0.2
    }
}

secrets {
    eap-moto {
        # 定义用户名和密码
        id = moto
        secret = 6yhn7ujm
    }
}

配置NAT

使用iptables将客户端carol发送的Packet以NAT的形式发送到moon后端的服务器。

安装iptables服务
# yum install iptables-services

启动iptables服务
# systemctl start iptables

配置NAT转发规则
# iptables -t nat -A POSTROUTING -s 10.3.1.0/24 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
# iptables -t nat -A POSTROUTING -s 10.3.1.0/24 -o eth0 -j MASQUERADE 

保存NAT转发规则
# service iptables save

确认保存内容
# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.8.4 on Sat Sep 10 13:23:58 2022
*nat
:PREROUTING ACCEPT [4490:776385]
:INPUT ACCEPT [2100:94947]
:OUTPUT ACCEPT [1025:79292]
:POSTROUTING ACCEPT [1025:79292]
-A POSTROUTING -s 10.3.1.0/24 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
-A POSTROUTING -s 10.3.1.0/24 -o eth0 -j MASQUERADE
COMMIT
# Completed on Sat Sep 10 13:23:58 2022

将iptables服务设定为开机自动启动
# systemctl enable iptables

启动StrongSwan

启动StrongSwan服务
# systemctl start strongswan

确认StrongSwan服务的状态
# systemctl status strongswan
  strongswan.service - strongSwan IPsec IKEv1/IKEv2 daemon using swanctl
   Loaded: loaded (/usr/lib/systemd/system/strongswan.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-09-10 09:35:16 UTC; 4h 10min ago
 Main PID: 2920 (charon-systemd)
   Status: "charon-systemd running, strongSwan 5.9.7, Linux 5.10.130-118.517.amzn2.x86_64, x86_64"
   CGroup: /system.slice/strongswan.service
           └─2920 /usr/sbin/charon-systemd

将StrongSwan服务设定为开机自动启动
# systemctl enable strongswan

动作确认

下载StrongSwan客户(Android)

在Androdi设备访问 Android客户端下载地址 下载地址后,点击下载后进行安装。

客户端的设定

打开StrongSwan客户端后,点击「ADD VPN PROFILE」开始配置。

输入以下内容后点击「SAVE」。

  • Server:moto.sys-blog.net(或者IP地址)
  • VPN Type:IKEv2 EAP(Username/Password)
  • Username:用户名(secrets部分里设定的用户名)
  • Password:密码(secrets部分里设定的密码)

连接测试

最后一步,点击连接如下面的页面出现「Connected」表示成功连接StrongSwan服务器。

当连接失败时,可查看StrongSwan客户端的日志文件及服务器端的/var/log/messages文件里的错误内容。并使用swanctl命令查看StrongSwan服务相关信息。

小结

第一次接触StrongSwan,花费1天时间终于连接成功。例如编译安装时没有指定eap-mschapv2导致认证失败等,遇到各种错误。StrongSwan所需要的知识面比较多,有网络,系统相关操作,证书及认证相关等知识。

将StrongSwan作为网关,可轻松地实现让外部设备访问内部资源。但基于目前越来越高的安全需求,使用场景还需慎重考虑。

参考StrongSwan官网的URL如下。

Introduction to strongSwan
charon-systemd
Forwarding and Split-Tunneling
Autoconf Options
Configuration Quickstart