记录一下-关于IKEV2协议的部署和app调试-

IPSEC协议

  互联网安全协议(Internet Protocol Security,IPSec)是一个[协议]包,通过对[IP协议]的[分组]进行[加密]和[认证]来保护IP协议的网络传输协议簇(一些相互关联的协议的集合)。

IPSec是IETF(Internet Engineering Task Force,即国际互联网工程技术小组)提出的使用密码学额保护IP层通信的安全保密架构 ,是一个协议簇,通过对[IP协议]的[分组]进行[加密]和[认证]来保护IP协议的[网络传输协议]簇(一些相互关联的协议的集合)。

IPSec可以实现以下4项功能:
①数据机密性:IPSec发送方将包加密后再通过网络发送。
② 数据完整性:IPSec可以验证IPSec发送方发送的包,以确保数据传输时没有被改变。
③数据认证:IPSec接受方能够鉴别IPsec包的发送起源。此服务依赖数据的完整性。
④反重放:IPSec接受方能检查并拒绝重放包。 

IPSec主要由以下[协议])组成:

一、认证头(AH),为[IP数据报]提供无连接[数据完整性]、[消息认证]以及防[重放攻击]保护;

二、封装安全载荷(ESP),提供机密性、数据源认证、无连接完整性、防重放和有限的传输流(traffic-flow)机密性;

三、安全关联(SA),提供算法和数据包,提供AH、ESP操作所需的参数。

四、密钥协议(IKE),提供对称密码的钥匙的生存和交换。

来源:百度百科

IKEv2介绍:

定义在RFC4306 ,更新与 RFC 5996.
不兼容IKEv1,IKEv1不支持认证,IKEv2支持认证,EAP。
支持NAT穿越。
IKEv2支持私密性、完整性、源认证。
工作在UDP 的 500 /4500端口。NAT-T用的是UDP4500端口。

IKE的安全机制:

  • 身份认证

    确认通信算双方的身份(对等体的IP地址或者名称),包括:

    预共享密钥PSK(pre-shared key)认证。

    数字签名RSA(rsa-signature)认证。

  • 身份保护

  • DH(Diffie-Hellman)密钥交换算法

  • 完善的向前安全性PFS(Perfect Forward Secrecy)

    短暂的一次性密钥系统称为“完美向前保密”

    在IPSec里,PFS是通过在IPSec SA协商阶段重新进行一个DH交换来实现的。

总结:不对具体的协议协商过程进行解释,

IKEv1的主要问题:

不支持远程用户接入
协商建立IPSec SA的时间太长
IKEv2的改进:

IKEv1是一个混合型协议,其自身的复杂性不可避免地带来一些安全及性能上的缺陷,已经成为目前实现IPSec系统的瓶颈。
IKEv2协议保留了IKEv1的基本功能,并针对IKEv1研究过程中发现的问题进行修订,同时兼顾简洁性、高效性、安全性和见健壮性的需要,整合了IKEv1的相关文档,由RFC4306单个文档替代。通过核心功能最小化规定,新协议极大提高了不同IPSec VPN系统的互操作性。
IKEv2与IKEv1相比有以下优点:

简化了安全联盟的协商过程,提高了协商效率。

IKEv1使用两个阶段为IPSec进行密钥协商并建立IPSec SA:第一阶段,通信双方协商和建立IKE本身使用的安全通道,建立一个IKE SA;第二阶段,利用这个已通过了认证和安全保护的安全通道,建立一对IPSec SA。IKEv2则简化了协商过程,在一次协商中可直接生成IPSec的密钥并建立IPSec SA。

修复了多处公认的密码学方面的安全漏洞,提高了安全性能。

加入对EAP(Extensible Authentication Protocol)身份认证方式的支持,提高了认证方式的灵活性和可扩展性。

EAP是一种支持多种认证方法的认证协议,可扩展性是其最大的优点,即若想加入新的认证方式,可以像组件一样加入,而不用变动原来的认证体系。当前EAP认证已经广泛应用于拨号接入网络中。

通过EAP协议解决了远程接入用户的认证问题,彻底摆脱了L2TP的牵制。目前IKEv2已经广泛应用于远程接入网络中了。

相关的L2TP

该协议是一种工业标准的Internet隧道协议,功能大致和PPTP协议类似,比如同样可以对网络数据流进行加密。
不过也有不同之处,比如PPTP要求网络为IP网络,L2TP要求面向数据包的点对点连接;
PPTP使用单一隧道,L2TP使用多隧道;L2TP提供包头压缩、隧道验证,而PPTP不支持。
L2TP协议是由IETF起草,微软、Ascend、Cisco、3COM等公司参予制定的二层隧道协议,它结合了PPTP和L2F两种二层隧道协议的优点,为众多公司所接受,已经成为IETF有关2层通道协议的工业标准,基于微软的点对点隧道协议 (PPTP)和思科2层转发协议(L2F)之上的,被一个因特网服务提供商和公司使用使这个虚拟私有网络的操作能够通过因特网。

主要应用

在VPN连接中要设置L2TP连接,方法同PPTP VPN设置,同样是在VPN连接属性窗口的“网络”选项卡中,将VPN类型设置为“L2TP IPSec VPN”即可。   第二层隧道协议(L2TP)是用来整合多协议拨号服务至现有的因特网服务提供商点。 PPP 定义了多协议跨越第二层点对点链接的一个封装机制。特别地,用户通过使用众多技术之一(如:拨号 POTS、ISDN、ADSL 等)获得第二层连接到网络访问服务器(NAS),然后在此连接上运行 PPP。在这样的配置中,第二层终端点和 PPP 会话终点处于相同的物理设备中(如:NAS)。   L2TP 扩展了 PPP 模型,允许第二层和 PPP 终点处于不同的由包交换网络相互连接的设备来。通过 L2TP,用户在第二层连接到一个访问集中器(如:调制解调器池、ADSL DSLAM 等),然后这个集中器将单独得的 PPP 帧隧道到 NAS。这样,可以把 PPP 包的实际处理过程与 L2 连接的终点分离开来。   对于这样的分离,其明显的一个好处是,L2 连接可以在一个(本地)电路集中器上终止,然后通过共享网络如帧中继电路或英特网扩展逻辑 PPP 会话,而不用在 NAS 上终止。从用户角度看,直接在 NAS 上终止 L2 连接与使用 L2TP 没有什么功能上的区别。L2TP 协议也用来解决“多连接联选组分离”问题。多链接 PPP,一般用来集中 ISDN B 通道,需要构成多链接捆绑的所有通道在一个单网络访问服务器(NAS)上组合。因为 L2TP 使得 PPP 会话可以出现在接收会话的物理点之外的位置,它用来使所有的通道出现在单个的 NAS 上,并允许多链接操作,即使是在物理呼叫分散在不同物理位置的 NAS 上的情况下。   L2TP 使用以下两种信息类型,即控制信息和数据信息。控制信息用于隧道和呼叫的建立、维持和清除。数据信息用于封装隧道所携带的 PPP 帧。控制信息利用 L2TP 中的一个可靠控制通道来确保发送。当发生包丢失时,不转发数据信息。   

协议结构

  L2TP 命令头 : 12 16 32 bit T L X X S X O P X X X X VER Length Tunnel ID Session ID Ns (opt) Nr (opt) Offset Size (opt) Offset Pad (opt) T ― T 位表示信息类型。若是数据信息,该值为0;若是控制信息,该值为1。 L ― 当设置该字段时,说明 Length 字段存在,表示接收数据包的总长。对于控制信息,必须设置该值。 X ― X 位为将来扩张预留使用。在导出信息中所有预留位被设置为0,导入信息中该值忽略。 S ― 如果设置 S 位,那么 Nr 字段和 Ns 字段都存在。对于控制信息,S 位必须设置。 O ― 当设置该字段时,表示在有效负载信息中存在 Offset Size 字段。对于控制信息,该字段值设为0。 P - 如果 Priority (P)位值为1,表示该数据信息在其本地排队和传输中将会得到优先处理。 Ver ― Ver 位的值总为002。它表示一个版本1 L2TP 信息。 Length ― 信息总长,包括头、信息类型 AVP 以及另外的与特定控制信息类型相关的 AVPs。 Tunnel ID ― 识别控制信息应用的 Tunnel。如果对等结构还没有接收到分配的 Tunnel ID,那么 Tunnel ID 必须设置为0。一旦接收到分配的 Tunnel ID,所有更远的数据包必须和 Tunnel ID 一起被发送。 Call ID ― 识别控制信息应用的 Tunnel 中的用户会话。如果控制信息在 Tunnel 中不应用单用户会话(例如,一个 Stop-Control-Connection-Notification 信息),Call ID 必须设置为0。 Nr ― 期望在下一个控制信息中接收到的序列号。 Ns ― 数据或控制信息的序列号。 Offset Size & Pad ― 该字段规定通过 L2F 协议头的字节数,协议头是有效负载数据起始位置。Offset Padding 中的实际数据并没有定义。如果 Offset 字段当前存在,那么 L2TP 头 Offset Padding 的最后八位字节后结束。

  与PPTP的不同

 PPTP和L2TP都使用PPP协议对数据进行封装,然后添加附加包头用于数据在互联网络上的传输。尽管两个协议非常相似,但是仍存在以下几方面的不同: 
 1.PPTP要求互联网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接。L2TP可以在IP(使用UDP),桢中继永久虚拟电路(PVCs),X.25虚拟电路(VCs)或ATM VCs网络上使用。
 2.PPTP只能在两端点间建立单一隧道。L2TP支持在两端点间使用多隧道。使用L2TP,用户可以针对不同的服务质量创建不同的隧道。
 3.L2TP可以提供包头压缩。当压缩包头时,系统开销(overhead)占用4个字节,而PPTP协议下要占用6个字节。
 4.L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP或PPTP与IPSEC共同使用时,可以由IPSEC提供隧道验证,不需要在第2层协议上验证隧道 

来源:移动通信原理

部署和调试

CentOS 7.4 简单快速搭建Strongswan IKEv2类型 教程模板

1、安装strongswan

yum install strongswan

手动安装

官网下载:https://pkgs.org/download/strongswan
如果提示没有包,到下方地址下载,然后使用 yum install strongswan-5.7.2-1.el7.aarch64.rpm 安装

链接: https://pan.baidu.com/s/1VcaOwzHutH9mlAE6lMu2HQ 密码: 5ofb

2、创建证书

strongswan pki --gen --outform pem > ca.key.pem
strongswan pki --self --in ca.key.pem --dn "C=CN, O=one, CN=one t CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
strongswan pki --gen --outform pem > server.key.pem
strongswan pki --pub --in server.key.pem --outform pem > server.pub.pem
strongswan pki --pub --in server.key.pem | strongswan pki --issue --lifetime 3601 --cacert ca.cert.pem --cakey ca.key.pem --dn "C=CN, O=one, CN=one t CA" --san="你的服务器公网ip" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem

3、安装证书

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

4、配置

vi /etc/strongswan/ipsec.conf
config setup  
    uniqueids=never #允许多个客户端使用同一个证书
 
conn %default  #定义连接项, 命名为 %default 所有连接都会继承它
    compress = yes #是否启用压缩, yes 表示如果支持压缩会启用.
    dpdaction = clear #当意外断开后尝试的操作, hold, 保持并重连直到超时.
    dpddelay = 30s #意外断开后尝试重连时长
    dpdtimeout = 60s #意外断开后超时时长, 只对 IKEv1 起作用
    inactivity = 300s #闲置时长,超过后断开连接.
    leftdns = 8.8.8.8,8.8.4.4 #指定服务端与客户端的dns, 多个用","分隔
    rightdns = 8.8.8.8,8.8.4.4
 
conn IKEv2-BASE
    leftca = "C=CN, O=one, CN=one t CA" #服务器端根证书DN名称,与 --dn 内容一致 
    leftsendcert = always #是否发送服务器证书到客户端
    rightsendcert = never #客户端不发送证书
 
conn IKEv2-EAP  
    keyexchange=ikev2       #默认的密钥交换算法, ike 为自动, 优先使用 IKEv2
    left=%any       #服务器端标识,%any表示任意  
    leftid= 你的服务器公网ip     #服务器端ID标识,你的服务器公网ip  
    leftsubnet=0.0.0.0/0        #服务器端虚拟ip, 0.0.0.0/0表示通配.  
    leftcert = server.cert.pem     #服务器端证书  
    leftauth=pubkey     #服务器校验方式,使用证书  
    right=%any      #客户端标识,%any表示任意  
    rightsourceip = 20.1.0.0/16    #客户端IP地址分配范围  
    rightauth=eap-mschapv2  #eap-md5#客户端校验方式#KEv2 EAP(Username/Password)   
    also=IKEv2-BASE
    eap_identity = %any #指定客户端eap id
    rekey = no #不自动重置密钥
    fragmentation = yes #开启IKE 消息分片
    auto = add  #当服务启动时, 应该如何处理这个连接项. add 添加到连接表中.
 
#ios 和 mac Psk连接,无需证书 (EAP账号密码及psk)
#android Psk 连接,无需证书(XAUTH账户密码及psk)
conn Android_Ios_Mac_XauthPSK
     keyexchange=ikev1
     ike=aes128-aes256-sha1-modp3072-modp2048,3des-sha1-md5-modp1024,aes256-sha512-modp4096,aes128-sha256-modp3072
     esp=aes128-sha1,aes256-sha256_96,3des-sha1,aes256-sha1
     left=%defaultroute
     leftauth=psk
     leftsubnet=0.0.0.0/0
     right=%any
     rightauth=psk
     rightauth2=xauth
     rightsourceip=20.1.0.0/16
     auto=add

5、修改配置 (旧版,可选)

vi /etc/strongswan/strongswan.d/charon.conf
charon {
    duplicheck_enable = no #同时连接多个设备,把冗余检查关闭.
    i_dont_care_about_security_and_use_aggressive_mode_psk = yes
    # windows 公用 dns
    dns1 = 8.8.8.8
    dns2 = 8.8.4.4
 
    #以下是日志输出, 生产环境请关闭.
    filelog {
        /var/log/charon.log {
            # add a timestamp prefix
            time_format = %b %e %T
            # prepend connection name, simplifies grepping
            ike_name = yes
            # overwrite existing files
            append = no
            # increase default loglevel for all daemon subsystems
            default = 1
            # flush each line to disk
            flush_line = yes
        }
    }
}
  1. 修改配置 (新版)
vi /etc/strongswan/strongswan.conf
charon {
        load_modular = yes
        i_dont_care_about_security_and_use_aggressive_mode_psk = yes
        compress = yes
        plugins {
                 duplicheck{
                            enable=no
                 }
                include strongswan.d/charon/*.conf
        }
 
}
include strongswan.d/*.conf

5-1.(新版)打开另一连接窗口 显示strongswan 所产生的日志(两种)

journalctl -f -u strongswan
tail -f /var/log/messages

6、配置用户和密码

vi /etc/strongswan/ipsec.secrets
# ipsec.secrets - strongSwan IPsec secrets file
#使用证书验证时的服务器端私钥
#格式 : RSA  [  | %prompt ]
: RSA server.key.pem
 
#使用预设加密密钥, 越长越好
#格式 [  ] : PSK 
: PSK "pOneAA123456"
 
#EAP 方式, 格式同 psk 相同 (用户名/密码 例:oneAA/oneTT)
eOneAA : EAP "eOneTT"
 
#XAUTH 方式, 只适用于 IKEv1
#格式 [  ]  : XAUTH ""
xOneAA : XAUTH "xOneTT"

7、开启内核转发

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding=1
sysctl -p

配置 伪装 及 添加隧道:( GCP专用,阿里云不用配置此项)

① 添加udp 端口

firewall-cmd --permanent --add-port=500-4500/udp
firewall-cmd --permanent --add-masquerade

② 调整MTU-MSS、添加GRE,否则隧道失败:

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -p tcp -i eth0 -j TCPMSS --syn --set-mss 1299

查看是否已添加防火墙参数

firewall-cmd --get-active
firewall-cmd --get-default
vi /etc/firewalld/direct.xml

8、配置防火 (阿里云)

vi /etc/firewalld/zones/public.xml
复制代码


  Public
  For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
  
  
  
  
  
  
    
    
    
    
     
                                                                                                                                                                                          
    
    
      
      
    
    
      
     
   
  

9、开启 防火墙/strongswan 以及 自动启动

systemctl enable firewalld
systemctl start firewalld
systemctl enable strongswan
systemctl start strongswan

10、阿里云开放端口
登录阿里云管理控制台- -> 云服务器ECS- ->网络和安全- ->安全组- ->添加安全组规则:
授权策略:允许
协议类型:自定义UDP
端口范围:500/4500
授权类型:地址段访问
授权对象:0.0.0.0/0
优先级:100
描述:随便填

注意!添加完成后必须 重启 服务器

XauthPSK 连接: Android 使用 XAUTH 账户密码及psk 连接
Mac 和 Ios 使用 EAP 账户密码及psk 连接

11、证书安装及连接,用ftp工具(例:FileZilla)下载

/etc/strongswan/ipsec.d/cacerts/ca.cert.pem 

证书到本地。
ios证书安装:将之前创建的 ca.cert.pem 用 ftp 导出 , 写邮件以附件的方式发到邮箱, 在ios Safari浏览器登录邮箱, 下载附件, 安装证书。
步骤:
例:类型:IKEv2
描述:随便填
服务器:你的服务器公网ip
远程ID:你的服务器公网ip
本地ID:不用填,空着
选择- ->用户名,填写-用户名-密码 - ->点击--完成

mac证书安装:双击 ca.cert.pem -->选中你的证书-->显示简介-->信任-->始终信任(然后会弹框填写mac登录密码)。
步骤:系统编好设置- ->网络- ->左侧点击+号- ->接口:IKEv2 - ->服务名称:随便填- ->点击 创建。
接下来填写账户密码地址 例:服务器地址:你的服务器公网ip
远程ID:你的服务器公网ip
本地ID:不用填,空着

                                    点击- -鉴定设置- ->选择- ->用户名,填写-用户名-密码 - ->点击--连接

android:去strongswan官网下载安装 例:https://download.strongswan.org/Android/strongSwan-1.9.6.apk
或:https://download.csdn.net/download/qq_29364417/10482582
或者编译源码:https://github.com/strongswan/strongswan/tree/master/src/frontends/android
步骤:右上角选项-->CA证书-->再选择右上角选项-->导入证书-->找到ca.cert.pem点击即可。
回到主界面-->添加配置-->例:服务器地址:你的服务器公网ip
类型:IKEv2 EAP(用户名/密码),填写用户名和密码
CA证书:选择刚才导入的ca.cert.pem证书
点击右上角--保存

                                                       回到主界面--点击配置连接即可

Windows10 连接的坑:

  1. windows的vpn虚拟网卡默认mtu是1400

现象:如果服务端的mtu小于1400的话,会出现能ping通地址,但是网页不能打开的问题
解决办法:修改vpn虚拟网卡mtu值
连接vpn后,以管理员身份执行以下命令

netsh interface ipv4 set subinterface "vpn名称" mtu=1350 store=persistent

  1. windows默认不支持DH2048_AES256协商协议

现象:提示策略匹配错误
解决办法:添加注册表项,不需要重启生效

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters里新建类型为DWORD的NegotiateDH2048_AES256 键,值设置为1

0 禁用AES-256-CBC和MODP-2048
1 启用AES-256-CBC和MODP-2048
2 强制使用AES-256-CBC和MODP-2048

  1. windows默认不支持Symmetric NAT类型路由器后的ikev2服务器

现象:提示809错误,或者提示路由器不支持nat
解决办法:添加注册表项,并需要重启生效

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent里新建类型为DWORD的AssumeUDPEncapsulationContextOnSendRule 键,值设置为2

0
A value of 0 (zero) configures Windows so that it cannot establish security associations with servers that are located behind NAT devices. This is the default value.
1
A value of 1 configures Windows so that it can establish security associations with servers that are located behind NAT devices.
2
A value of 2 configures Windows so that it can establish security associations when both the server and the Windows Vista-based or Windows Server 2008-based VPN client computer are behind NAT devices.

  1. windows手动添加的vpn默认没有开启默认路由现象:
    连接成功,但是对外ip没有改变
    解决办法:手动添加修改或者使用powershell新建vpn连接,手动路径:控制面板网络和 Internet网络连接,vpn网卡,属性,网络,ipv4,属性,高级,勾选在远程网络上使用默认网关
  2. windows10默认开启了smart multi-homed name resolution功能

现象:有线网络下连接vpn后不使用vpn的dns
解决办法:修改vpn网卡的跃点数,小于有线网卡即可。脚本自动解决待更新

批处理脚本如下,实际是使用批处理调用powershell命令,由于需要修改注册表,需要管理员权限运行
install.cmd
powershell脚本,需要以管理员身份运行powershell然后执行install.ps1

资料来源于网络,证明确实可用.

主要调试了ios

使用

#import 

@interface ViewController ()
@property (nonatomic, strong) NEVPNManager *manage;
@end

注意:
1.500端口和4500端口
2.NAT问题

常用的命令:
运行ip xfrm policy,查看路由策略。可以看到路由已建立。

ip xfrm policy

systemctl restart strongswan
systemctl stauts strongswan -l
ifconfig

你可能感兴趣的:(记录一下-关于IKEV2协议的部署和app调试-)