难在配置文件,网上参照了很多版本才解决,要知道其原理。
在升级strongswan之后 按官方文档推荐将配置文件迁移至swanctl 更新在文末
热点问题
Q: 为何我的水果手机跑着这么稳定的iOS系统还会无故掉线,据网上人们统计是8分钟左右。
A:参考了一个网上的帖子,改加密方式即可
原来的:ike = aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
改为:ike = aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048!
Q: Windows为何连不上?
A: 强壮大鹅官网 解释了这个问题,因windows不支持modp2048,可能需要迁就一下,建议升级至swanctl后再为windows连接单独写一条配置,和"ios需要mod2048"分开
https://docs.strongswan.org/docs/5.9/interop/windowsClients.html
Q: 为何strongswan前台可以运行,连接正常,使用service strongswan start就不能运行了呢。。
A: 参考后文Part3 SELinux问题
Q: linux和Unix配置一样吗?官方说推荐换到swanctl样例有没有?
A: 原理和Strongswan配置一样,根据不同发行版修改防火墙即可
FreeBSD防火墙配置举例见此: https://blog.vrqq.org/archives/847/
Part0 系统信息
Server端:用的系统自带源直接dnf install strongswan
redhat-release: Fedora release 24 (Twenty Four)
strongswan version:
Linux strongSwan U5.4.0/K4.5.5-300.fc24.x86_64
Institute for Internet Technologies and Applications
University of Applied Sciences Rapperswil, Switzerland
See 'strongswan --copyright' for copyright information.
手机端:
ios8 ios9 均有测试
现在的环境是 iphone5 ios 9.3.3(13G34)
电脑端:
白苹果 Mac OS X EI Caption Version 10.11.6
Part1 原理
先说证书,我们至少需要两个证书:一是CA证书(ca.cert就是那些收费的例如VeriSign啊),二是加密连接时候用的证书(server.cert)。
CA证书当然用一个自己生成的啦。。。
证书的关系可以网上查查,整个加密流程和https有点相像,首先客户端和服务器均持有CA证书ca.cert。
然后连接过程:
- 就是用户端持有可信任的ca证书(当然是公钥啦),并且添加到System中让系统Trust一下。
- 客户端发起ikeV2连接以后服务器传来server.cert,客户端用ca来验证服务器发来的server.cert公钥,如果验证结果是合理又合法的,那么我们认为这个server可信。
- 于此同时,客户端提交自己的用户名&密码给服务器。
- 验证结束,我猜交换数据使用server.cert加密,服务器拿到密文使用server.key(私钥)解密。但是事实上不是这样的,因为vpn运行过程中还有rekey过程会不断更换加密key。。。
Part2 配置文件
更新:letsEncrypt生成ikeV2证书方法,巨简单无比!(本地没有跑httpd的,可以把--manual换成--standalone,自动启一个httpd)
原来的有个错误 /etc/letsencrypt/live/vpn.test.com/ 文件夹下面全是link快捷方式!!
需要去/etc/letsencrypt/archive/vpn.test.com复制
#!/bin/sh
certbot certonly --manual -d vpn.test.com
cd /etc/letsencrypt/archive/vpn.test.com
cp fullchain.pem /etc/strongswan/ipsec.d/certs/
chcon -u system_u /etc/strongswan/ipsec.d/certs/fullchain.pem
cp privkey.pem /etc/strongswan/ipsec.d/private/
chcon -u system_u /etc/strongswan/ipsec.d/private/privkey.pem
cp chain.pem /etc/strongswan/ipsec.d/cacerts/
chcon -u system_u /etc/strongswan/ipsec.d/cacerts/chain.pem
更新:可以使用letsEncrypt生成,避免电脑端还要装证书。。https://wuruxu.blogspot.com/2016/12/letsencrypt-strongswan-ikev2-vpn.html
先看生成证书命令:样例域名vpn.test.com,样例服务器ip 1.2.3.4
生成Root CA证书,用来签名所有
strongswan pki --gen --outform pem > ca.pem
strongswan pki --self --in ca.pem --dn "C=CN, O=Sample Organization, CN=Sample CA" --ca --lifetime 3650 --outform pem >ca.cert.pem
生成Server端证书,连接时候发给客户端,客户端使用CA解开server.cert.pem,使用它加密连接
strongswan pki --gen --outform pem > server.pem
strongswan pki --pub --in server.pem | strongswan pki --issue --lifetime 600 --cacert ca.cert.pem \
--cakey ca.pem --dn "C=CN, O=Sample, CN=vpn.test.com" \
--san="1.2.3.4" --san="vpn.test.com" --flag serverAuth --flag ikeIntermediate \
--outform pem > server.cert.pem
再看ipsec.conf:
config setup
uniqueids=never
conn %default
keyexchange=ike
left=%any
leftsubnet=0.0.0.0/0
right=%any
conn IKE-BASE
leftca=ca.cert.pem
leftcert=server.cert.pem
rightsourceip=10.0.1.0/24
conn IKEv2-EAP
also=IKE-BASE
keyexchange=ikev2
ike = aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
esp = aes256-sha256,3des-sha1,aes256-sha1!
rekey=no
leftid=vultr.vrqq.org
leftauth=pubkey
leftsendcert=always
right=%any
rightfirewall=yes
rightsourceip=10.0.1.0/24
rightsendcert=never
rightauth=eap-mschapv2
eap_identity=%any
dpdaction=clear
fragmentation=yes
auto=add
最后看strongswan.conf
#strongswan.conf-strongSwanconfigurationfile
#
#Refertothestrongswan.conf(5)manpagefordetails
#
#Configurationchangesshouldbemadeintheincludedfiles
charon{
load_modular=yes
duplicheck.enable=no
compress=yes
plugins {
include strongswan.d/charon/*.conf
}
dns1=8.8.8.8
dns2=8.8.4.4
nbns1=8.8.8.8
nbns2=8.8.4.4
}
include strongswan.d/*.conf
顺便看一下logger配置charon-logging.conf
charon {
# Section to define file loggers, see LOGGER CONFIGURATION in
# strongswan.conf(5).
filelog {
# <filename> is the full path to the log file.
/var/log/strongswan-charon.log {
# If this option is enabled log entries are appended to the existing file.
append = no
# Default loglevel.
default = 2
# Enabling this option disables block buffering and enables line buffering.
flush_line = yes
# Prefix each log entry with the connection name and a unique
# numerical identifier for each IKE_SA.
ike_name = yes
# Prefix each log entry with a timestamp. The option accepts a
# format string as passed to strftime(3).
time_format = %b %e %T
}
}
# Section to define syslog loggers, see LOGGER CONFIGURATION in strongswan.conf(5).
syslog {
}
}
Part3 防火墙或者iptables问题 && SELinux问题
这个首先,我们说SELinux是个好东西,我们不能关他!
然后我觉得firewall也挺好用的吧。。当然iptables也可以:
#Only ipsec转发规则
#参考http://www.ducea.com/2006/08/01/how-to-enable-ip-forwarding-in-linux/
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o ens3 -j MASQUERADE
#firewalld配置 see also:
#https://raymii.org/s/tutorials/IPSEC_vpn_with_CentOS_7.html#Firewall_&_Packet_Routing
firewall-cmd --permanent --add-rich-rule='rule protocol value="esp" accept' # ESP (the encrypted data packets)
firewall-cmd --permanent --add-rich-rule='rule protocol value="ah" accept' # AH (authenticated headers)
firewall-cmd --permanent --add-port=500/udp #IKE (security associations)
firewall-cmd --permanent --add-port=4500/udp # IKE NAT Traversal (IPsec between natted devices)
firewall-cmd --permanent --add-service="ipsec"
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
firewall-cmd --list-all
SELinux问题,参考这个链接给各种文件赋SELinux的属性即可
http://linuxmanpages.net/manpages/fedora21/man8/ipsec_selinux.8.html
版本有点老。。自行google。。
SELinux主要使用这么几个命令
查看权限ls -laZ 这个大Z就可以看selinux
给权限chcon -s啦-u啦-t啦什么的
一定记得上面改配置文件的话如果是新建的文件,一定一定要按照链接里的要求给上selinux权限,要不就会出现一个问题:strongswan前台运行可以连接,转为server运行就不行了。。
更新至swanctl
按官网说明,将配置迁至/usr/local/etc/swanctl/swanctl.conf
,将证书迁至x509, x509ca, private三文件夹
connections {
IKEV2_EAP {
unique = never
version = 2
local_addrs = %any
remote_addrs = %any
# leftca=chain.pem
local {
id = vultr.vrqq.org
auth = pubkey
certs = fullchain.pem
}
remote {
eap_id = %any
auth = eap-mschapv2
}
children {
mychild {
local_ts = 0.0.0.0/0
esp_proposals = aes256-sha256,3des-sha1,aes256-sha1
dpd_action = clear
}
}
#proposals = aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024
proposals = aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048
# rightfirewall=yes
rekey_time = 170m
send_cert = always
send_certreq = no
fragmentation = yes
pools = iospool
}
}
pools {
iospool {
addrs = 10.0.1.0/24
dns = 8.8.8.8,223.5.5.5
}
}
secrets {
ike-ikeuser1 {
secret = YOUR_PSK
}
eap-eapuser1 {
id = "username"
secret = "password"
}
}