使用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。

步骤:

  1. 装机
    安装一台虚拟机;

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

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

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

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

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

  7. 开启转发
    非常重要,既然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中。

配置文件

  1. 配置网关B
    只需要把https://www.strongswan.org/testing/testresults/ikev2/net2net-psk/index.html上所提供的moonipsec.confipsec.secretsstrongswan.conf三个配置文件分别放到网关B的/etc/ipsec.conf/etc/ipsec.secrets/etc/strongswan.conf的位置即可。
  2. 配置网关C
    同B。只不过这次使用sun的配置文件。

启动

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

  1. 网关Bsudo ipsec startsudo ipsec restart,启动/重启StrongSwan,C也一样;
  2. 在网关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 50Chain OUTPUT (policy ACCEPT 27 packets, 3056 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

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

配置net2net-rsa

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

生成必要证书

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

生成CA证书
生成私钥

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

自签发CA证书

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

这里–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

签发服务器证书

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

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

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

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

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

签发客户端证书

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

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

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

ca.cert.pem
ca.pemmoon.client.pem
moon.server.cert.pem
moon.server.pem
moon.client.cert.pemsun.client.pem
sun.client.cert.pem
sun.server.pem
sun.server.cert.pem

配置文件

安装证书

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/

C同理,不再赘述。

设置配置文件

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

lgl@A ~/s/n2n-rsa> cat /etc/ipsec.conf
# /etc/ipsec.conf - strongSwan IPsec configuration fileconfig setupconn %defaultikelifetime=60mkeylife=20mrekeymargin=3mkeyingtries=1keyexchange=ikev2mobike=noconn net-netleft=192.168.0.1leftcert=moon.server.cert.pemleftsubnet=10.1.0.0/24leftid=@moon.comleftfirewall=yesright=192.168.0.2rightsubnet=10.2.0.0/24rightid=@sun.comauto=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 filecharon {load = aes des sha1 sha2 md5 pem pkcs1 gmp random nonce x509 curl revocation hmac stroke kernel-netlink socket-default updownmultiple_authentication = nosignature_authentication = no
}

C:

lgl@A ~> cat /etc/ipsec.conf
# /etc/ipsec.conf - strongSwan IPsec configuration fileconfig setupconn %defaultikelifetime=60mkeylife=20mrekeymargin=3mkeyingtries=1keyexchange=ikev2mobike=noconn net-netleft=192.168.0.2leftcert=sun.server.cert.pemleftsubnet=10.2.0.0/24leftid=@sun.comleftfirewall=yesright=192.168.0.1rightsubnet=10.1.0.0/24rightid=@moon.comauto=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 filecharon {load = aes des sha1 sha2 md5 pem pkcs1 gmp random nonce x509 curl revocation hmac stroke kernel-netlink socket-default updownmultiple_authentication = nosignature_authentication = no
}

启动

启动方式跟psk相同。
1. 网关Bsudo ipsec startsudo 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 availablereached 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

同样,我们可以查看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 2017malloc: sbrk 2420736, mmap 0, used 241824, free 2178912worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 3loaded 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.13010.1.0.1192.168.0.1
Connections:net-net:  192.168.0.1...192.168.0.2  IKEv2net-net:   local:  [moon.com] uses public key authenticationnet-net:    cert:  "C=CN, O=NetworkLab, CN=moon.com"net-net:   remote: [sun.com] uses public key authenticationnet-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 minutesnet-net[4]: IKE proposal: AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048net-net{14}:  INSTALLED, TUNNEL, reqid 4, ESP SPIs: ceac4ddb_i c9645c64_onet-net{14}:  AES_CBC_128/HMAC_SHA1_96, 0 bytes_i, 0 bytes_o, rekeying in 4 minutesnet-net{14}:   10.1.0.0/24 === 10.2.0.0/24

使用StrongSwan配置IPSec相关推荐

  1. 基于Strongswan的IPSec部署

    1. 简介 ​ IPSec全称Internet Protocol Security,是通过对IP协议的分组进行加密和认证来保护IP协议的网络传输协议集,IPSec的主要用途之一就是建立虚拟专用网络. ...

  2. strongswan 搭建 IPSec 实验环境

    使用两个CentOS7虚拟机,基于strongswan搭建IPSec VPN实验环境,通过是否配置加密算法,达到产生正常和非正常ESP数据包的目的.本篇为自己填坑记录. 目录 1.准备两个CentOS ...

  3. strongswan 配置ikev2 for iOS and Android

    strongswan 高版本已支持ikev2,ios9.0以上版本的支持ikev2,Android也是高版本的部分机型支持ikev2,本人搭建的基于ikev2交换协议的strongswan VPN服务 ...

  4. strongswan配置使用(一)

    安装strongswan https://github.com/matfabia/strongswan strongswan 的配置文件如下所示 ipsec.conf //配置ipsec隧道信息 ip ...

  5. 配置IPsec Tunnel With TACACS+ User Authentication

    配置IPsec Tunnel With TACACS+ User Authentication 详细配置见附件 转载于:https://blog.51cto.com/xuanbo/122571

  6. 使用IKE预共享密钥配置IPsec

    使用IKE预共享密钥配置IPsec        配置IKE预共享密钥的过程         1 为IKE和IPSEC准备            1检查当前配置 show running-config ...

  7. 配置IPsec on GRE Tunnel with IOS Firewall and NAT

    配置IPsec on GRE Tunnel with IOS Firewall and NAT <?xml:namespace prefix = o ns = "urn:schemas ...

  8. 配置 IPsec *** and Internet Using Split Tunneling

    配置 IPsec *** and Internet Using Split Tunneling 详细配置见附件

  9. 飞塔(FortiGate)配置IPSec

    1.配置IPSec 1.1.进入VPN > IPsecWizard,选择custom.输入IPSec名称.点击Next,进行下一步配置. 1.2.填写Remote Gateway IP,选择In ...

最新文章

  1. (C++)小明种苹果(续)
  2. 物体掉落速度_俄专家称青海火流星是个“飞船大的物体”,能量堪比万吨炸药爆炸...
  3. 2021年春季学期-信号与系统-第八次作业参考答案-第九小题
  4. C语言-程序运行效率总结及注意事项
  5. 解决dubbo问题:forbid consumer(2)
  6. tflearn alexnet iter 10
  7. union all动态表_深入窥探动态链接
  8. 2016年12月数据库流行度排行榜
  9. Java课堂测试01及感想
  10. 喷喷计算机语言掌握的程度
  11. 用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题
  12. arcgis加载dwg显示一个点_shp文件转为dwg之后在arcgis下打开属性表有高程信息但在cad里面打开为何没高程 - 地学 - 小木虫 - 学术 科研 互动社区...
  13. HDU2108 Shape of HDU【多边形凹凸】
  14. SQL导出excel数据
  15. java实例化类方法_Java 实例化类的的几种方法
  16. linux装sql2008数据库,Ubuntu 16.04下安装SQL Server for Linux
  17. 微信小程序实现用户登录(详)
  18. 初学者:set/multisetmap/multimap
  19. APP兼容性覆盖测试
  20. 线和面的方程区别_直线方程和平面方程的区别

热门文章

  1. html中根号怎么写,HTML特殊符号对应代码
  2. 解决 java.lang.ClassNotFoundException: javax.servlet.ServletContext报错
  3. 3D XPoint的原理解析
  4. 【C语言】八道经典指针笔试题(详解)
  5. 使用Fiddler抓包工具后导致无法正常上网
  6. JS中用一个button按钮实现开关灯效果
  7. 阿里云盘 PC端 v2.1.3
  8. 【单片机项目】平衡小车(一) 控制流程
  9. ssh爆破获取用户密码
  10. 如何通过接口获取商品详情