CentOS 8 安装请移步 《CentOS 8 使用 Strongswan IPsec IKEv2 搭梯》
本文介绍使用 StrongSwan 搭建 VPN 的过程,适合有一定 linux 基础的用户。
本文使用的服务器
- 1CPU,1G, 优惠码
- CentOS 7.5
- StrongSwan 5.6.3
StrongSwan 简介
StrongSwan 是基于 OpenSource IPsec 的 VPN 解决方案,官方网站:https://www.strongswan.org/ ,如果无法访问请使用科学上网,原因你懂的。
StrongSwan 运行于 Linux 系统上,本文使用 CentOS 7 系统。
安装StrongSwan
由于基于源码自行编译安装过于繁琐,这里只介绍使用 yum 的安装方式。
首先,配置 StrongSwan 的源,此软件已包含在 EPEL 源中,关于配置 yum 源,请参考 《CentOS 7 配置 LNMP + FTP 环境》文中的 “添加常用软件源” 部分。
安装 StrongSwan
1 |
yum install strongswan |
启用开机启动
1 |
systemctl enable strongswan |
申请 ssl 证书
StrongSwan IPsec IKEv2 连接需要用到服务器证书,用于验证服务器身份。由于自签发证书不受操作系统信任,我们需要申请 Let’s Encrypt 免费证书。
申请方式参考《CentOS 7 Nginx Let’ s Encrypt SSL 证书安装配置》, 申请的域名必须是明确的,不能用通配符证书代替。例如,vpn.xxx.com, 申请证书时,必须带上 -d vpn.xxx.com 参数。
配置 StrongSwan
安装证书
假设上一步我们申请的证书保存在 /etc/letsencrypt/live/xxx.com 中,xxx.com 是你申请证书使用的域名。
我们使用创建软连接的方式使用证书
1 2 3 4 5 6 |
cd /etc/strongswan/ipsec.d ln -s /etc/letsencrypt/live/xxx.com/fullchain.pem ./certs/fullchain.pem ln -s /etc/letsencrypt/live/xxx.com/privkey.pem ./private/privkey.pem #下载 letsencrype 中间证书, 此步对于 windows 客户端连接至关重要。 wget https://letsencrypt.org/certs/lets-encrypt-r3-cross-signed.pem -O /etc/strongswan/ipsec.d/cacerts/lets-encrypt-x3-cross-signed.pem |
证书安装完成
修改 ipsec.conf 主配置文件
1 |
nano /etc/strongswan/ipsec.conf |
删除原有内容,写入已下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
conn setup uniqueids = no conn %default compress = yes keyexchange=ike ike=aes256-sha256-sha1-modp2048-modp1024,3des-sha256-sha1-modp2048-modp1024! esp=aes256-sha256-sha1,3des-sha256-sha1! leftdns=8.8.8.8,8.8.4.4 rightdns=8.8.8.8,8.8.4.4 conn ikev2 dpdaction=clear dpddelay=60s rekey=no fragmentation=yes eap_identity=%identity left=%any leftid=这里用你申请证书时使用的域名,如“xxx.com” leftsubnet=0.0.0.0/0 leftauth=pubkey leftcert=fullchain.pem leftsendcert=always leftfirewall=yes right=%any rightid=%any rightsourceip=10.1.0.0/24 rightauth=eap-mschapv2 rightsendcert=never auto=add |
修改 charon.conf, 配置日志输出文件。
1 |
nano /etc/strongswan/strongswan.d/charon.conf |
日志不是必要项,建议只用在调试配置时使用,配置正常后注释掉 filelog 节部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
charon { filelog { charon-debug-log { path = /var/log/charon_debug.log time_format = %b %e %T default = 2 mgr = 0 net = 1 enc = 1 asn = 1 job = 1 ike_name = yes append = no flush_line = yes } } #这里是其它设置...... } |
修改 ipsec.secrets , 增加 vpn 账户。
1 |
nano /etc/strongswan/ipsec.secrets |
添加服务端证书私钥,新建用户账号。
1 2 3 4 5 |
#这是申请的证书的私钥 : RSA privkey.pem #这是用户账号,每行一个账号,格式为 [账号 %any : EAP "密码"] user1 %any : EAP "password1" user2 %any : EAP "password2" |
开启内核转发
1 |
nano /etc/sysctl.conf |
增加下面的内容
1 2 3 4 5 |
# VPN net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv6.conf.all.forwarding=1 |
重新加载规则
1 |
sysctl -p |
配置防火墙
CentOS 7 默认使用 firewalld 防火墙, 有关 firewalld 的介绍请看这里。
允许 ‘AH’ 和 ‘ESP’ 身份验证协议和加密协议通过防火墙
1 2 |
firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="esp" accept' firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="ah" accept' |
开放 ipsec 和相关端口
1 2 3 |
firewall-cmd --zone=public --permanent --add-port=500/udp firewall-cmd --zone=public --permanent --add-port=4500/udp firewall-cmd --zone=public --permanent --add-service="ipsec" |
允许 ip 伪装
1 |
firewall-cmd --zone=public --permanent --add-masquerade |
然后重新加载防火墙
1 |
firewall-cmd --reload |
如果 vps 配置较低,内存有限,可以使用 iptables 替换 firewalld 防火墙。
首先禁用 firewalld
1 2 |
systemctl stop firewalld systemctl disable firewalld |
然后安装 iptables
1 2 |
yum install iptables-services systemctl enable iptables |
配置 iptables
1 |
nano /etc/sysconfig/iptables |
在默认内容基础上,添加几条规则(下面高亮的部分)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
*nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -m policy --pol ipsec --dir out -j ACCEPT -A POSTROUTING -s 10.1.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 -i eth0 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p ah -j ACCEPT -A INPUT -p esp -j ACCEPT -A INPUT -p udp -m udp --dport 500 -j ACCEPT -A INPUT -p udp -m udp --dport 4500 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -i eth0 -m policy --pol ipsec --dir in -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT |
重新加载 iptables 规则
1 |
systemctl restart iptables |
启动 StrongSwan 服务
1 |
systemctl restart strongswan |
配置客户端
windows 10
开始->设置->网络和Internet->vpn->添加vpn连接
添加完成后点击“更改适配器选项”
在vpn连接项点右键,属性->网络
双击 ipv4 ,点击“高级”
勾选“在远程网络上使用默认网关”, 取消“自动跃点”,手动填写跃点数为“10”(当自动跃点无法上网时才设置手动跃点)。如何确定跃点数,请看下面内容。
确定后连接 vpn 即可。
确定跃点数
因为 win10 系统的问题,经常会出现vpn连接能连上,就是打不开网页的情况,这是因为“本地连接”的优先级高于“vpn”的优先级,导致所有的请求优先使用“本地连接”的dns去解析域名,由于我们国家坚持推行使用社会主义特色的dns,所以某些域名解析会返回无效或错误的ip地址,这就导致我们无法正常访问网站!跃点数就是设定优先级用的。
我们需要做的就是让 “vpn 连接” 的跃点数小于 “本地连接” 的跃点数。
断开vpn, 打开 PowerShell 窗口,输入下面命令。
1 2 |
#查看接口 Get-NetIPInterface -AddressFamily ipv4 |
第一列表示当前接口的索引号,第二列是名称,InterfaceMetric 列即接口的跃点,我的本地连接名是 WLAN, 跃点是35。
查看“本地连接”网卡的跃点数为 35,因此上一步中设置的跃点数只要小于35即可(跃点数越小优先级越高),所以我们设置为10。
IOS
“设置->VPN->添加配置”, 选 IKEv2
描述: 随便填
服务器: 填url或ip
远程ID: ipsec.conf 中的 leftid, 如 “xxx.com”
用户鉴定: 用户名
用户名: EAP 项用户名, 如 “user1”
密码: EAP 项密码, 如 “password1”
MAC
原理同 ios, 我没有 mac 做验证。
Android
需下载安装客户端程序,前往官网下载最新版 apk 程序。
你好,我使用自签名ca证书,在win10上导入ca证书可以正常连接没问题,但是换到win8上,导入ca证书连接总是提示13801:ike身份验证凭据不可接受,是什么原因导致呢,谢谢回复。
您好 我现在win链接访问上网都是正常的,ios手机链接 报错:The VPN server did not respond
这是手机访问日志 如下:
May 7 10:37:26 08[NET] received packet: from 223.104.211.191[44937] to 165.227.95.93[500] (604 bytes)
May 7 10:37:26 08[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) ]
May 7 10:37:26 08[CFG] looking for an ike config for 165.227.95.93…223.104.211.191
May 7 10:37:26 08[CFG] candidate: %any…%any, prio 24
May 7 10:37:26 08[CFG] found matching ike config: %any…%any with prio 24
May 7 10:37:26 08[IKE] 223.104.211.191 is initiating an IKE_SA
May 7 10:37:26 08[IKE] IKE_SA (unnamed)[6] state change: CREATED => CONNECTING
May 7 10:37:26 08[CFG] selecting proposal:
May 7 10:37:26 08[CFG] proposal matches
May 7 10:37:26 08[CFG] received proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536, IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024, IKE:3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
May 7 10:37:26 08[CFG] configured proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/HMAC_SHA1_96/PRF_HMAC_SHA2_256/PRF_HMAC_SHA1/MODP_2048/MODP_1024, IKE:3DES_CBC/HMAC_SHA2_256_128/HMAC_SHA1_96/PRF_HMAC_SHA2_256/PRF_HMAC_SHA1/MODP_2048/MODP_1024
May 7 10:37:26 08[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
May 7 10:37:26 08[LIB] size of DH secret exponent: 2047 bits
May 7 10:37:26 08[IKE] remote host is behind NAT
May 7 10:37:26 08[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(MULT_AUTH) ]
May 7 10:37:26 08[NET] sending packet: from 165.227.95.93[500] to 223.104.211.191[44937] (448 bytes)
May 7 10:37:29 07[NET] received packet: from 223.104.211.191[44937] to 165.227.95.93[500] (604 bytes)
May 7 10:37:29 07[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) ]
May 7 10:37:29 07[IKE] received retransmit of request with ID 0, retransmitting response
May 7 10:37:29 07[NET] sending packet: from 165.227.95.93[500] to 223.104.211.191[44937] (448 bytes)
May 7 10:37:32 09[NET] received packet: from 223.104.211.191[44937] to 165.227.95.93[500] (604 bytes)
May 7 10:37:32 09[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) ]
May 7 10:37:32 09[IKE] received retransmit of request with ID 0, retransmitting response
May 7 10:37:32 09[NET] sending packet: from 165.227.95.93[500] to 223.104.211.191[44937] (448 bytes)
May 7 10:37:35 10[NET] received packet: from 223.104.211.191[44937] to 165.227.95.93[500] (604 bytes)
May 7 10:37:35 10[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) ]
May 7 10:37:35 10[IKE] received retransmit of request with ID 0, retransmitting response
May 7 10:37:35 10[NET] sending packet: from 165.227.95.93[500] to 223.104.211.191[44937] (448 bytes)
能麻烦您帮我看看是什么错误吗? 不胜感激 谢谢
[root@centos-s-4vcpu-8gb-nyc3-01 strongswan.d]# vim charon.conf
# Options for the charon IKE daemon.
charon {
filelog {
charon-debug-log {
charon-debug-log {
path = /var/log/charon_debug.log
time_format = %b %e %T
default = 2
mgr = 0
net = 1
enc = 1
asn = 1
job = 1
ike_name = yes
append = no
flush_line = yes
}
}
}
# Accept unencrypted ID and HASH payloads in IKEv1 Main Mode.
您好 请问下我这样配置为什么没有日志呢?
是这样
filelog {
charon-debug-log {
path = /var/log/charon_debug.log
time_format = %b %e %T
default = 2
mgr = 0
net = 1
enc = 1
asn = 1
job = 1
ike_name = yes
append = no
flush_line = yes
}
}
上面多嵌套了一层 没有日志
请问下 在win可以正常链接访问,但是在ios链接不上,报错:The VPN server did not respond
请问这可能是什么原因? 谢谢
看看服务有没有启动,防火墙有没有开放。
开放的 win上可以都可以正常链接上网,就是ios链接不上
很棒,要开启防火墙转发才能上网,关闭防火墙也不行的。
直接把防火墙卸载了,开放全端口,链接上之后,还是没有网络啊,设置过内核的ipv4转发了,ipv6目前不支持,就没有设置,还差什么设置才能有网络?
内核能做NAT吗?我不是很懂linux.如果可以就没问题。