简单回顾一下,IPsec(IP Security,IP安全)是IETF制定的三层(网络层)隧道加密协议,也是一种三层VPN(Virtual Private Network,虚拟专用网络),它可以为互联网上传输的数据提供了高质量的、基于密码学的安全保证。
IPsec通过在特定通信方之间(例如两个安全网关之间)建立“通道”,来保护通信方之间传输的用户数据,该通道通常称为IPsec隧道。
在IPsec隧道中提供安全服务的是安全联盟(Security Association,SA),安全联盟是一个单一的“连接”,为其承载的流量提供安全服务。为了保护两个主机之间或两个安全网关之间的典型双向通信,一般需要两个安全联盟(每个方向一个)。
安全联盟通常有两种建立方式:手工方式和IKE自动协商方式。
手工方式即手工配置IPsec SA的所有信息。该方式的配置比较复杂,主要适用于需要安全通信的对等体数量较少,或小型静态的组网环境中。
IKE自动协商方式即对等体之间通过IKE协议自动协商生成SA,并由IKE协议维护该SA。与手工方式不同的是,IKE自动协商方式支持野蛮模式和NAT穿越,即建立SA的对等体中不需要所有对等体均具备静态IP地址,只要其中一方有静态IP地址,即可建立对等体连接。该方式适用于中、大型的动态网络环境,或没有静态IP地址,需要穿越NAT建立SA的场景。
在VPP中,主要使用IKEv2协议来实现自动协商生成SA。并且自17.04版本开始,发起方已经支持使用IKEv2来发起协商。
在正常情况下,IKEv2只需要进行两次交互,使用4条消息就可以完成一个IKEv2 SA和一对IPsec SA的协商建立,即第一阶段的交互生成IKEv2 SA,第二阶段的交互生成IPsec SA。
在穿越NAT的场景下,没有静态IP地址的一端无法使用IP地址来标识自己,但是可以通过FQDN(Fully Qualified Domain Name,完全合格域名)或RFC822来进行标识。
今天,我们来简单配置一下通过IP地址和IKEv2来建立IPsec隧道。
我们首先完成两台VPP的接口IP地址配置,保证两台VPP可以互通。
VPP72配置。
vppctl set int state eth1 up
vppctl set int ip address eth1 11.1.1.1/24
vppctl set int state eth2 up
vppctl set int ip address eth2 12.1.1.1/24
VPP73配置。
vppctl set int state eth1 up
vppctl set int ip address eth1 22.1.1.1/24
vppctl set int state eth2 up
vppctl set int ip address eth2 12.1.1.2/24
然后我们配置IKEv2 profile。
vppctl ikev2 profile add vppipsec
配置认证鉴权方式为PSK,密码设置为vppipsec。
vppctl ikev2 profile set vppipsec auth shared-key-mic string vppipsec
在VPP73上将本端和对端的ID信息均配置为IP地址。
vppctl ikev2 profile set vppipsec id local ip4-addr 12.1.1.1
vppctl ikev2 profile set vppipsec id remote ip4-addr 12.1.1.2
配置流量选择器,指定本端和对端的IP地址网段、端口、协议等信息。
vppctl ikev2 profile set vppipsec traffic-selector local ip-range 11.1.1.1 - 11.1.1.254 port-range 0 - 65535 protocol 0
vppctl ikev2 profile set vppipsec traffic-selector remote ip-range 22.1.1.1 - 22.1.1.254 port-range 0 - 65535 protocol 0
在VPP中,IKEv2角色区分为发起者和响应者,我们将VPP72配置为发起者,将VPP73配置为响应者。我们需要在发起者上配置响应者的IP地址信息,并提供可用于IKEv2和IPsec协商的密码套件信息,还可以设置生命周期等参数。
vppctl ikev2 profile set vppipsec responder eth2 12.1.1.2
vppctl ikev2 profile set vppipsec ike-crypto-alg aes-cbc 256 ike-integ-alg sha1-96 ike-dh modp-2048
vppctl ikev2 profile set vppipsec esp-crypto-alg aes-cbc 256 esp-integ-alg sha1-96 esp-dh ecp-256
vppctl ikev2 profile set vppipsec sa-lifetime 3600 10 5 0
对应的,我们配置一下响应者VPP73的相关配置。
vppctl ikev2 profile add vppipsec
vppctl ikev2 profile set vppipsec auth shared-key-mic string vppipsec
vppctl ikev2 profile set vppipsec id local ip4-addr 12.1.1.2
vppctl ikev2 profile set vppipsec id remote ip4-addr 12.1.1.1
vppctl ikev2 profile set vppipsec traffic-selector local ip-range 22.1.1.1 - 22.1.1.254 port-range 0 - 65535 protocol 0
vppctl ikev2 profile set vppipsec traffic-selector remote ip-range 11.1.1.1 - 11.1.1.254 port-range 0 - 65535 protocol 0
在发起者和响应者网络可达且配好了IKEv2策略之后,配置VPP72发起协商。
vppctl ikev2 initiate sa-init vppipsec
然后我们查看接口,发现多了一个ipip0的接口,这就是IPsec的隧道接口。
然后我们在VPP72上为该接口配置IP地址。
vppctl set interface state ipip0 up
vppctl set interface ip address ipip0 120.1.1.1/24
添加去往对端22.1.1.0/24的路由,指定下一跳出口为ipip0接口。
vppctl ip route add 22.1.1.0/24 via 120.1.1.2 ipip0
同理,在VPP73上配置IP地址和路由信息。
vppctl set interface state ipip0 up
vppctl set interface ip address ipip0 120.1.1.2/24
vppctl ip route add 11.1.1.0/24 via 120.1.1.1 ipip0
测试一下两个IPsec隧道接口的互通情况。
测试一下两端主机的互通情况。
抓包查看,报文已经全部是加密状态。
且外层报文头是两端隧道接口的IP地址,属于GRE over IPsec类型。
在VPP73上查看IKEv2的SA信息。
在VPP73上查看IPsec的SA信息。
还可以用show ipsec all命令,不过也没有什么其他信息可以展示了。