CentOS7下Strongswan架设IPSec-IKEv1, IKEv2, L2TP VPN,适用于 IOS9,OSX, Windows, Linux

参考:
https://www.creekside.network/zh/2020/08/13/vpn%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/
https://www.howtoing.com/how-to-setup-ikev2-vpn-using-strongswan-and-letsencrypt-on-centos-7
http://www.fish2bird.com/?p=793
https://datahunter.org/strongswan

VPN 隧道协议PPTP、L2TP、IPSec和SSLVPN(SSTP,OpenVPN)中安全性逐级提高,相应的受到墙的干扰相对要弱点,但是现在我们考虑到跨平台,PPTP穿透力及安全性可以忽略,所以这里搭建支持 ikev1/ikev2 的 Ipsec VPN,适用于iOS、Android、Windows 7+ 、MacOS X,及Linux。为了兼容Windows 7以下的系统,同时搭建L2TP/IPSec支持。

支持IOS9 IKEV2 的配置,直接到最后查看2015.12更新

安装 StrongSwan

由于Openswan已经没人维护了,所以我们选择更强大的Strongswan.它是一个完整的2.4和2.6的Linux内核下的IPsec和IKEv1 的实现。它也完全支持新的IKEv2协议的Linux 2.6内核。

StrongSwan 的发行版已包含在 EPEL 源中, 但是CentOS源的包比较旧,所以我们手动在官网https://www.strongswan.org/download.html下载安装包,当然你也可以直接源码编译。

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/s/strongswan-5.3.2-1.el7.x86_64.rpm
						
rpm -ihv strongswan-5.3.2-1.el7.x86_64.rpm
											

编译:

wget http://download.strongswan.org/strongswan.tar.gz
						
tar xzf strongswan.tar.gz
cd strongswan-*
./configure  --sysconfdir=/etc  --enable-openssl --enable-nat-transport --disable-mysql --disable-ldap  --disable-static --enable-shared --enable-md4 --enable-eap-mschapv2 --enable-eap-aka --enable-eap-aka-3gpp2  --enable-eap-gtc --enable-eap-identity --enable-eap-md5 --enable-eap-peap --enable-eap-radius --enable-eap-sim --enable-eap-sim-file --enable-eap-simaka-pseudonym --enable-eap-simaka-reauth --enable-eap-simaka-sql --enable-eap-tls --enable-eap-tnc --enable-eap-ttls
make && make install
					

配置证书

每一个完整的 ssl 证书都有一个公钥和一个私钥。公钥是在网络上传输的,而私钥是藏好用来和接收到的公钥配对的(因此私钥里也有整个公钥,用来配对)。

  1. 生成CA证书的私钥,并使用私钥,签名CA证书
  2. ipsec pki --gen --outform pem > ca.pem
    
    ipsec pki --self --in ca.pem --dn "C=CN, O=VPN, CN=StrongSwan CA" --ca --lifetime 3650 --outform pem >ca.cert.pem
    															

    这里C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名。O 表示组织名。CN 为通用名

  3. 生成服务器证书所需的私钥,并用CA证书签发服务器证书
  4. ipsec pki --gen --outform pem > server.pem  
    
  5. ipsec pki --pub --in server.pem | ipsec pki --issue --lifetime 1200 --cacert ca.cert.pem 
    
  6.     --cakey ca.pem --dn "C=CN, O=VPN, CN=vpn.linsir.org" 
    
  7.     --san="1.2.3.4" --san="vpn.linsir.org" --flag serverAuth --flag ikeIntermediate 
    
        --outform pem > server.cert.pem
    							

    第二句是从我们刚生成的私钥里把公钥提取出来,然后用公钥去参与后面的服务器证书签发。

    - iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL  IP 地址;
    
    - Windows
    										7
    											不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),–flag serverAuth;
    
    -  iOS 
    								Mac OS X 要求了"IP 安全网络密钥互换居间(IP Security IKE Intermediate"这种增强型密钥用法(EKU),–flag ikdeIntermediate;
    
    - Android
    									 iOS 都要求服务器别名(serverAltName)就是服务器的 URL  IP 地址,–san
    							

    所以这里C、O的值要跟第一步的一致,CN值及–san值是服务器公网地址或url,另外这里可以设置多个–san值。否则会出现错误 13801:IKE身份验证凭证不可接受.

  8. 生成客户端证书
  9.     ipsec pki --gen --outform pem > client.pem
    
  10.      ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem 
    
  11.     --cakey ca.pem --dn "C=CN, O=VPN, CN=VPN Client" 
    
        --outform pem > client.cert.pem
    							

    这里C、O的值要跟第一步的一致

  12. 生成 pkcs12 证书 pkcs12 证书用来导入手机或电脑的。
  13. openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "VPN Client"
    
             -certfile ca.cert.pem -caname "vpn.linsir.org"  -out client.cert.p12
    											

安装证书

把证书复制到strongswan目录下。

cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r server.pem /etc/strongswan/ipsec.d/private/
cp -r client.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r client.pem  /etc/strongswan/ipsec.d/private/
							

配置Strongswan

设备/操作系统使用的 ike 版本

  • Linux: 命令行客户端就是 strongswan 本身,因此完美兼容,支持 ikev1/ikev2 和所有加密方法的连接。
  • Android: 只支持 ikev1。
  • iOS/Mac OS X: IPsec 客户端为自己修改的racoon。它只支持 ikev1,最新的IOS 9 Mac OS X 支持ikev2.
  • Windows: 只在 Windows 7 以后支持ikev2, XP需要另外的l2tp方式。

ipsec.conf

vim /etc/strongswan/ipsec.conf

config setup
    uniqueids=never              #允许多个客户端使用同一个证书,多设备同时在线
						
#所有项目共用的配置项
					
conn %default
						
    keyexchange=ike              #ikev1  ikev2 都用这个
						
    left=%any                    #服务器端标识,%any表示任意
						
    leftsubnet=0.0.0.0/0
												#服务器端虚拟ip, 0.0.0.0/0表示通配.
							
    right=%any                   #客户端标识,%any表示任意
						
conn IKE-BASE
    leftca=ca.cert.pem           #服务器端 CA 证书
						
    leftcert=server.cert.pem     #服务器端证书
					
    rightsourceip=10.0.0.0/24
												#分配给客户端的虚拟 ip 
						
# ios 使用, 使用客户端证书
					
conn IPSec-IKEv1
								
    also=IKE-BASE
    keyexchange=ikev1
    fragmentation=yes            #开启对 iOS 拆包的重组支持
						
    ike=aes256-sha1-modp1024
    leftauth=pubkey
    rightauth=pubkey
    rightauth2=xauth
    rightcert=client.cert.pem

					auto=add
# ios 使用, 使用 PSK 预设密钥
					
conn IPSec-IKEv1-PSK
    also=IKE-BASE
    keyexchange=ikev1
    fragmentation=yes
    leftauth=psk
    rightauth=psk
    rightauth2=xauth

					auto=add
# android, linux, os x 使用
					
conn IPSec-IKEv2
								
    also=IKE-BASE
    keyexchange=ikev2
    leftauth=pubkey
    rightauth=pubkey
    rightcert=client.cert.pem

					auto=add
# windows 7+ 使用, win7 以下版本需使用第三方 ipsec vpn 客户端连接
					
conn IPSec-IKEv2-EAP
    also=IKE-BASE
    keyexchange=ikev2
    ike=aes256-sha1-modp1024!   #第一阶段加密方式
					
    rekey=no
								#服务器对 Windows 发出 rekey 请求会断开连接
						
    leftauth=pubkey
    rightauth=eap-mschapv2
    rightsendcert=never          #服务器不要向客户端请求证书
					
    eap_identity=%any

					auto=add
conn IKEV2-RSA
     also=IKE-BASE
     ikelifetime=60m
						
     keylife=20m
						
     rekeymargin=3m
						
     keyingtries=1
						
     keyexchange=ikev2
     leftfirewall=yes

					auto=add
							

具体配置说明可以参考https://zh.opensuse.org/SDB:Setup_Ipsec_VPN_with_Strongswan官方文档

strongswan.conf

vim /etc/strongswan/strongswan.conf

# strongswan.conf - strongSwan configuration file
					
#
					
# Refer to the strongswan.conf(5) manpage for details
					
#
					
# Configuration changes should be made in the included files
					
charon {
    load_modular = yes
    duplicheck.enable = no
								#是为了你能同时连接多个设备,所以要把冗余检查关闭
					
    compress = yes
    plugins {
        include strongswan.d/charon/*.conf
    }
    dns1 = 223.5.5.5
    dns2 = 8.8.8.8
    # for Windows only
    nbns1 = 223.5.5.5
    nbns2 = 8.8.8.8
}
include strongswan.d/*.conf
					

密码认证文件

# /etc/ipsec.secrets - strongSwan IPsec secrets file
					
: RSA server.pem
: PSK "password"
						
: XAUTH "password"
						
vpn %any : EAP "password"
						
wp设备名称用户名2 : EAP "密码2"
									#仅对windowsphone8.1设备,设备名称在`设置-关于-手机信息` 中查看
								

启动Strongswan

ipsec start 
或者
					
systemctl start strongswan.service
					

IKEv1,v2就搭建好了,我们配置L2TP/IPSec

L2TP/IPSec

安装 xl2tpd

yum install ppp xl2tpd
					

CentOS 7 源已经不再有了,所以手动下载安装。

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/x/xl2tpd-1.3.6-8.el7.x86_64.rpm
						
rpm -ihv l2tpd-1.3.6-8.el7.x86_64.rpm
											

/etc/strongswan/ipsec.conf

在/etc/strongswan/ipsec.conf最后添加

conn L2TP-PSK
    keyexchange=ikev1
    authby=secret
    leftprotoport=17/1701
										#l2tp端口
					
    leftfirewall=no
						
    rightprotoport=17/%any
    type=transport

					auto=add
							

xl2tpd.conf

vim /etc/xl2tpd/xl2tpd.conf

[global]
ipsec saref = no
						
#listen-addr = 1.2.3.4
					
port =1701
						
[lns default]
ip range = 10.0.0.100-10.0.0.254
												
local ip = 10.0.0.255
									
require chap = yes
refuse pap = yes
require authentication = yes
name = vpn
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
					

options.xl2tpd

vim /etc/ppp/options.xl2tpd

require-mschap-v2
ms-dns 223.5.5.5
								
ms-dns 223.6.6.6
								
asyncmap 0
						
auth
crtscts
lock
					
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
						
lcp-echo-failure 4
						
mtu 1400
						
noccp
connect-delay 5000
						
debug
logfile /var/log/xl2tpd.log
							

设置用户名,密码

vim /etc/ppp/chap-secrets

# client    server  secret          IP addresses
					
vpn         *       admin           *
					

启动xl2tpd

首先添加文件

vim /usr/lib/systemd/system/xl2tpd.service

[Unit]
Description=Level
								2
										Tunnel
												Protocol
														Daemon (L2TP)
After=syslog.target network.target
After=ipsec.service
# Some ISPs in Russia use l2tp without IPsec, so don't insist anymore
					
#Wants=ipsec.service
					
[Service]
Type=simple
PIDFile=/run/xl2tpd/xl2tpd.pid
ExecStart=/usr/bin/xl2tpd -D
Restart=on-abort
[Install]
WantedBy=multi-user.target
						

然后 执行:

systemctl start xl2tpd
					

配置转发及防火墙

编辑/etc/sysctl.conf

net.ipv4.ip_forward=1
						
net.ipv6.conf.all.forwarding=1
						
net.ipv4.conf.all.accept_redirects = 0
						
net.ipv4.conf.all.send_redirects = 0
						

然后sysctl -p使之生效。

ipatables

iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 1701 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp7s0f0 -j MASQUERADE
iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT
											

注意 CentOS 网卡名称,我这里是enp7s0f0,而有的是eth0,具体根据实际情况来。

开机启动

systemctl enable xl2tpd
systemctl enable strongswan
					

客户端配置及连接及测试

win7

导入证书

  • 开始菜单搜索”cmd”,打开后输入 mmc(Microsoft 管理控制台);
  • “文件”-“添加/删除管理单元”,添加”证书”单元;
  • 证书单元的弹出窗口中一定要选”计算机账户”,之后选”本地计算机”,确定;
  • 在左边的”控制台根节点”下选择”证书”-“个人”,然后选右边的”更多操作”-“所有任务”-“导入”打开证书导入窗口;
  • 选择刚才生成的 clientCert.p12 文件。下一步输入私钥密码。下一步”证书存储”选”个人”;
  • 导入成功后,把导入的 CA 证书剪切到”受信任的根证书颁发机构”的证书文件夹里面;
  • 打开剩下的那个私人证书,看一下有没有显示”您有一个与该证书对应的私钥”,以及”证书路径”下面是不是显示”该证书没有问题”;
  • 然后关闭 mmc,提示”将控制台设置存入控制台1吗”,选”否”即可;
  • 至此,证书导入完成。

如果双击 .p12 证书导入,会出现错误 13801:IKE身份验证凭证不可接受.

然后新建vpn即可。

注意:win8 win10 Ikev2有bug tcp/ip协议不能设置属性,关闭远程网关,我的连接上之后,需要自己手动添加路由表。 Win10系统VPN连接IPV4属性无法打开,需要关闭远程网关解决方法

http://www.nicklitten.com/blog/how-fix-windows-10-problem-vpn-failed-initialize-connection-subsystem-cisco-anyconnect

经测试,win8+使用证书登录的穿透性很差,而使用ca证书+EAP账号密码认证,连接速度很快,而且稳定。

iOS/Mac

把 CA 证书和之前做好的 pkcs12(.p12)发邮件给自己,。在 iOS 上收邮件,导入两者注意是两个证书,一定要导入CA,或者后者不能使用,然后新建 IPSec VPN

在这里可以使用四种方式建立VPN:

  • IPSec+EAP
    • 服务器是 IP 或都是 URL
    • 账户和密码填 ipsec.secrets 里 EAP 前后的那两个
    • 密钥输入 ipsec.secrets 里设置的 PSK 密码。
  • IPSec+证书
    • 服务器是 IP 或都是 URL
    • 账户和密码填 ipsec.secrets 里 EAP 前后的那两个(XAUTH的那个密码也行)
    • 勾选使用证书并选择之
  • L2TP
    • 服务器是 IP 或都是 URL
    • 账户和密码填 etc/ppp/chap-secrets 里的
    • 密钥输入 ipsec.secrets 里设置的 PSK 密码。
  • IEKV2

    IOS9默认是可以创建的,但是不能使用。目前只能用Apple Configurator 生成配置文件,然后邮件导入使用。自带的暂时不行。IOS9 IKEv2成功了,可以看blog更新

Android

IPSec Xauth PSK

IPSec 预共享密钥:写 ipsec.secrets 里 PSK 后面的那个密码.

调试

服务器端的日志就足够检测出绝大多数问题的来源。

tail -f /var/log/strongswan-charon.log
							

或者直接

journalctl -f
					

粗暴观察。

扩展

  • FreeRadius:账户认证和计费
  • daloRadius:用户账单管理

2015.12.16 更新

IOS9一样可以使用IEKV2了。 @wbuntu @heraclitusq 小伙伴提醒 StrongSwan 的”官网”https://strongswan.net/已经可以支持IOS9自带的IKEV2设置了。看了下果然支持了,马上去官方网站看到文档!

经过官方提示,只需要在WIN7_EAP配置之上添加几行就行了。

ike = aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
esp = aes256-sha256,3des-sha1,aes256-sha1!
leftsendcerts = always
leftid = @vpn.linsir.org/1.2.3.4
										

iOS支持的IKE为aes256-sha256-modp1024,OS X为3des-sha1-modp1024,Win7为aes256-sha1-modp1024。

注意ESP的顺序与IKE的一致。leftid@后跟着就是服务器证书的CN(Common Name)也是IOS9设置时的远程ID(Remote ID).

IPhone 连接测试:

首先是导入服务器ca.cert.pem证书,在设置-通用-描述文件中可以查看

IKEV2-EAP

+ 类型
						IKEv2
							
+ 服务器是 IP 或都是 URL
+ 远程ID IP 或都是 URL
+ 账户和密码填 ipsec.secrets  EAP 前后的那两个
					

IOS9.1/9.2 测试通过!没有Mac,所以 OSX 系统没能测试。

遇到的坑:

Dec
						16
								15:41:53 debian charon: 09[NET] sending packet: from *.*.*.*[4500] to *.*.*.*[4500] (1180 bytes)
Dec
						16
								15:42:23 debian charon: 13[JOB] deleting half open IKE_SA after timeout
																

一直报这样子的错误,甚至我重新编译升级StrongSwan5.3.3到5.3.5,放狗搜索半天,https://ttz.im/2015/10/1335 这个哥们成功了,可是我一样的配置还是不行,搞得我都装了个freeRadius来测试了。

最后才发现上次手机刷机之后,ca证书已经不存在了。导入,就成功!

附上完整配置:

config setup
    uniqueids=never              #允许多个客户端使用同一个证书
					
#所有项目共用的配置项
					
conn %default
						
    keyexchange=ike              #ikev1  ikev2 都用这个
						
    left=%any                    #服务器端标识,%any表示任意
						
    leftsubnet=0.0.0.0/0
												#服务器端虚拟ip, 0.0.0.0/0表示通配.
							
    right=%any                   #客户端标识,%any表示任意
						
conn IKE-BASE
    leftca=ca.cert.pem           #服务器端 CA 证书
						
    leftcert=server.cert.pem     #服务器端证书
					
    rightsourceip=10.0.1.0/24
												#分配给客户端的虚拟 ip 
						
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
								#服务器对 Windows 发出 rekey 请求会断开连接
						
    leftid=vpn.linsir.org
    leftauth=pubkey
    leftsendcert=always

					#leftfirewall=yes
						
    right=%any
    rightfirewall=yes
    rightsourceip=10.0.1.0/24
										
    rightsendcert=never

					#rightauth=eap-radius
						
    rightauth=eap-mschapv2
    eap_identity=%any
    dpdaction=clear
    fragmentation=yes

					auto=add
							

关于freeRadius的可以参考这个链接:

http://freeradius.akagi201.org/index.html

参考链接: