本文介绍使用 StrongSwan 搭建 VPN 的过程,适合有一定 linux 基础的用户。

  • 1CPU,1G,
  • CentOS 8.3
  • StrongSwan 5.8.2

    服务器配置

    安装必备软件

    1. #以 root 用户登录
    2. #安装 epel 源
    3. dnf install epel-release
    4. #更新系统
    5. dnf update
    6. dnf install nano wget nginx certbot iptables-services crontab
    7. #nginx 开机启动
    8. systemctl enable nginx
    9. #启动 nginx
    10. systemctl restart nginx

    证书

    StrongSwan IPsec IKEv2 连接需要用到服务器证书,用于验证服务器身份。由于自签发证书不受操作系统信任,我们需要申请 Let’s Encrypt 免费证书。
    申请证书需要有域名,提前将域名解析到你的 vps 地址。

在 web 根目录创建临时目录

  1. mkdir -p /usr/share/nginx/html/.well-known/acme-challenge
  2. #--webroot 参数: 指定使用临时目录的方式. -w 参数: 指定后面 - d 域名所在的根目录, 如果一次申请多个域的, 可以附加更多 -w...-d... 这段.
  3. certbot certonly --webroot --email xxx@xxx.com -w /usr/share/nginx/html -d xx.xxx.com
  4. dnf install strongswan
  5. systemctl enable strongswan
  6. systemctl restart strongswan

配置 strongswan


在 5.8 版本之前,strongswan 默认使用 ipsec.conf 配置文件,之后改用 swanctl.conf 配置。网上充斥着大量老的配置方式,确很少能看到基于 swanctl 配置的。

编辑配置文件
vim /etc/strongswan/swanctl/conf.d/xx.xxx.com.conf
写入以下配置

  1. connections {
  2. ikev2-eap-mschapv2 {
  3. version = 2
  4. unique = never
  5. rekey_time = 0s
  6. fragmentation = yes
  7. dpd_delay = 60s
  8. send_cert = always
  9. pools = ipv4-addrs, ipv6-addrs
  10. proposals = aes256-sha256-prfsha256-modp2048, aes256gcm16-prfsha384-modp1024, default
  11. local_addrs = %any
  12. local {
  13. certs = cert.pem
  14. //xx.xxx.com 替换为上面申请证书时用的域名
  15. id = xx.xxx.com
  16. }
  17. remote {
  18. auth = eap-mschapv2
  19. eap_id = %any
  20. }
  21. children {
  22. ikev2-eap-mschapv2 {
  23. local_ts = 0.0.0.0/0,::/0
  24. rekey_time = 0s
  25. dpd_action = clear
  26. esp_proposals = aes256-sha256, aes128-sha1, default
  27. }
  28. }
  29. }
  30. }
  31. pools {
  32. ipv4-addrs {
  33. addrs = 10.10.0.0/24
  34. dns = 8.8.8.8,1.1.1.1
  35. }
  36. ipv6-addrs {
  37. addrs = fec1::0/24
  38. dns = 2001:4860:4860::8888,2606:4700:4700::1111
  39. }
  40. }
  41. secrets {
  42. //private-xxx 中的 xxx 随意,不要有符号
  43. private-xxx {
  44. file = privkey.pem
  45. }
  46. eap-user1 {
  47. //user1 替换为你想登录 vpn 使用的账号
  48. id = user1
  49. //secret = 123456 改为你的密码
  50. secret = "123456"
  51. }
  52. }

如需添加多个用户,复制 eap-user1 {…} 段粘贴到下面,按上面规则设置新的用户名和密码即可。

安装证书,创建证书软链接到 strongswan 的对应目录。

  1. ln -s /etc/letsencrypt/live/xx.xxx.com/cert.pem /etc/strongswan/swanctl/x509/cert.pem
  2. ln -s /etc/letsencrypt/live/xx.xxx.com/privkey.pem /etc/strongswan/swanctl/private/privkey.pem
  3. ln -s /etc/letsencrypt/live/xx.xxx.com/chain.pem /etc/strongswan/swanctl/x509ca/ca.pem

证书安装完成
重启服务

  1. systemctl restart strongswan

开启内核转发

用下面内容替换配置文件中同名的项,如果没有则新增。

  1. Shell
  2. #开启内核ipv4转发
  3. net.ipv4.ip_forward = 1
  4. net.ipv4.conf.all.accept_redirects = 0
  5. net.ipv4.conf.all.send_redirects = 0
  6. #开启内核ipv6转发
  7. net.ipv6.conf.all.forwarding = 1

重新加载配置
sysctl -p

配置防火墙

vim /etc/sysconfig/iptables

在合适的位置添加以下规则。高亮标示部分的内容与顺序必需与下面一样。

  1. # sample configuration for iptables service
  2. # you can edit this manually or use system-config-firewall
  3. # please do not ask us to add additional ports/services to this default configuration
  4. *nat
  5. :PREROUTING ACCEPT [0:0]
  6. :INPUT ACCEPT [0:0]
  7. :POSTROUTING ACCEPT [0:0]
  8. :OUTPUT ACCEPT [0:0]
  9. -A POSTROUTING -s 10.10.0.0/24 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
  10. -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE
  11. COMMIT
  12. *filter
  13. :INPUT ACCEPT [0:0]
  14. :FORWARD ACCEPT [0:0]
  15. :OUTPUT ACCEPT [0:0]
  16. -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  17. -A INPUT -p icmp -j ACCEPT
  18. -A INPUT -i lo -j ACCEPT
  19. -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
  20. -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
  21. -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
  22. -A INPUT -i eth0 -p ah -j ACCEPT
  23. -A INPUT -i eth0 -p esp -j ACCEPT
  24. -A INPUT -i eth0 -p udp -m udp --dport 500 -j ACCEPT
  25. -A INPUT -i eth0 -p udp -m udp --dport 4500 -j ACCEPT
  26. -A INPUT -j REJECT --reject-with icmp-host-prohibited
  27. -A FORWARD -i eth0 -m policy --dir in --pol ipsec -j ACCEPT
  28. -A FORWARD -d 10.10.0.0/24 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
  29. -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  30. COMMIT

重启防火墙,使规则生效。
systemctl restart iptables

定时更新证书

由于 Let’s Encrypt 证书只有 90 天有效期,为避免过期,需要启用自动续期。自动续期由定时任务完成。
编辑定时任务配置
写入下面红色内容,这段的意思是每天 3 点运行 certbot renew 命令给证书续期,如果续期成功则重启 nginx 和 strongswan 服务。

  1. SHELL=/bin/bash
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3. MAILTO=root
  4. # For details see man 4 crontabs
  5. # Example of job definition:
  6. # .---------------- minute (0 - 59)
  7. # | .------------- hour (0 - 23)
  8. # | | .---------- day of month (1 - 31)
  9. # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
  10. # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  11. # | | | | |
  12. # * * * * * user-name command to be executed
  13. 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 已经连上了,并且可以访问外网。

CentOS 8 使用 Strongswan (IPsec IKEv2 VPN) - 图1

IOS 客户端设置

设置 -> 通用 -> VPN -> 添加 VPN 配置
类型选 “IKEv2”
描述随意
服务器填 “xx.xxx.com”
远程 id 填 “xx.xxx.com”
用户鉴定选 “用户名”
用户名填 “user1”
密码填 “123456”
完成
点选刚添加的配置,打开 vpn 开关,如无意外可访问外网。
如果访问不了。。看下 路由设置是否正确,设置VPN使用远端路由

CentOS 8 使用 Strongswan (IPsec IKEv2 VPN) - 图2

Android 客户端设置

设置过程同上面大同小异。我的是小米手机,IPSec identifier 随便填。。
16515446.jpg
连上VPN之后,网页可以访问youbube。但是app访问不了 。
打开设置搜索google..把google基础服务关闭重新打开,完美解决 。

或者前往官网下载 最新版 apk 程序

https://blog.itnmg.net/2020/12/18/centos-8-ipsec-ikev2-vpn-strongswan/