IPSec学习

IPsec介绍

IPSec是IETF(Internet Engineering Task Force,Internet工程任务组)的IPSec小组建立的一组IP安全协议集。IPSec定义了在网际层使用的安全服务,其功能包括数据加密、对网络单元的访问控制、数据源地址验证、数据完整性检查和防止重放攻击。

安全联盟SA
安全联盟是IPSec的基础,是通信双方建立的一种协定,决定了用来保护数据包的协议、转码方式、密钥以及密钥有效期等。
AH和ESP都要用到安全联盟,IKE的一个主要功能就是建立和维护安全联盟。

ISAKMP主要有三个过程:SA协商、密钥交换和认证。

IPSec的应用场景:
(1)Site-to-Site
(2)End-to-End
(3)End-to-Site

IPsec的3个重要协议- IKE/AH/ESP
IKE(Internet Key Exchange,因特网密钥交换)
IKE协议是一种基于UDP的应用层协议,它主要用于SA协商和密钥管理。

IKE协议分IKEv1和IKEv2两个版本,IKEv2与IKEv1相比,修复了多处公认的密码学方面的安全漏洞,提高了安全性能,同时简化了安全联盟的协商过程,提高了协商效率。

IKE协议属于一种混合型协议,它综合了ISAKMP(Internet Security Association and Key Management Protocol)、Oakley协议和SKEME协议这三个协议。其中,ISAKMP定义了IKE SA的建立过程,Oakley和SKEME协议的核心是DH(Diffie-Hellman)算法,主要用于在Internet上安全地分发密钥、验证身份,以保证数据传输的安全性。IKE SA和IPSec SA需要的加密密钥和验证密钥都是通过DH算法生成的,它还支持密钥动态刷新。

AH(Authentication Header,认证头)
AH协议用来对IP报文进行数据源认证和完整性校验,即用来保证传输的IP报文的来源可信和数据不被篡改,但它并不提供加密功能。AH协议在每个数据包的标准IP报文头后面添加一个AH报文头,AH协议对报文的完整性校验的范围是整个IP报文。

ESP(Encapsulating Security Payload,封装安全载荷)
ESP协议除了对IP报文进行数据源认证和完整性校验以外,还能对数据进行加密。ESP协议在每一个数据包的标准IP报头后方添加一个ESP报文头,并在数据包后方追加一个ESP尾(ESP Trailer和ESP Auth data)。ESP协议在传输模式下的数据完整性校验范围不包括IP头,因此它不能保证IP报文头不被篡改。

AH和ESP可以单独使用,也可以同时使用。AH和ESP同时使用时,报文会先进行ESP封装,再进行AH封装;IPsec解封装时,先进行AH解封装,再进行ESP解封装。

IPsec使用的端口
IPsec中IKE协议采用UDP 500端口发起和响应协商,因此为了使IKE协商报文顺利通过网关设备,通常要在网关设备上配置安全策略放开UDP 500端口。另外,在IPsec NAT穿越场景下,还需要放开UDP 4500端口。

而AH和ESP属于网络层协议,不涉及端口。为了使IPsec隧道能正常建立,通常还要在网关设备上配置安全策略放开AH(IP协议号是51)和ESP(IP协议号是50)服务。

图文介绍(转)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

通过StrongSwan搭建IPSec VPN实践

strongswan代码下载地址开源仓库 https://gitee.com/wq897/strongswan.git

本实验的strongswan的版本strongswan-5.9.1

编译和安装过程
strongswan官方wiki必需安装的依赖库如下:

Git
a recent GNU C compiler (>= 3.x)
automake
autoconf
libtool
pkg-config
gettext
perl
python
lex/flex
yacc/bison
gperf

安装完依赖库后进入git下载好的strongswan目录

./autogen.sh
./configure
make
make install

搭建拓扑环境

    | 192.168.0.1 | === | 192.168.0.2 |
         moon                sun

根据README生成CA公私钥和证书

ipsec pki --gen --type ed25519 --outform pem > strongswanKey.pem
ipsec pki --self --ca --lifetime 3652 --in strongswanKey.pem \
               --dn "C=CH, O=strongSwan, CN=strongSwan Root CA" \
               --outform pem > strongswanCert.pem

在moon端配置如下:

/usr/local/etc/swanctl/x509ca/strongswanCert.pem
/usr/local/etc/swanctl/x509/moonCert.pem
/usr/local/etc/swanctl/private/moonKey.pem
/usr/local/etc/swanctl/swanctl.conf

moonKey.pem生成过程如下:

ipsec pki --gen --type ed25519 --outform pem > moonKey.pem

moonCert.pem生成过程如下:

ipsec pki --req --type priv --in moonKey.pem \
              --dn "C=CH, O=strongswan, CN=moon.strongswan.org" \
              --san moon.strongswan.org --outform pem > moonReq.pem
ipsec pki --issue --cacert strongswanCert.pem --cakey strongswanKey.pem \
                --type pkcs10 --in moonReq.pem --serial 01 --lifetime 1826 \
                --outform pem > moonCert.pem

/usr/local/etc/swanctl/swanctl.conf内容如下:

    connections {
        host-host {
            remote_addrs = 192.168.0.2

            local {
                auth=pubkey
                certs = moonCert.pem
            }
            remote {
                auth = pubkey
                id = "C=CH, O=strongSwan, CN=sun.strongswan.org"
            }
            children {
                net-net {
                    start_action = trap
                }
            }
        }
    }

在sun端配置类似如下:

/usr/local/etc/swanctl/x509ca/strongswanCert.pem
/usr/local/etc/swanctl/x509/sunCert.pem
/usr/local/etc/swanctl/private/sunKey.pem
/usr/local/etc/swanctl/swanctl.conf

sunKey.pem生成过程如下:

ipsec pki --gen --type ed25519 --outform pem > sunKey.pem

sunCert.pem生成过程如下:

ipsec pki --req --type priv --in sunKey.pem \
              --dn "C=CH, O=strongswan, CN=sun.strongswan.org" \
              --san sun.strongswan.org --outform pem > sunReq.pem
ipsec pki --issue --cacert strongswanCert.pem --cakey strongswanKey.pem \
                --type pkcs10 --in sunReq.pem --serial 01 --lifetime 1826 \
                --outform pem > sunCert.pem

/usr/local/etc/swanctl/swanctl.conf内容如下:

        connections {
            host-host {
                remote_addrs = 192.168.0.1

                local {
                    auth = pubkey
                    certs = sunCert.pem
                }
                remote {
                    auth = pubkey
                    id = "C=CH, O=strongSwan, CN=moon.strongswan.org"
                }
                children {
                    host-host {
                        start_action = trap
                    }
                }
            }
        }

分别在moon端和sun端开启ipsec服务并建立连接

sudo ipsec start
sudo swanctl --load-all
sudo ipsec up host-host
initiating IKE_SA host-host[6] to 192.168.0.1
generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]
sending packet: from 192.168.0.1[500] to 192.168.0.2[500] (392 bytes)
received packet: from 192.168.0.2[500] to 192.168.0.1[500] (273 bytes)
parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ]
selected proposal: IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_AES128_XCBC/CURVE_25519
received cert request for "C=CH, O=strongswan, CN=strongswan Root CA"
sending cert request for "C=CH, O=strongswan, CN=strongswan Root CA"
authentication of 'C=CH, O=strongswan, CN=moon.strongswan.org' (myself) with ED25519 successful
sending end entity cert "C=CH, O=strongswan, CN=moon.strongswan.org"
establishing CHILD_SA net-net{2}
generating IKE_AUTH request 1 [ IDi CERT N(INIT_CONTACT) CERTREQ IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
sending packet: from 192.168.0.1[4500] to 192.168.0.2[4500] (960 bytes)
received packet: from 192.168.0.2[4500] to 192.168.0.1[4500] (720 bytes)
parsed IKE_AUTH response 1 [ IDr CERT AUTH SA TSi TSr N(MOBIKE_SUP) N(ADD_4_ADDR) N(ADD_4_ADDR) ]
received end entity cert "C=CH, O=strongswan, CN=sun.strongswan.org"
  using certificate "C=CH, O=strongswan, CN=sun.strongswan.org"
  using trusted ca certificate "C=CH, O=strongswan, CN=strongswan Root CA"
checking certificate status of "C=CH, O=strongswan, CN=sun.strongswan.org"
certificate status is not available
  reached self-signed root ca with a path length of 0
authentication of 'C=CH, O=strongSwan, CN=sun.strongswan.org' with ED25519 successful
IKE_SA host-host[6] established between 192.168.0.1[C=CH, O=strongswan, CN=moon.strongswan.org]...192.168.0.2[C=CH, O=strongSwan, CN=sun.strongswan.org]
scheduling rekeying in 13694s
maximum IKE_SA lifetime 15134s
selected proposal: ESP:AES_CBC_128/HMAC_SHA2_256_128/NO_EXT_SEQ
CHILD_SA net-net{2} established with SPIs cee4995b_i c6c80cce_o and TS 192.168.0.1/32 === 192.168.0.2/32
connection 'host-host' established successfully

moon端与sun端建立连接并数据抓包交互过程
在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值