×

使用StrongSwan配置IPSec (net2net-rsa 证书)

hqy hqy 发表于2019-04-14 02:07:42 浏览3977 评论0

抢沙发发表评论

https://blog.csdn.net/puppylpg/article/details/64918562

使用StrongSwan对IPSec进行研究,是一种很好的理解IPSec的实践。然而StrongSwan在使用的过程中实在是有太多的坑,网上的教程也多有不完整的地方,几乎没有能彻彻底底说明白每一步的,导致我在使用StrongSwan的过程中各种抓耳挠腮。程序员自然要造福程序员,在这里特将StrongSwan使用中所遇到的完整步骤记录下来,希望有所帮助。


准备工作

准备工作可不是简单地装个StrongSwan就完事儿了的,不知道要准备些什么,直接去看StrongSwan的配置,其实也是白搭的,最终还是什么都搞不出来,白忙活一场。其实准备工作的工作量还是挺大的:


准备一:场景

想知道怎么配置StrongSwan,首先要知道自己想搭建一个什么样的场景。在StrongSwan的官网上,我们可以在左侧找到TestScenarios,这里有许多场景,我们需要决定我们到底要再现哪一个。进去之后点开strongSWan test suits,在https://www.strongswan.org/testresults.html中有很多列表,我们打开ikev2,选择其中的net2net-psk和net2net-rsa进行场景再现。


准备二:组网

 

从net2net-psk的组网图,我们可以看到我们至少需要两个客户机Alice和Bob,两个网关Moon和Sun。net2net-rsa的组网与此相同。因此可以创建四台虚拟机ABCD,其中BC作为两个网关,AD作为左右子网的客户机。


总体为:A --子网1-- B ==子网2== C --子网3-- D


虚拟机使用VMware创建,在这里使用的是vmware12,虚拟机系统为Ubuntu16.10。


步骤:


装机 

安装一台虚拟机;


克隆 

在创建完虚拟机A之后,使用VMware的Clone直接克隆出BCD,比较方便;


调整网卡 

BC要作为网关存在,所以需要有两块网卡,因此要在设置里给BC再添加一块网卡;


配置网段 

在VMware的Edit选项中,选择Virtual Network Editor,添加三个虚拟网段vmnet2/vmnet3/vmnet4,类型为Host-Only,添加网段为上图的子网123的网段;DHCP选项关掉,不让自主分配IP;


虚拟机接入子网 

将虚拟机A的网卡类型设置为Custom,选择vmnet2,则A接入子网1,将B的两块网卡一块设为vmnet2,一块设为vmnet3,则B同时接入了子网1和子网2;同理,设置C和D;


配置虚拟机 

四台机器都开机,使用图形界面,照着上图配置机器的IP地址和子网掩码,其中A和D别忘了配置默认网关为B和C的IP,毕竟B和C是充当网关的;


开启转发 

非常重要,既然B和C充当网关,需要在B和C中修改/etc/sysctl.conf文件,将net.ipv4.ip_forward=1那一行的注释取消,这样才能发挥其路由器的功能。


准备三:安装StrongSwan

组网完成之后,才到了装StrongSwan的步骤了。Ubuntu装StrongSwan很简单,直接 sudo apt-get install strongswan即可。


至此,准备工作才算完毕。其中,光组网这一部就要费不少功夫。


Tips: 

一定别忘了给四台Ubuntu虚拟机配置和宿主机之间的双向复制粘贴功能,也别忘了和宿主机设置一个共享文件夹,要不然接下来往虚拟机里加东西是很痛苦的!建议安装VMware提供的增强工具,具体可以自行搜索。如果还是不行别忘了sudo apt-get install open-vm-tools-desktop。


配置

配置net2net-psk

先说psk的配置,因为psk的配置很简单。只需要使用Pre-Shared-Key进行认证就行了。这个预先设置好的key放在了ipsec.secrets中。


配置文件

配置网关B 

只需要把https://www.strongswan.org/testing/testresults/ikev2/net2net-psk/index.html上所提供的moon的ipsec.conf、ipsec.secrets和strongswan.conf三个配置文件分别放到网关B的/etc/ipsec.conf、/etc/ipsec.secrets和/etc/strongswan.conf的位置即可。

配置网关C 

同B。只不过这次使用sun的配置文件。

启动

启动之前,A和D分别在不同的子网下,显然是不可能ping通的。


网关Bsudo ipsec start或sudo ipsec restart,启动/重启StrongSwan,C也一样;

在网关B或C中运行sudo ipsec up net-net,即开启名字为net-net的连接,而net-net的具体配置在ipsec.conf中。

如果没什么意外,会显示隧道建立成功的提示,这时候使用sudo iptables -nvL --line-numbers可以看到网关的iptables中多了两条转发规则:


lgl@A ~> sudo iptables -nvL --line-numbers

Chain INPUT (policy ACCEPT 26 packets, 2100 bytes)

num   pkts bytes target     prot opt in     out     source               destination         


Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

num   pkts bytes target     prot opt in     out     source               destination         

1        0     0 ACCEPT     all  --  ens38  *       10.1.0.0/24          10.2.0.0/24          policy match dir in pol ipsec reqid 1 proto 50

2        0     0 ACCEPT     all  --  *      ens38   10.2.0.0/24          10.1.0.0/24          policy match dir out pol ipsec reqid 1 proto 50


Chain OUTPUT (policy ACCEPT 27 packets, 3056 bytes)

num   pkts bytes target     prot opt in     out     source               destination         

1

2

3

4

5

6

7

8

9

10

11

正是有了这两条规则,再试试拿主机A去ping主机D,二者可以通了。


配置net2net-rsa

配置rsa比较麻烦,主要是rsa需要进行公钥私钥的认证,还要有CA签发证书。具体的原理需要学习“非对称加密”,这里只说如何配置。


生成必要证书

建议在宿主机生成到和虚拟机的共享文件夹中,然后在虚拟机中将文件放到合适的位置。以下所有的命令均需要root权限,要不然会报错:command not found: ipsec。


生成CA证书 

生成私钥:


ipsec pki --gen --outform pem > ca.pem

1

自签发CA证书:


ipsec pki --self --in ca.pem --dn "C=CN, O=NetworkLab, CN=NetworkLab CA" --ca --outform pem > ca.cert.pem

1

这里–self表示自签证书,–in是输入的私钥,–dn是判别名,–ca表示生成 CA,其它同上。 

- C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道 

- O 表示组织名 

- CN 为通用名


生成服务器证书 

其实就是给我们的网关B和C生成证书。这里,我们让B代表moon,C代表sun。 

以sun为例 

私钥:


ipsec pki --gen --outform pem > sun.server.pem

1

签发服务器证书:


ipsec pki --pub --in sun.server.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=CN, O=NetworkLab, CN=sun.com" --san="sun.com" --flag serverAuth --flag ikeIntermediate --outform pem > sun.server.cert.pem

1

moon 

同sun,不过要把所有的字符串sun换成moon。


ipsec pki --pub --in sun.server.pem就是从刚生成的私钥里把公钥提取出来。然后我们用公钥去进行后面的服务器证书签发。


生成客户端证书 

同生成服务器的证书相对应,也是分为B和C的,这里依旧以sun为例。 

sun 

私钥:


ipsec pki --gen --outform pem > sun.client.pem

1

签发客户端证书:


ipsec pki --pub --in sun.client.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=CN, O=NetworkLab, CN=client" --outform pem > sun.client.cert.pem

1

moon 

同sun,不过要把所有的字符串sun换成moon。


至此,我们生成了以下文件:


ca.cert.pem

ca.pem


moon.client.pem

moon.server.cert.pem

moon.server.pem

moon.client.cert.pem


sun.client.pem

sun.client.cert.pem  

sun.server.pem  

sun.server.cert.pem

1

2

3

4

5

6

7

8

9

10

11

12

配置文件

安装证书

B和C两个网关是互为server和client的,因此,对于B来讲,它需要有: 

1. CA证书(认证用) 

2. moon的server私钥、moon的server证书(因为B是作为C的服务器,接收C的请求的) 

3. sun的client私钥、sun的client证书(因为B同时作为C客户端,向C发出请求)


C则类似,但恰好相反:CA证书、sun的server私钥和证书、moon的client私钥和证书。


理清了这个关系之后,我们就把证书放到相应的位置。 

对于B:


cp -r ca.cert.pem /etc/ipsec.d/cacerts/

cp -r moon.server.cert.pem /etc/ipsec.d/certs/

cp -r moon.server.pem /etc/ipsec.d/private/

cp -r sun.client.cert.pem /etc/ipsec.d/certs/

cp -r sun.client.pem /etc/ipsec.d/private/

1

2

3

4

5

C同理,不再赘述。


设置配置文件

这一步骤同psk的配置文件的安放位置是相同的,不再赘述,但是这里我们需要修改几个地方,因为我们的证书名称以及@id的名称都跟官网的略有区别,为了方便参考,将修改后的文件贴出来: 

B:


lgl@A ~/s/n2n-rsa> cat /etc/ipsec.conf

# /etc/ipsec.conf - strongSwan IPsec configuration file


config setup


conn %default

    ikelifetime=60m

    keylife=20m

    rekeymargin=3m

    keyingtries=1

    keyexchange=ikev2

    mobike=no


conn net-net

    left=192.168.0.1

    leftcert=moon.server.cert.pem

    leftsubnet=10.1.0.0/24

    leftid=@moon.com

    leftfirewall=yes

    right=192.168.0.2

    rightsubnet=10.2.0.0/24

    rightid=@sun.com

    auto=add

lgl@A ~/s/n2n-rsa> cat /etc/ipsec.secrets

# /etc/ipsec.secrets - strongSwan IPsec secrets file


: RSA moon.server.pem

lgl@A ~/s/n2n-rsa> cat /etc/strongswan.conf

# /etc/strongswan.conf - strongSwan configuration file


charon {

  load = aes des sha1 sha2 md5 pem pkcs1 gmp random nonce x509 curl revocation hmac stroke kernel-netlink socket-default updown

  multiple_authentication = no

  signature_authentication = no

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

C:


lgl@A ~> cat /etc/ipsec.conf

# /etc/ipsec.conf - strongSwan IPsec configuration file


config setup


conn %default

    ikelifetime=60m

    keylife=20m

    rekeymargin=3m

    keyingtries=1

    keyexchange=ikev2

    mobike=no


conn net-net

    left=192.168.0.2

    leftcert=sun.server.cert.pem

    leftsubnet=10.2.0.0/24

    leftid=@sun.com

    leftfirewall=yes

    right=192.168.0.1

    rightsubnet=10.1.0.0/24

    rightid=@moon.com

    auto=add

lgl@A ~> cat /etc/ipsec.secrets

# /etc/ipsec.secrets - strongSwan IPsec secrets file


: RSA sun.server.pem

lgl@A ~> cat /etc/strongswan.conf 

# /etc/strongswan.conf - strongSwan configuration file


charon {

  load = aes des sha1 sha2 md5 pem pkcs1 gmp random nonce x509 curl revocation hmac stroke kernel-netlink socket-default updown

  multiple_authentication = no

  signature_authentication = no

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

启动

启动方式跟psk相同。 

1. 网关Bsudo ipsec start或sudo ipsec restart,启动StrongSwan,C也一样; 

2. 在网关B或C中运行sudo ipsec up net-net,即开启名字为net-net的连接,而net-net的具体配置在ipsec.conf中。


成功的话,大致是这样的:


bishe2016@A ~/s/n2n-rsa> sudo ipsec up net-net

initiating IKE_SA net-net[1] to 192.168.0.2

generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) ]

sending packet: from 192.168.0.1[500] to 192.168.0.2[500] (668 bytes)

received packet: from 192.168.0.2[500] to 192.168.0.1[500] (457 bytes)

parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ ]

received cert request for "C=CN, O=NetworkLab, CN=NetworkLab CA"

sending cert request for "C=CN, O=NetworkLab, CN=NetworkLab CA"

authentication of 'moon.com' (myself) with RSA signature successful

sending end entity cert "C=CN, O=NetworkLab, CN=moon.com"

establishing CHILD_SA net-net

generating IKE_AUTH request 1 [ IDi CERT N(INIT_CONTACT) CERTREQ IDr AUTH SA TSi TSr N(EAP_ONLY) ]

sending packet: from 192.168.0.1[500] to 192.168.0.2[500] (1484 bytes)

received packet: from 192.168.0.2[500] to 192.168.0.1[500] (1292 bytes)

parsed IKE_AUTH response 1 [ IDr CERT AUTH SA TSi TSr N(AUTH_LFT) ]

received end entity cert "C=CN, O=NetworkLab, CN=sun.com"

  using certificate "C=CN, O=NetworkLab, CN=sun.com"

  using trusted ca certificate "C=CN, O=NetworkLab, CN=NetworkLab CA"

checking certificate status of "C=CN, O=NetworkLab, CN=sun.com"

certificate status is not available

  reached self-signed root ca with a path length of 0

authentication of 'sun.com' with RSA signature successful

IKE_SA net-net[1] established between 192.168.0.1[moon.com]...192.168.0.2[sun.com]

scheduling reauthentication in 3289s

maximum IKE_SA lifetime 3469s

connection 'net-net' established successfully

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

同样,我们可以查看iptables,并使用A成功ping同D。


也可以使用sudo ipsec statusall查看连接状态:


lgl@A ~/s/n2n-rsa> sudo ipsec statusall

Status of IKE charon daemon (strongSwan 5.3.5, Linux 4.8.0-41-generic, x86_64):

  uptime: 3 hours, since Mar 22 11:33:30 2017

  malloc: sbrk 2420736, mmap 0, used 241824, free 2178912

  worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 3

  loaded plugins: charon aes sha1 sha2 md5 pem pkcs1 gmp random nonce x509 revocation hmac stroke kernel-netlink socket-default updown

Listening IP addresses:

  192.168.90.130

  10.1.0.1

  192.168.0.1

Connections:

     net-net:  192.168.0.1...192.168.0.2  IKEv2

     net-net:   local:  [moon.com] uses public key authentication

     net-net:    cert:  "C=CN, O=NetworkLab, CN=moon.com"

     net-net:   remote: [sun.com] uses public key authentication

     net-net:   child:  10.1.0.0/24 === 10.2.0.0/24 TUNNEL

Security Associations (1 up, 0 connecting):

     net-net[4]: ESTABLISHED 25 minutes ago, 192.168.0.1[moon.com]...192.168.0.2[sun.com]

     net-net[4]: IKEv2 SPIs: 6fba3bd57680d6d4_i* 17339e6111cf6564_r, public key reauthentication in 28 minutes

     net-net[4]: IKE proposal: AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048

     net-net{14}:  INSTALLED, TUNNEL, reqid 4, ESP SPIs: ceac4ddb_i c9645c64_o

     net-net{14}:  AES_CBC_128/HMAC_SHA1_96, 0 bytes_i, 0 bytes_o, rekeying in 4 minutes

     net-net{14}:   10.1.0.0/24 === 10.2.0.0/24

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

在阿里云 CentOS 7上使用strongswan搭建IKEv2 VPN

8179


1、安装strongswanyuminstallstrongswansystemctlenablestrongswansystemctlstartstrongswan2、创建证书strongswanp...

来自: wengzilai

--------------------- 

作者:puppylpg 

来源:CSDN 

原文:https://blog.csdn.net/puppylpg/article/details/64918562 

版权声明:本文为博主原创文章,转载请附上博文链接!


打赏

本文链接:https://www.kinber.cn/post/575.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客