本文介绍使用 StrongSwan 搭建 VPN 的过程,适合有一定 linux 基础的用户。
- 1CPU,1G,
- CentOS 8.3
- StrongSwan 5.8.2
服务器配置
安装必备软件
#以 root 用户登录
#安装 epel 源
dnf install epel-release
#更新系统
dnf update
dnf install nano wget nginx certbot iptables-services crontab
#nginx 开机启动
systemctl enable nginx
#启动 nginx
systemctl restart nginx
证书
StrongSwan IPsec IKEv2 连接需要用到服务器证书,用于验证服务器身份。由于自签发证书不受操作系统信任,我们需要申请 Let’s Encrypt 免费证书。
申请证书需要有域名,提前将域名解析到你的 vps 地址。
在 web 根目录创建临时目录
mkdir -p /usr/share/nginx/html/.well-known/acme-challenge
#--webroot 参数: 指定使用临时目录的方式. -w 参数: 指定后面 - d 域名所在的根目录, 如果一次申请多个域的, 可以附加更多 -w...-d... 这段.
certbot certonly --webroot --email xxx@xxx.com -w /usr/share/nginx/html -d xx.xxx.com
dnf install strongswan
systemctl enable strongswan
systemctl restart strongswan
配置 strongswan
在 5.8 版本之前,strongswan 默认使用 ipsec.conf 配置文件,之后改用 swanctl.conf 配置。网上充斥着大量老的配置方式,确很少能看到基于 swanctl 配置的。
编辑配置文件vim /etc/strongswan/swanctl/conf.d/xx.xxx.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
//xx.xxx.com 替换为上面申请证书时用的域名
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 = 8.8.8.8,1.1.1.1
}
ipv6-addrs {
addrs = fec1::0/24
dns = 2001:4860:4860::8888,2606:4700:4700::1111
}
}
secrets {
//private-xxx 中的 xxx 随意,不要有符号
private-xxx {
file = privkey.pem
}
eap-user1 {
//user1 替换为你想登录 vpn 使用的账号
id = user1
//secret = “123456” 改为你的密码
secret = "123456"
}
}
如需添加多个用户,复制 eap-user1 {…} 段粘贴到下面,按上面规则设置新的用户名和密码即可。
安装证书,创建证书软链接到 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
证书安装完成
重启服务
systemctl restart strongswan
开启内核转发
用下面内容替换配置文件中同名的项,如果没有则新增。
Shell
#开启内核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
配置防火墙
vim /etc/sysconfig/iptables
在合适的位置添加以下规则。高亮标示部分的内容与顺序必需与下面一样。
# 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
重启防火墙,使规则生效。systemctl restart iptables
定时更新证书
由于 Let’s Encrypt 证书只有 90 天有效期,为避免过期,需要启用自动续期。自动续期由定时任务完成。
编辑定时任务配置
写入下面红色内容,这段的意思是每天 3 点运行 certbot renew 命令给证书续期,如果续期成功则重启 nginx 和 strongswan 服务。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
0 3 * * * root certbot renew --quiet --deploy-hook "systemctl restart nginx && systemctl restart strongswan"
加载定时任务配置,使之生效。
到此,服务端配置完成。下面设置各客户端。
客户端配置
Win10 客户端设置
开始 -> 设置 -> 网络和 Internet -> VPN -> 添加 vpn 连接
供应商选 “windows 内置”
连接名称随意
服务器名称或地址填域名 “xx.xxx.com”
vpn 类型选 “IKEv2”
登录信息的类型选 “用户名和密码”
用户名与密码填上面设置的
保存,点击 “连接”,如无意外,vpn 已经连上了,并且可以访问外网。
IOS 客户端设置
设置 -> 通用 -> VPN -> 添加 VPN 配置
类型选 “IKEv2”
描述随意
服务器填 “xx.xxx.com”
远程 id 填 “xx.xxx.com”
用户鉴定选 “用户名”
用户名填 “user1”
密码填 “123456”
完成
点选刚添加的配置,打开 vpn 开关,如无意外可访问外网。
如果访问不了。。看下 路由设置是否正确,设置VPN使用远端路由
Android 客户端设置
设置过程同上面大同小异。我的是小米手机,IPSec identifier 随便填。。
连上VPN之后,网页可以访问youbube。但是app访问不了 。
打开设置搜索google..把google基础服务关闭重新打开,完美解决 。
或者前往官网下载 最新版 apk 程序。
https://blog.itnmg.net/2020/12/18/centos-8-ipsec-ikev2-vpn-strongswan/