one-key-ikev2-vpn icon indicating copy to clipboard operation
one-key-ikev2-vpn copied to clipboard

使用centos7搭建IKEV2 VPN并用win10,IOS 11.3,安卓6.0,linux当客户端连接

Open chainofhonor opened this issue 6 years ago • 9 comments

我研究了3天,终于懂了一点皮毛 我把的配置过程写在下面了 大家可以根据过程一步一步的来做 centos7的版本是1708 安装的minimal版的 安装完毕以后需要关闭selinux,并且关闭firewall

yum install strongswan

mkdir install_ikev2 cd install_ikev2

vps_ip="192.168.11.21" #这个是服务器IP 即客户端连接的时候要填写的,建议使用域名,万一服务器IP被屏蔽了,只需要换个IP,域名重新解析一下就行了 my_cert_c="com" #这3个变量是下面生成证书要用到的 可以自定义 my_cert_o="myvpn" my_cert_cn="VPN CA"

#这几个命令生成的是随机的数据,每次执行生成的结果都不一样 所以一定要保管好这些文件 #生成CA证书的私钥 strongswan pki --gen --outform pem > ca.pem #使用私钥,签名CA证书
strongswan pki --self --in ca.pem --dn "C=${my_cert_c}, O=${my_cert_o}, CN=${my_cert_cn}" --ca --outform pem >ca.cert.pem

#生成服务器证书的私钥 strongswan pki --gen --outform pem > server.pem #使用私钥 同时用CA证书的私钥和CA证书 签名服务器证书 【时间选填,时间是天数,如果这个参数不要的话,默认就是证书能用的最长时间,好像是5年还是10年】 strongswan pki --pub --in server.pem | strongswan pki --issue 【--lifetime 1200】 --cacert ca.cert.pem --cakey ca.pem --dn "C=${my_cert_c}, O=${my_cert_o}, CN=${vps_ip}" --san="${vps_ip}" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem

#生成客户端证书的私钥 strongswan pki --gen --outform pem > client.pem #使用私钥,签名客户端证书 这里C、O的值要跟第一步的一致 strongswan pki --pub --in client.pem | strongswan pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=${my_cert_c}, O=${my_cert_o}, CN=VPN Client" --outform pem > client.cert.pem

#生成供安卓客户端使用的证书(需要安装yum install openssl)(这一步可以不做,安卓可以使用另外一种不用证书的方式登录) openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" -certfile ca.cert.pem -caname "${my_cert_cn}" -out client.cert.p12

#把证书复制到strongswan目录下 cp -f ca.cert.pem /etc/strongswan/ipsec.d/cacerts/ cp -f server.cert.pem /etc/strongswan/ipsec.d/certs/ cp -f server.pem /etc/strongswan/ipsec.d/private/ cp -f client.cert.pem /etc/strongswan/ipsec.d/certs/ cp -f client.pem /etc/strongswan/ipsec.d/private/ echo "Cert copy completed"

#配置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方式。 WIN10还需要设置一下

#vi /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

conn IKE-BASE leftca=ca.cert.pem #服务器端 CA 证书 leftcert=server.cert.pem #服务器端证书 rightsourceip=10.31.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

#这个是我搭建的教程里面独有的,应该这个才是给ios的 conn ios_ikev2 also=IKE-BASE keyexchange=ikev2 ike=aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048! esp=aes256-sha256,3des-sha1,aes256-sha1! rekey=no #leftid=${vps_ip} #注意这里要根据上面的变量来填 leftid=192.168.11.21 leftsendcert=always leftsubnet=0.0.0.0/0 rightauth=eap-mschapv2 rightsendcert=never eap_identity=%any dpdaction=clear fragmentation=yes auto=add

#说明: #auto=add表示只添加 auto=start表示立刻开始连接,如果是客户端的话用这个

#vi /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 = 8.8.8.8 dns2 = 8.8.4.4 # for Windows only nbns1 = 8.8.8.8 nbns2 = 8.8.4.4 } include strongswan.d/.conf

configure the ipsec.secrets 密码认证文件

#vi /etc/strongswan/ipsec.secrets : RSA server.pem : PSK "myPSKkey" : XAUTH "myXAUTHPass" myUserName %any : EAP "myUserPass" wp设备名称\myUserName2 : EAP "myUserPass2" #仅对windowsphone8.1设备,设备名称在设置-关于-手机信息 中查看

#编辑转发,这样重启以后也是自动开启转发的 #vi /etc/sysctl.d/10-ipsec.conf net.ipv4.ip_forward=1

#开启转发 sysctl --system

#防火墙设置,这里针对iptagbles,如果是firewall需要另外设置 interface="eth0" #这个是网卡 iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -s 10.31.0.0/24 -j ACCEPT iptables -A INPUT -i $interface -p esp -j ACCEPT iptables -A INPUT -i $interface -p udp --dport 500 -j ACCEPT iptables -A INPUT -i $interface -p tcp --dport 500 -j ACCEPT iptables -A INPUT -i $interface -p udp --dport 4500 -j ACCEPT iptables -A INPUT -i $interface -p udp --dport 1701 -j ACCEPT iptables -A INPUT -i $interface -p tcp --dport 1723 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o $interface -j MASQUERADE

service iptables save

#启动 strongswan start #到这里IKE服务端就搭建好了

#下面是各种客户端的访问方式

#WIN10默认不支持AES-256-CBC和MODP-2048 需要添加注册表 #添加一个DWORD键 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters\NegotiateDH2048_AES256 键值设置为1 #0 禁用AES-256-CBC和MODP-2048 #1 启用AES-256-CBC和MODP-2048 #2 强制使用AES-256-CBC和MODP-2048 #然后把ca.cert.pem导入到受信任的根证书颁发机构,然后添加IKEV2的VPN就行了

#IOS用户访问的话需要把ca.cert.pem导入到描述文件,然后添加IKEV2的VPN就行了

#安卓用户 这种方式有个缺点,安卓客户端断开连接以后服务端里面查看状态连接没有断开,状态会变为REKEYED然后会在上面配置ikelifetime达到的时间以后消失 #方式IPSec Xauth PSK #IPSec 预共享密钥:写 ipsec.secrets 里 PSK 后面的那个密码 展开高级设置,dns服务器填写8.8.8.8 转发路线填服务端rightsourceip的值例如上面的设置的话这里就填10.31.0.0/24 #安卓用户访问方式2 IPSec Xauth RSA #IPSec用户证书使用上面生成的p12证书,在安卓安全设置里面添加证书就行 IPSec CA证书用上面生成的ca.sert.pem可以不用,不用的话会分配一个ip,但是又ping不通,用了的话不会分配IP,但是vpn是能用的

#linux用户,我用的centos7 #安装strongSwan客户端yum install strongswan #把ca.cert.pem复制到/etc/strongswan/ipsec.d/cacerts/这个目录 #编辑/etc/ipsec.conf,设定名为myikev2的连接: config setup uniqueids=never #允许多个客户端使用同一个证书,多设备同时在线 conn myikev2 keyexchange = ikev2 right = 填服务端那边的$vps_ip变量 rightca = ca.cert.pem rightid = 参考服务端那边的ios_ikev2的leftid rightsubnet = 0.0.0.0/0 left = %any leftsourceip = %config leftauth = eap-mschapv2 eap_identity = client #这个参数必须填client auto = start #编辑/etc/ipsec.secrets,这个文件的内容要和服务端的一模一样 #然后使用命令strongswan start开启连接 连接以后用命令strongswan status查看状态 #这个方法成功的连接上了我香港的服务器的ios_ikev2,但是有个缺点,网络还是走的本地,而且我也不知道要怎么添加默认路由让网络走IKEv2

#到这里就差不多了,写点后记吧 #VPN的作用是连接2个网络,但是IKEV2这种方式我觉得不怎么方便 #最方便的还是PPTP #PPTP就相当于直接在系统里面添加了一块网卡,你可以自由选择数据包怎么走,我感觉这才是VPN应该有的样子 #但是PPTP不安全,完全可以用封包加密的方式加密PPTP的传输,好像L2TP就是这样的,我去研究L2TP了

chainofhonor avatar May 11 '18 21:05 chainofhonor

https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2ClientConfig https://blog.csdn.net/qw623577789/article/details/71054795

https://github.com/quericy/one-key-ikev2-vpn/issues/148 这个是我的反馈https://www.jianshu.com/p/079abb4d9617参考的这个链接 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters\NegotiateDH2048_AES256 DWORD键值设置为1 立刻生效 0 禁用AES-256-CBC和MODP-2048 1 启用AES-256-CBC和MODP-2048 2 强制使用AES-256-CBC和MODP-2048

https://centos.pkgs.org/7/epel-x86_64/strongswan-5.6.1-2.el7.x86_64.rpm.html #centos的包管理的strongswan的包信息

https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2ClientConfig?spm=a2c4e.11155515.0.0.WgO6BN #strongswan的官方文档,这个应该是安装了strongswan以后当客户端的配置 https://www.strongswan.org/testresults.html #这个是strongswan官方的配置教程,但是没有安装过程

https://blog.csdn.net/puppylpg/article/details/64918562 #这个是一个net2net-psk的组网的教程,里面过程比较详细,有一定参考价值

https://blog.csdn.net/sonflower123/article/details/52832569 #这个是一个IKEV1的教程,提供给安卓的,教程可以不看,但是里面关于strongswan记录日志有一些有用的说明 https://blog.csdn.net/fxismonk/article/details/50826452 #这个教程最详细,但是里面的加密方式优点旧,最新的是2048位了,他关于ios那一段还是1024

http://maskray.me/blog/2015-12-31-strongswan #安卓和linux的安装过程,安卓的过程可能有问题,我估计是服务器加密方式太高级,安卓的连接方式用我自己写的那个教程里面的方法 linux的连接方式一会测试一下

http://network.51cto.com/art/201111/304777.htm IPSec VPN快速入门

这些是我研究过程中看过的一部分我觉得可能有用的教程,大家可以看看

chainofhonor avatar May 11 '18 21:05 chainofhonor

感谢你的教程。初次研究vpn,在centos7上面试用了几个一键部署脚本,都是失败,还不知道问题出在哪里,很是挫败的。。还好有你这个issue。

Martwu avatar Jun 11 '18 10:06 Martwu

这个方法成功的连接上了我香港的服务器的ios_ikev2,但是有个缺点,网络还是走的本地,而且我也不知道要怎么添加默认路由让网络走IKEv2

关于这一点 win10 默认开启了split tunneling 不会添加全局路由。解决方法见 image

(Introduction to strongSwan: Forwarding and Split-Tunneling)[https://wiki.strongswan.org/projects/strongswan/wiki/ForwardingAndSplitTunneling]

rc452860 avatar Aug 09 '18 02:08 rc452860

看不懂,用你的方法弄完服务器之后呢?电脑和手机怎么办呢?原来配置好的ssr脚本还用不了了。

SalicylicAcid avatar Feb 08 '19 05:02 SalicylicAcid

https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2ClientConfig https://blog.csdn.net/qw623577789/article/details/71054795

#148 这个是我的反馈https://www.jianshu.com/p/079abb4d9617参考的这个链接 HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ Rasman \ Parameters \ NegotiateDH2048_AES256 DWORD键值设置为1立刻变为 0变为AES-256 -CBC和MODP-2048 1 启用AES-256-CBC和MODP-2048 2强制使用AES-256-CBC和MODP-2048

https://centos.pkgs.org/7/epel-x86_64/strongswan-5.6.1-2.el7.x86_64.rpm.html #centos的包管理的strongswan的包信息

https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2ClientConfig?spm=a2c4e.11155515.0.0.WgO6BN #strongswan的官方文档,这个应该是安装了strongswan,当客户端配置为 https:// www。 strongswan.org/testresults.html# 这个是strongswan官方的配置教程,但是没有安装过程

https://blog.csdn.net/puppylpg/article/details/64918562# 这个是一个net2net-psk的组网的教程,里面过程比较详细,有一定参考价值

https://blog.csdn.net/sonflower123/article/details/52832569# 这个是一个IKEV1的教程,提供给安卓的,教程可以不看,但是里面关于strongswan记录日志有一些有用的说明 https:// blog.csdn.net/fxismonk/article/details/50826452# 这个教程最详细,但是里面的加密方式优点旧,最新的是2048位了,他关于ios那一段还是1024

http://maskray.me/blog/2015-12-31-strongswan# 安卓和Linux的安装过程,安卓的过程可能有问题,我估计是服务器加密方式太高级,安卓的连接方式用我自己写的那个教程里面的方法linux的连接方式一会测试一下

http://network.51cto.com/art/201111/304777.htm IPSec VPN快速入门

这些是我研究过程中看过的一部分我觉得可能有用的教程,大家可以看看

你好可以留个联系邮箱嘛,谷歌的就可以,想请教下感谢

tayshorangi avatar Feb 28 '20 12:02 tayshorangi

@chainofhonor

看起来你的配置更通用一些,但是我对这个东西得配置一窍不通。就现在得脚本和你的配置里面得ipsec.conf文件,哪个更好一些呢?我改动这个文件的话是不是只需要重启一下IPSec就可以?如果是的话我可以自己尝试一下

# chainofhonor 的 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

conn IKE-BASE
leftca=ca.cert.pem #服务器端 CA 证书
leftcert=server.cert.pem #服务器端证书
rightsourceip=10.31.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

#这个是我搭建的教程里面独有的,应该这个才是给ios的
conn ios_ikev2
also=IKE-BASE
keyexchange=ikev2
ike=aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048!
esp=aes256-sha256,3des-sha1,aes256-sha1!
rekey=no
#leftid=${vps_ip} #注意这里要根据上面的变量来填
leftid=192.168.11.21
leftsendcert=always
leftsubnet=0.0.0.0/0
rightauth=eap-mschapv2
rightsendcert=never
eap_identity=%any
dpdaction=clear
fragmentation=yes
auto=add
# [quericy](https://github.com/quericy)的配置文件
config setup
    uniqueids=never 

conn iOS_cert
    keyexchange=ikev1
    fragmentation=yes
    left=%defaultroute
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=pubkey
    rightauth2=xauth
    rightsourceip=10.31.2.0/24
    rightcert=client.cert.pem
    auto=add

conn android_xauth_psk
    keyexchange=ikev1
    left=%defaultroute
    leftauth=psk
    leftsubnet=0.0.0.0/0
    right=%any
    rightauth=psk
    rightauth2=xauth
    rightsourceip=10.31.2.0/24
    auto=add

conn networkmanager-strongswan
    keyexchange=ikev2
    left=%defaultroute
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=pubkey
    rightsourceip=10.31.2.0/24
    rightcert=client.cert.pem
    auto=add

conn ios_ikev2
    keyexchange=ikev2
    ike=aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048!
    esp=aes256-sha256,3des-sha1,aes256-sha1!
    rekey=no
    left=%defaultroute
    leftid=${vps_ip}
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=eap-mschapv2
    rightsourceip=10.31.2.0/24
    rightsendcert=never
    eap_identity=%any
    dpdaction=clear
    fragmentation=yes
    auto=add

conn windows7
    keyexchange=ikev2
    ike=aes256-sha1-modp1024!
    rekey=no
    left=%defaultroute
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=eap-mschapv2
    rightsourceip=10.31.2.0/24
    rightsendcert=never
    eap_identity=%any
    auto=add

bl-sun avatar Oct 11 '23 03:10 bl-sun

竟然还有回复 我都忘记我是什么时候配置的这个了 也用不到了

现在直接用wireguard简单方便

但是wireguard目前不如L2TP稳定,我测试过,云服务器搭建VPN服务,然后家里连接 用L2TP明显比wireguard稳定 但是L2TP我找了很久,没找到linux当客户端的教程,很多教程都没用,我就放弃了,后来就了解到了wireguard 而且L2TP有个问题就是一些云服务器只能同时建立一个连接,我现在买的这台服务器就是这样,我是通过购买按需使用的云服务器搭建测试的时候才发现的,贵的云服务器可以同时连接多个L2TP客户端,而我买的那台160多一年的云服务器就只能连接一个...........

建议大家还是用wireguard吧 真的,配置简单使用方便,而且十分符合网络工程师的思维

我怀疑之前的VPN协议都TM是一帮脑子不正常的天才想出来故意刁难使用者的

chainofhonor avatar Oct 19 '23 13:10 chainofhonor

补充一下上面稳定性的说法 并不是wireguard不能用了

而是 L2TP ping可以稳定在 比如9ms 然后wiraguard的ping 在9ms-20ms之间跳动,偶尔还能跳到30ms 不过不会断

我猜测可能是运营商对wireguard协议是当作普通UDP来看的,有QOS 而L2TP估计由于历史原因被特殊对待了 所以延迟才难么稳定

不过L2TP网络上的教程太少了,很多都不能用,至少我在rockylinux8的mimimal安装版上研究了几天没有成功的安装上L2TP客户端 目前我用一台windows server 2016虚拟机当L2TP客户端 然后进行端口转发 稳定性还行

其实完全可以用wireguard代替,不过考虑到我已经成功的搭建了L2TP,并且很稳定,我就没动了 未来如果有更多的需求而L2TP不能满足的时候或者L2TP也被QOS的时候我就会采用wiregurad了

至于新人,建议直接wireguard吧

chainofhonor avatar Oct 19 '23 13:10 chainofhonor

好的谢谢,如果有时间我去学习一下wireguard。目前这个strongswan搭建好了,现在设备普遍都是IKEv2,然后不知道怎么着就找到了这个一键配置的脚本。试了ubunt12/20/22。然后只有20可以一键配置。目前的话是可以满足我的需求了。你说的这个wireguard可以配置IKEv2吗?

bl-sun avatar Oct 19 '23 13:10 bl-sun