CentOS7下Strongswan架设IPSec-IKEv1, IKEv2, L2TP VPN,适用于 IOS9,OSX, Windows, Linux
来源:互联网 发布:前端 后端 数据库 编辑:程序博客网 时间:2024/05/17 03:15
原文地址:https://linsir.org/post/how_to_install_IPSec_IKEV2_base_on_strongswan_with_CentOS7
VPN 隧道协议PPTP、L2TP、IPSec和SSLVPN(SSTP,OpenVPN)中安全性逐级提高,相应的受到墙的干扰相对要弱点,但是现在我们考虑到跨平台,PPTP穿透力及安全性可以忽略,所以这里搭建支持 ikev1/ikev2 的 Ipsec VPN,适用于iOS、Android、Windows 7+ 、MacOS X,及Linux。为了兼容Windows 7以下的系统,同时搭建L2TP/IPSec支持。
# 最后更新时间:2016..04.08 支持IOS9 IKEV2
# 温馨提示:这种方法不适合架梯子,GFW干扰太强。
同时GFW对https及Shadowsocks也是能检测到,VPS间歇性的Timeout.
# 安装 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.rpmrpm -ihv strongswan-5.3.2-1.el7.x86_64.rpm
安装依赖:
#CentOSyum install -y gmp-devel#debian/ubuntuapt-get -y install gccapt-get -y install makeapt-get -y install install libgmp10 libgmp3-dev libssl-dev pkg-config libpcsclite-dev libpam0g-dev
编译:
wget http://download.strongswan.org/strongswan.tar.gztar xzf strongswan.tar.gzcd 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-ttlsmake && make install
这里需要注意下,官方教程编译configure时没有带这么多参数,我实测如果不带参数,安装成功后,在生成证书的时候,ipsec pki --gen 命令将不会成功,也不会提示任何错误。
# 配置相关证书
每一个完整的 ssl 证书都有一个公钥和一个私钥。公钥是在网络上传输的,而私钥是藏好用来和接收到的公钥配对的(因此私钥里也有整个公钥,用来配对)。
生成CA证书的私钥,并使用私钥,签名CA证书
ipsec pki --gen --outform pem > ca.key.pemipsec pki --self --in ca.key.pem --dn "C=CN, O=VPN, CN=StrongSwan CA" --ca --lifetime 3650 --outform pem >ca.cert.pem
这里C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名。O 表示组织名。CN 为通用名
生成服务器证书所需的私钥,并用CA证书签发服务器证书
ipsec pki --gen --outform pem > server.key.pem ipsec pki --pub --in server.key.pem | ipsec pki --issue --lifetime 1200 --cacert ca.cert.pem \ --cakey ca.key.pem --dn "C=CN, O=VPN, CN=vpn.linsir.org" \ --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身份验证凭证不可接受.
```shellipsec pki --gen --outform pem > client.pem ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem \--cakey ca.pem --dn "C=CN, O=VPN, CN=VPN Client" \--outform pem > client.cert.pem```这里C、O的值要跟第一步的一致
生成 pkcs12 证书pkcs12 证书用来导入手机或电脑的。
-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/
# 配置StrongSwan
# 设备/操作系统使用的 ike 版本
- Linux: 命令行客户端就是 strongswan 本身,因此完美兼容,支持 ikev1/ikev2 和所有加密方法的连接。
- Android: 只支持 ikev1(没有最新andriod手机,可能已经支持ikev2)。
- iOS/Mac OS X: IPsec 客户端为自己修改的racoon。它只支持 ikev1,最新的IOS 9 Mac OS X 支持ikev2.
- Windows: 只在 Windows 7 以后支持ikev2, Win XP需要用l2tp方式。
# ipsec.conf
vim /etc/strongswan/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file# basic configurationconfig 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 ikelifetime=60m keylife=20m rekeymargin=3m keyingtries=1 leftcert=server.cert.pem #服务器端证书 rightsourceip=10.0.0.0/24 #分配给客户端的虚拟 ip 段# for IOS9 and Win 7 or laterconn ike2-eap also=IKE-BASE keyexchange=ikev2 ike=aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! esp=aes256-sha256,aes256-sha1,3des-sha1! leftsendcert=always leftid=vpn.linsir.org leftauth=pubkey leftfirewall=yes rightauth=eap-mschapv2 rightsendcert=never eap_identity=%any rekey=no dpdaction=clear fragmentation=yes auto=add# for IOS, use PSK keyconn IPSec-IKEv1-PSK also=IKE-BASE keyexchange=ikev1 fragmentation=yes leftauth=psk rightauth=psk rightauth2=xauth auto=add# for andriod conn IPSec-xauth also=IKE-BASE leftauth=psk leftfirewall=yes right=%any rightauth=psk rightauth2=xauth auto=add# for win xp l2tp,use pskconn L2TP-PSK keyexchange=ikev1 authby=secret leftprotoport=17/1701 #l2tp端口 leftfirewall=no rightprotoport=17/%any type=transport auto=add
这里说明一下:
ike: Win7 is aes256, sha-1, modp1024; iOS is aes256, sha-256, modp1024; OS X is 3DES, sha-1, modp1024
esp: Win 7 is aes256-sha1, iOS is aes256-sha256, OS X is 3des-shal1iOS支持的IKE为aes256-sha256-modp1024,OS X为3des-sha1-modp1024,Win7为aes256-sha1-modp1024。
注意ESP的顺序与IKE的一致。leftid@后跟着就是服务器证书的CN(Common Name)也是IOS9设置时的远程ID(Remote ID).
具体配置说明可以参考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 filescharon { 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 WINS Server 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设备名称\user : EAP "password" # 仅对windowsphone8.1设备,设备名称在`设置-关于-手机信息` 中查看
# 启动Strongswan
ipsec start # 或者systemctl start strongswan.service
IKEv1,v2就搭建好了,我们配置L2TP/IPSec
# L2TP/IPSec
# 安装 xl2tpd
yum install ppp xl2tpd
如果提示找不到安装包,我们还可以手动下载安装。
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/x/xl2tpd-1.3.6-8.el7.x86_64.rpmrpm -ihv xl2tpd-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.4port =1701[lns default]ip range = 10.0.1.2-10.0.1.254local ip = 10.0.1.1require chap = yesrefuse pap = yesrequire authentication = yesname = vpnppp debug = yespppoptfile = /etc/ppp/options.xl2tpdlength bit = yes
这里注意下 ip range不要跟上面的strongswan冲突了,不然会部分上不了网。
# 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 addressesvpn * admin *
# 启动xl2tpd
首先添加文件
vim /usr/lib/systemd/system/xl2tpd.service
[Unit]Description=Level 2 Tunnel Protocol Daemon (L2TP)After=syslog.target network.targetAfter=ipsec.service# Some ISPs in Russia use l2tp without IPsec, so don't insist anymore#Wants=ipsec.service[Service]Type=simplePIDFile=/run/xl2tpd/xl2tpd.pidExecStart=/usr/bin/xl2tpd -DRestart=on-abort[Install]WantedBy=multi-user.target
然后 执行:
systemctl start xl2tpd
# 配置转发及防火墙
为转发数据包,我们需要开启内核转发。
编辑/etc/sysctl.conf
net.ipv4.ip_forward=1net.ipv6.conf.all.forwarding=1net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.all.send_redirects = 0
然后sysctl -p使之生效。
# ipatables
iptables -A INPUT -p esp -j ACCEPTiptables -A INPUT -p udp --dport 500 -j ACCEPTiptables -A INPUT -p udp --dport 4500 -j ACCEPT# L2tpiptables -A INPUT -p udp -m udp --dport 1701 -j ACCEPT# 转发规则iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp7s0f0 -j MASQUERADE
注意 CentOS 网卡名称,我这里是enp7s0f0,而有的是eth0,具体根据实际情况来,另外有多网卡的,需要自己根据实际情况来设置iptables转发规则。
# 开机启动
systemctl enable xl2tpdsystemctl enable strongswan
# 客户端配置及连接及测试
# win7
导入证书
新建一个内容如下的bat批处理文件,然后把ca.cert.pem放在同一目录下,然后右键管理员运行。
@echo off@setlocal enableextensions@set current_dir="%~dp0"@cd /d "%current_dir%"@echo %current_dir%@certutil -addstore root ca.cert.pemif %ERRORLEVEL% EQU 0 @echo not okpause
然后新建vpn即可。
注意:win8 win10 Ikev2有bugtcp/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 证书发邮件给自己,。在 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)首先是导入服务器ca.cert.pem证书,在设置-通用-描述文件中可以查看
- 类型 IKEv2
- 服务器是 IP 或都是 URL
- 远程ID是 IP 或都是 URL
- 账户和密码填 ipsec.secrets 里 EAP 前后的那两个
# Android
IPSec Xauth PSK
IPSec 预共享密钥:写 ipsec.secrets 里 PSK 后面的那个密码.
# 调试
服务器端的日志就足够检测出绝大多数问题的来源。
tail -f /var/log/strongswan-charon.logortail -f /var/log/syslog #debiantail -f /var/log/messages #centos
或者直接
journalctl -f
粗暴观察。
More: Strongswan IKEV2免导入证书配置及调试笔记
# 扩展
- FreeRadius:账户认证和计费
- daloRadius:用户账单管理
# 遇到的坑:
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证书已经不存在了。导入,就成功!
关于freeRadius的可以参考这个链接:
http://freeradius.akagi201.org/index.html
# 参考链接:
- https://zh.opensuse.org/SDB:Setup_Ipsec_VPN_with_Strongswan
- https://www.strongswan.org/documentation.html
- http://blog.itnmg.net/centos7-ipsec-vpn/
- http://quericy.me/blog/512
- https://oogami.name/1467/
- https://tyr.so/ipsec.html
- https://ttz.im/2015/10/1335
- CentOS7下Strongswan架设IPSec-IKEv1, IKEv2, L2TP VPN,适用于 IOS9,OSX, Windows, Linux
- CentOS7下Strongswan架设IPSec-IKEv1, IKEv2, L2TP VPN,适用于 IOS9,OSX, Windows, Linux
- IOS iphone ipad CentOS7 安装配置 StrongSwan IPsec IKEv2 VPN
- Linux下架设L2TP IPSec VPN服务器(X509)
- 使用Strongswan搭建IPSec/IKEv2 VPN
- 使用Strongswan搭建IPSec/IKEv2 VPN
- 使用 Strongswan 架设 Ipsec VPN
- 使用 Strongswan 架设 Ipsec VPN
- 使用 Strongswan 架设 Ipsec VPN
- Centos6.5 下Strongswan + IKEV2 VPN搭建
- Linux下架设L2TP IPSec VPN服务器 _ 51cto _ 参考
- UBUNTU、CENTOS搭建IPSEC/IKEV2 VPN服务器全攻略----Strongswan
- centos7 L2TP/ipsec vpn搭建
- centos7 L2TP/ipsec vpn搭建
- Microsoft Azure 上架设 Windows Server 2012 VPN(SSTP、L2TP、IPsec、IKEv2)
- CentOS7架设L2TP实现VPN
- 搭建适用于Ubuntu/CentOS的IKEV2/L2TP的VPN
- linux l2tp ipsec vpn服务器
- 最小生成树//poj Jungle Road
- Android 触摸事件传递机制
- OpenWrt LuCI多级用户设计
- Webpack入门指迷
- 在 CentOS 7 上部署 L2TP/IPSec VPN 服务
- CentOS7下Strongswan架设IPSec-IKEv1, IKEv2, L2TP VPN,适用于 IOS9,OSX, Windows, Linux
- Docker容器学习梳理--日常操作总结
- 230. Kth Smallest Element in a BST
- Docker容器学习梳理--基础知识(1)
- Docker容器学习梳理--基础知识(2)
- Docker容器学习梳理--应用程序容器环境部署
- Docker容器学习梳理--SSH方式登陆容器
- Docker容器学习梳理--容器登陆方法梳理(attach、exec、nsenter)
- Docker容器学习梳理-Dockerfile构建镜像