香港云主机CentOS系统上安装strongSwan搭建IPsec VPN服务器

来源:互联网 发布:c语言中的temp 编辑:程序博客网 时间:2024/05/19 23:13
早在2005年,为解决国内办公室访问香港邮件服务器时连接被随机中断而产生大量重复邮件的问题,我们在香港IDC机房的NetScreen防火墙上部署了IPsec VPN服务器,国内员工电脑上安装VPN客户端软件,在发送邮件前先VPN拨号,虽然麻烦,但成功解决了问题。

到了2007年,公司在Nasdaq上市,按照SOX法案要求,必须加强全球各办公室、机房的IT架构安全,我们将网络设备全部升级为Cisco的产品。当然,我最感兴趣的是Cisco的防火墙产品,它有一套完整的IPsec VPN解决方案。当时我们采用的是ASA5520,构建site to site VPN,将各个办公室和机房的内网打通,并统一部署微软的AD森林,IT基础服务非常稳定,各方面都很满意。而最受员工好评的就是,在办公室里上网可以无阻碍地访问国外网站,并无需事前做任何动作,只因为我们将流量做了分流,访问国内的走国内线路,访问国外的走VPN加密通道从香港出去。同样的,对于移动办公人员,给他们安装Cisco System VPN Client来拨号访问香港的VPN服务器。

期间,还有在美国的朋友要看中国网上直播的奥运节目,在香港的朋友要看内地网上点播的连续剧,而有些节目不对境外IP开放。办法当然是在国内架设远程访问VPN服务器。

这就是一个标准的围城格局。

皆大欢喜的背后是高昂的成本,众所周知,思科产品相当的贵。

那有没有廉价的解决方案呢?当然有,还有不少呢,这得感谢软件开源项目,技术先进,功能强大,还不用花钱。

今年春节前,公司为接收美国节点的数据做大数据分析,购置了IBM旗下Softlayer香港节点的云服务器,这给我测试Linux下的开源VPN软件提供了合适的资源条件,于是我开始寻找合适的开源VPN软件。

先看看常用VPN协议有哪些?

参考:维基百科 - 虚拟专用网

常用的虚拟专用网协议有:

  • L2F
  • L2TP
  • PPTP
  • IPsec (如Cisco IPSec VPN)
  • SSL VPN
  • AnyConnect(Cisco SSL VPN)
  • OpenVPN
  • SoftEther

各协议的优缺点就不说了,有兴趣可以自己去查,这里我只关注IPsec。

基于IPsec的VPN通道其实包含以下两个部分:

  • IKE协议(互联网密钥交换协议): 两个系统端使用IKE协议来互相验证,并协商建立IPsec通道所需的特定加密参数和两端特定的网段。
  • IPsec协议(IP安全协议):使用特定加密参数对特定数据进行加密传输,通常由操作系统内核实现,目前基本上所有主流操作系统都支持IPsec协议。

用白话说就是,IKE负责连接双方的身份验证,双方协商得出的密码和使用的加密算法都告知给操作系统,操作系统对两边网段之间的流量数据进行加密传输。

既然数据加密传输的活都给操作系统来干了,操作系统我们也没什么好选的,能选的就只有实现IKE协议的软件了。

IKE的版本发展:
1988年11月,互联网工程任务组在一系列的RFC文件中,定义了这个协议,其中包括了 RFC 2407,RFC 2408 以及 RFC 2409。
2005年以后,IKE版本升级到了IKEv2版本,RFC文件有所更新,其中包括 RFC 4306, RFC 4718,RFC 5996 以及 RFC 7296。

IKEv2的主要改进:

  • 更精简的RFC标准化文档
  • 对移动设备更好的支持
  • 全面支持NAT穿越和SCTP协议
  • 简化的信息交换机制
  • 增强的可靠性和状态管理
  • 更好的防范DoS攻击机制


参考 - 维基百科 - IKEv2的实现

如下为当前可用的IKEv2开源实现:

  • OpenIKEv2,
  • strongSwan,
  • Openswan,
  • IKEv2,
  • Racoon and Racoon2 from the KAME project,
  • iked from the OpenBSD project.,
  • Libreswan,
  • Rockhopper VPN Software

名单的有些软件已经很久不更新了。

而稍微留心一下这个名单,会发现有个字眼很显眼,很明显就是天鹅swan家族:strongSwan, Openswan, Libreswan。

它们其实有一个共同的鼻祖:FreeS/WAN开源项目,历史还真是悠久,为了厘清脉络,我特别做了一些翻译和编辑工作。

参考 - Libreswan官网 - 历史

FreeS/WAN时代(1996 - 2004)
1996年John Gilmore和Hugh Daniel创建FreeS/WAN开源项目,致力于开发用于互联网加密的IPsec和DNS标准,愿景是以每年5%的速度推进流量加密,直到整个互联网全部使用加密通讯。FreeS/WAN项目通常有5个付费人员来开发代码,所有费用由Gilmore支付。

那个时候,加密并不普遍,用于实施加密的免费软件也非常少见。OpenSSL的前身SSLeay也刚刚被开发出来用于web服务器和客户端之间的加密通讯。虽然美国政府与民间组织之间有关隐私的争论已经如火如荼,大多数人并没有深入思考美国政府对网络通讯的侦听和监视。Freeswan软件的目标就是在美国政府以国家安全为由出台法律禁止公众加密之前,广泛普及随机加密技术(Opportunistic Encryption,OE)使加密无处不在。为防止美国政府根据国家安全法案对freeswan的所有者提起控诉,Gilmore要求美国公民包括他本人都不得为freeswan编写代码。这个限制造成了很多不良后果,因为它阻止了freeswan代码被合并进Linux内核,因此使得部署freeswan变得更加困难。

同时,各公司对于在互联网上建立安全连接和VPN的强烈需求,极大地推动了可用的加密标准的开发,为满足不同公司的各种加密需求,各种实现方式的IPsec标准也应运而生。

现在大家所知的IPsec标准套件,是来自于国际互联网工程任务组(IETF)的标准,包含了许多标准文档来实现用于验证的互联网密钥交换(IKE)协议和用于传输加密数据的IPsec协议。大量的加密和验证算法被支持和标准化。然而,并没有采用随机加密(OE)机制。同时,因为一些技术障碍造成的部署困难,使得DNS的安全版本也一度被延迟了好多年。2010年7月15日DNS根区(root zone)最终获准使用DNSSEC,这已经是延迟十年之后的事情了。这期间,freeswan的DNSSEC并未被采用,
因为IETF声明只有DNS自己可以使用DNSSEC KEY记录(现在改名为DNSKEY记录),这意味着freeswan不得不重回过去糟糕的文本记录格式。在2005年IPsec也引入了它自己的DNS记录类型IPSECKEY,但是需要耗费很多年的努力来部署新DNS软件来实际支持这个新记录类型。另外,最终用户也不希望访问他们的反向DNS区来发布OE IPsec需要的公钥。

freeswan也始终没有被Linux内核采用过,一部分原因是Gilmore强制非美国代码的规则,更大的原因在于与负责网络和加密的Linux内核开发人员疏于协作。
尽管freeswan团队多年一直参与Linux研讨会和内核顶层决策会议,Linux开发团队依然沿着他们自己的开发路径,最终只是推出了一些并没有获得广泛支持的加密子系统。结果导致了两个团队花费多年时间来努力维护两个互相竞争的内核IPsec协议栈,KLIPS和NETKEY,直到今日也没有人将这两个协议栈的优点统一整合起来。

一般来说,公众似乎并不太关心政府的侦听,哪怕在Nikcy Hager揭示以美国为中心的情报收集分析网络梯队系统(Echelon)的时候,也没有引起公众对部署加密通讯的足够重视。从90年代到21世纪初,并没有太多的人认为不加密的互联网是个真实的问题,直到2013年6月斯诺登(Edward Snowden)在香港将美国国家安全局关于棱镜计划监听项目的秘密文档披露给英国《卫报》和美国《华盛顿邮报》的时候,这已经是Gilmore放弃用freeswan对整个互联网加密的企图整整十年之后了。

从FreeS/WAN到Openswan(2004 - 2012)
虽然很多商业公司已经在使用freeswan作为它们密钥协作性测试的工具之一,Gilmore和他的开发团队之间的矛盾却与日俱增。Andreas Steffen(strongSwan项目的维护者)编写了大量补丁使freeswan能够支持X.509数字证书标准,但Gilmore拒绝将其并入freeswan。Mathieu Lafon编写的另一个商用VPN的基本功能NAT-Traversal支持代码,也被Gilmore拒绝。freeswan的志愿者Ken Bantoft,维护了一个包含上述补丁的freeswan的版本,并将之命名为超级freeswan。然而,Gilmore看到这个名字并不高兴,因为他不想那些杂七杂八的互联网技术和freeswan这个名字有任何瓜葛。

2003年7月,Gilmore和另一位积极的freeswan志愿者Paul Wouters在柏林附近召开的Chaos Communication Camp会议上碰面。他们想出了一个办法,在没有Gilmore提供赞助的条件下使用freeswan继续对IPsec进行开发。Wouters和其他志愿者将freeswan代码复制出一个分支,同时Gilmore将商业VPN开发相关的大块代码剔除后构建新的freeswan发布版本。Wouters的这个软件分支,被起名为openswan,源于freebsd/openbsd的命名历史,这个名字就这么叫开了。

Gilmore在发布了2个移除了VPN代码的freeswan版本后,就在2004年3月1日,著名的开源网络安全项目 FreeS/WAN 宣布停止开发,其原因主要是开发者的意图和用户的需求不吻合。对于网络安全系统,用户更多考虑的是系统功能的完整、强大,而不是它可预知的先进性,因此,FreeS/WAN 新版本中主打推出的 Opportunistic Encryption (OE) - 随机加密没有吸引到足够数量的用户测试。鉴于此,投资者停止了对 FreeS/WAN 项目的资助,FreeS/WAN从此淡出江湖。

总的来说,Openswan项目将注意力从随机加密(OE)技术转向VPN技术。4个Openswan志愿者创立了Xelerance公司来提供对Openswan的商业支持,盈利被用来对Openswan继续开发。由于不再有Gilmore强加于freeswan的限制这样的障碍,脱胎于freeswan的Openswan代码,被广泛采用并被整合进主要的Linux发行版中,例如RHEL,Debian和SuSe Linux。很多企业级特性被加入,像Xauth和SAref,在企业环境中Openswan如鱼得水。但这种状况本身造成了Xelerance公司收入锐减,因为企业用户大多使用RHEL,很自然付费给Red Hat来提供商业支持,而IPsec和IKE运行得足够好以致于用户基本上没有对新特性的开发要求,或者他们宁愿等待别人来付费或开发新功能。因此,虽然Xelerance公司此时仍然对Openswan项目提供赞助,但公司的运营方向已经发生了改变。一个又一个原始创始者离开了公司,Wouters是在2011年12月最后一个离开的,他的离开引发了Openswan项目团队和Xelerance公司之间关于Openswan商标所有权的争执,引发了法律诉讼。而当免费软件开发者被公司提起诉讼时,比较经济和简单的办法就是走人并给软件改名,Libreswan就这样诞生了。

参考 - strongSwan官方文档 - The strongSwan Open Source VPN Solution



可以看到strongSwan其实是和Openswan并列的两个开源项目,strongSwan更早就对IKEv2提供了完整支持,就选它了。

安装strongSwan

先升级操作系统CentOS至最新版本,我这里比较喜欢用CentOS 6.x的版本。
  1. yum -y update
复制代码
升级完后需要reboot重启服务器。

查看CentOS版本号
  1. uname -a
  2. Linux slhk 2.6.32-573.18.1.el6.x86_64 #1 SMP Tue Feb 9 22:46:17 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
复制代码

查看SELinux状态
  1. [root@slhk ~]# sestatus 
  2. SELinux status: disabled
复制代码
如果SELinux没有被禁用,需禁用之,并重启服务器

查看当前网卡配置
  1. [root@slhk ~]# ifconfig
  2. eth0      Link encap:Ethernet  HWaddr 06:3C:1D:E3:9C:46  
  3.           inet addr:10.110.71.123  Bcast:10.110.71.127  Mask:255.255.255.192
  4.           inet6 addr: fe80::43c:1dff:fee3:9c46/64 Scope:Link
  5.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
  6.           RX packets:88318851 errors:0 dropped:0 overruns:0 frame:0
  7.           TX packets:25328422 errors:0 dropped:0 overruns:0 carrier:0
  8.           collisions:0 txqueuelen:1000 
  9.           RX bytes:110102171108 (102.5 GiB)  TX bytes:2571529525 (2.3 GiB)
  10.           Interrupt:246 

  11. eth1      Link encap:Ethernet  HWaddr 06:F8:19:A1:0C:27  
  12.           inet addr:119.81.236.70  Bcast:119.81.236.71  Mask:255.255.255.248
  13.           inet6 addr: fe80::4f8:19ff:fea1:c27/64 Scope:Link
  14.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
  15.           RX packets:15095342 errors:0 dropped:0 overruns:0 frame:0
  16.           TX packets:17748377 errors:0 dropped:0 overruns:0 carrier:0
  17.           collisions:0 txqueuelen:1000 
  18.           RX bytes:1133594452 (1.0 GiB)  TX bytes:42002925032 (39.1 GiB)
  19.           Interrupt:245 

  20. lo        Link encap:Local Loopback  
  21.           inet addr:127.0.0.1  Mask:255.0.0.0
  22.           inet6 addr: ::1/128 Scope:Host
  23.           UP LOOPBACK RUNNING  MTU:65536  Metric:1
  24.           RX packets:217503 errors:0 dropped:0 overruns:0 frame:0
  25.           TX packets:217503 errors:0 dropped:0 overruns:0 carrier:0
  26.           collisions:0 txqueuelen:0 
  27.           RX bytes:29181128 (27.8 MiB)  TX bytes:29181128 (27.8 MiB)
复制代码
可以看到,服务器公网IP是119.81.236.70,对应网卡是eth1。

安装strongSwan的运行依赖环境
  1. yum -y install gpm-devel pam-devel openssl-devel make gcc
复制代码

现在正式开始安装strongSwan

安装方法一:使用yum安装
strongSwan的发行版已包含在EPEL源中, 但源中的包版本5.3.2比较低,目前官网上5.4.0已经发布了。

  • 安装EPEL源:
    1. yum -y install epel-release
    复制代码

  • 安装strongswan:
    1. yum -y install strongswan
    复制代码
    注意:使用yum安装,命令ipsec被替代为strongswan。可设置别名来解决这个问题:
    1. alias ipsec='strongswan'
    复制代码


安装方法二:下载源程序编译安装
为使用最新版本,还是得自己下载源码编译安装,我测试时的版本是5.3.5。

  • 下载源代码压缩包
    1. cd /root
    2. wget http://download.strongswan.org/strongswan.tar.gz
    复制代码

  • 解压
    1. tar zxvf strongswan.tar.gz
    复制代码

  • 编译安装
    程序安装路径:/usr
    strongSwan配置文件路径:/etc/strongswan
    1. cd strongswan-5.3.5
    2. ./configure --prefix=/usr --sysconfdir=/etc/strongswan --enable-eap-identity --enable-eap-md5 \
    3.             --enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap \
    4.             --enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap \
    5.             --enable-xauth-pam --enable-dhcp --enable-openssl --enable-addrblock \
    6.             --enable-unity --enable-certexpire --enable-radattr --enable-tools \
    7.             --enable-openssl --disable-gmp
    8. make
    9. make install
    复制代码


配置私钥和证书

  • 生成CA私钥,并使用此私钥自签名生成CA证书
    1. cd /etc/strongswan
    2. ipsec pki --gen --outform pem > ca.pem
    3. ipsec pki --self --in ca.pem --dn "C=CN, O=VPN, CN=strongSwan CA" --ca --lifetime 3652 \
    4.              --outform pem > ca.cert.pem
    复制代码

    这里C表示国家名,O表示组织名,CN为通用名。默认证书有效期为3年,这里配置3652天,即10年。
  • 生成服务器私钥,然后从私钥中导出公钥,用CA证书签发服务器证书
    ipsec pki命令可用来生成RSA密钥对,包含了私钥和公钥,公钥是在网络上传输的,而私钥是藏好用来和接收到的公钥配对的(因此私钥里也有整个公钥,用来配对)。
    1. ipsec pki --gen --outform pem > server.pem
    2. ipsec pki --pub --in server.pem | ipsec pki --issue --lifetime 3652 --cacert ca.cert.pem \
    3.              --cakey ca.pem --dn "C=CN, O=VPN, CN=119.81.236.70" --san="119.81.236.70" \
    4.              --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
    复制代码

    • iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址。
    • 除了上述要求,Windows 7 还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证)--flag serverAuth。
    • 非 iOS 的 Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU)--flag ikdeIntermediate。
    • Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,--san。

    所以这里C、O的值要跟第1步的一致,CN值及--san值是服务器公网地址或url,另外这里可以设置多个--san值。否则会出现错误 13801:IKE身份验证凭证不可接受。
  • 生成客户端私钥,然后从私钥中导出公钥,用CA证书签发客户端证书
    1. ipsec pki --gen --outform pem > client.pem
    2. ipsec pki --pub --in client.pem | ipsec pki --issue --lifetime 3652 --cacert ca.cert.pem \
    3.              --cakey ca.pem --dn "C=CN, O=VPN, CN=strongSwan Client" --outform pem > client.cert.pem
    复制代码

    这里C、O的值要跟第1步的一致。
  • 生成 pkcs12 证书,用来导入手机或电脑
    1. openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "strongSwan Client" \
    2.                       -certfile ca.cert.pem -caname "strongSwan CA" -out client.cert.p12
    3. Export Password: pceva.com
    复制代码

    生成时需设置密码,例如:pceva.com,请记住这个密码,在客户端导入此证书时需输入该密码。


安装证书

把刚才生成的私钥和证书文件复制到目录/etc/strongswan/ipsec.d/下的指定目录下即可。
  1. cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
  2. cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
  3. cp -r server.pem /etc/strongswan/ipsec.d/private/
  4. cp -r client.cert.pem /etc/strongswan/ipsec.d/certs/
  5. cp -r client.pem /etc/strongswan/ipsec.d/private/
复制代码

cacerts/目录下放置CA证书
certs/目录下放置服务器和客户端证书
private/目录下放置服务器和客户端私钥

配置strongSwan

strongSwan包含3个配置文件,在目录/etc/strongswan/下。
strongswan.conf            strongSwan各组件的通用配置
ipsec.conf                     IPsec相关的配置,定义IKE版本、验证方式、加密方式、连接属性等等
ipsec.secrets                 定义各类密钥,例如:私钥、预共享密钥、用户账户和密码

vi /etc/strongswan/strongswan.conf
  1. # strongswan.conf - strongSwan configuration file
  2. #
  3. # Refer to the strongswan.conf(5) manpage for details
  4. #
  5. # Configuration changes should be made in the included files

  6. charon {
  7.         load_modular = yes
  8.         duplicheck.enable = no                          #冗余检查关闭,以允许同时连接多个设备
  9.         compress = yes                                  #传输启用压缩
  10.         plugins {
  11.                 include strongswan.d/charon/*.conf
  12.         }
  13.         dns1 = 8.8.8.8                                  #给远程端指定DNS服务器
  14.         dns2 = 8.8.4.4
  15.         nbns1 = 8.8.8.8                                 #指定Windows的WINS服务器
  16.         nbns2 = 8.8.4.4

  17.         filelog {                                       #配置strongSwan日志级别和路径
  18.                 /var/log/strongswan.log {
  19.                    time_format = %b %e %T
  20.                    default = 2
  21.                    append = no
  22.                    flush_line = yes
  23.                 }
  24.         }
  25. }

  26. include strongswan.d/*.conf
复制代码

vi /etc/strongswan/ipsec.conf
  1. # ipsec.conf - strongSwan IPsec configuration file

  2. config setup
  3.           uniqueids=never               #关闭ID唯一性,即允许多个客户端使用同一个证书,多设备同时在线

  4. conn %default                           #默认配置项,其他conn配置项都会调用此默认项
  5.     left=%any                           #left表示local,即本地端(服务器端)IP地址;%any是魔数字,表示任意地址
  6.     leftsubnet=0.0.0.0/0                #本地端网络,0.0.0.0/0为通配,表示所有IP网段
  7.     right=%any                          #right表示remote,即远程端(客户端)IP地址可为任意地址
  8.     rightsourceip=10.10.10.0/24         #分配给远程端的虚拟IP地址段,尽量避免使用常用私网地址段以免冲突
  9.     dpdaction=clear                     #dpd表示Dead Peer Detection,对端失效检测,clear表示对端失效时关闭连接

  10. conn IKEv1-CERT-XAUTH                   #供老版本IOS使用。IKEv1,使用证书和XAUTH验证
  11.     keyexchange=ikev1                   #密钥交换使用IKEv1
  12.     fragmentation=yes                   #允许分片
  13.     leftauth=pubkey                     #本地端使用公钥验证
  14.     leftcert=server.cert.pem            #指定本地端证书
  15.     rightauth=pubkey                    #远程端使用公钥验证
  16.     rightauth2=xauth                    #远程端使用用户账号验证
  17.     rightcert=client.cert.pem           #指定远程端证书
  18.     auto=add                            #auto定义strongSwan服务启动时该连接的行为,add是添加连接类型但不启动

  19. conn IKEv1-PSK-XAUTH                    #供IOS, Android使用。IKEv1,使用预共享密钥和XAUTH验证
  20.     keyexchange=ikev1                   #密钥交换使用IKEv1
  21.     leftauth=psk                        #本地端使用预共享密钥验证
  22.     rightauth=psk                       #远程端使用预共享密钥验证
  23.     rightauth2=xauth                    #远程端使用用户账号验证
  24.     auto=add                            #strongSwan启动时添加连接类型但不启动

  25. conn IKEv2-CERT                         #供Windows 7+, Linux使用。IKEv2,使用证书验证
  26.     keyexchange=ikev2                   #密钥交换使用IKEv2
  27.     leftauth=pubkey                     #本地端使用公钥验证
  28.     leftcert=server.cert.pem            #指定本地端证书
  29.     rightauth=pubkey                    #远程端使用公钥验证
  30.     rightcert=client.cert.pem           #指定远程端证书
  31.     auto=add                            #strongSwan启动时添加连接类型但不启动

  32. conn IKEv2-EAP                          #供Windows 7+, IOS9+使用。IKEv2,EAP验证
  33.     keyexchange=ikev2                   #密钥交换使用IKEv2
  34.     ike=aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!                #第一阶段加密方式
  35.     esp=aes256-sha256,3des-sha1,aes256-sha1!                                           #ESP的顺序与IKE一致
  36.     rekey=no                            #本地端对Windows远程端发出rekey请求会断开连接,所以需配置为no
  37.     leftauth=pubkey                     #本地端使用公钥验证
  38.     leftcert=server.cert.pem            #指定本地端证书
  39.     leftsendcert=always                 #本地端总是发送证书
  40.     leftid=119.81.236.70                #本地端标识,使用本地端公网IP地址作为标识,和生成服务器证书时的--san参数对应
  41.     rightauth=eap-mschapv2              #远程端使用eap-mschapv2验证
  42.     rightsendcert=never                 #不要求远程端发送证书
  43.     eap_identity=%any                   #指定EAP验证身份,任意账户
  44.     fragmentation=yes                   #允许分片
  45.     auto=add                            #strongSwan启动时添加连接类型但不启动
复制代码

密码文件ipsec.secrets文件默认不存在,需要自己生成。
vi /etc/strongswan/ipsec.secrets
  1. : RSA server.pem                        #指定服务器的RSA私钥文件
  2. : PSK "hello2016.pceva.com"             #配置预共享密钥为:hello2016.pceva.com
  3. stone : XAUTH "PCeva2016"               #配置XAUTH验证的用户名stone和密码PCeva2016,可配置多个用户账户
  4. stone : EAP "PCeva2016"                 #配置EAP验证的用户名stone和密码PCeva2016,可配置多个用户账户
复制代码

更改密码文件读写权限,仅限root可读写
  1. chmod 600 ipsec.secrets
复制代码

CentOS配置转发
  1. sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
  2. sysctl -p
复制代码

CentOS配置iptables防火墙,允许UDP500,UDP4500,并配置转发和NAT规则。
vi /etc/sysconfig/iptables
  1. # Generated by iptables-save v1.4.7 on Thu Mar 31 17:56:08 2016
  2. *filter
  3. :INPUT DROP [0:0]
  4. :FORWARD DROP [0:0]
  5. :OUTPUT ACCEPT [17175:5181315]
  6. -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
  7. -A INPUT -p icmp -j ACCEPT 
  8. -A INPUT -i lo -j ACCEPT 
  9. -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 
  10. -A INPUT -i eth1 -p udp -m udp --dport 500 -j ACCEPT 
  11. -A INPUT -i eth1 -p udp -m udp --dport 4500 -j ACCEPT 
  12. -A INPUT -j REJECT --reject-with icmp-host-prohibited 
  13. -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT 
  14. -A FORWARD -s 10.10.10.0/24 -j ACCEPT 
  15. -A FORWARD -j REJECT --reject-with icmp-host-prohibited 
  16. COMMIT
  17. # Completed on Thu Mar 31 17:56:08 2016
  18. # Generated by iptables-save v1.4.7 on Thu Mar 31 17:56:08 2016
  19. *nat
  20. :PREROUTING ACCEPT [69:5938]
  21. :POSTROUTING ACCEPT [13:839]
  22. :OUTPUT ACCEPT [13:839]
  23. -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE 
  24. COMMIT
  25. # Completed on Thu Mar 31 17:56:08 2016
复制代码

配置完成后,重启iptables服务,使新规则生效。
  1. service iptables restart
复制代码

配置init.d服务启动脚本(源码编译安装不带此脚本)
vi /etc/init.d/strongswan
  1. #!/bin/sh
  2. #
  3. # strongswan   An implementation of key management system for IPsec
  4. #
  5. # chkconfig:   - 48 52
  6. # description: Starts or stops the Strongswan daemon.

  7. ### BEGIN INIT INFO
  8. # Provides: ipsec
  9. # Required-Start: $network $remote_fs $syslog $named
  10. # Required-Stop: $syslog $remote_fs
  11. # Default-Start:
  12. # Default-Stop: 0 1 6
  13. # Short-Description: Start Strongswan daemons at boot time
  14. ### END INIT INFO

  15. # Source function library.
  16. . /etc/rc.d/init.d/functions

  17. exec="/usr/sbin/ipsec"
  18. prog="strongswan"
  19. status_prog="starter"
  20. config="/etc/strongswan/strongswan.conf"

  21. lockfile=/var/lock/subsys/$prog

  22. start() {
  23.     [ -x $exec ] || exit 5
  24.     [ -f $config ] || exit 6
  25.     echo -n $"Starting $prog: "
  26.     daemon $exec start
  27.     retval=$?
  28.     echo
  29.     [ $retval -eq 0 ] && touch $lockfile
  30.     return $retval
  31. }

  32. stop() {
  33.     echo -n $"Stopping $prog: "
  34.     $exec stop
  35.     retval=$?
  36.     echo
  37.     [ $retval -eq 0 ] && rm -f $lockfile
  38.     return $retval
  39. }

  40. restart() {
  41.     stop
  42.     start
  43. }

  44. reload() {
  45.     restart
  46. }

  47. force_reload() {
  48.     restart
  49. }

  50. _status() {
  51.     # run checks to determine if the service is running or use generic status
  52.     status $status_prog
  53. }

  54. _status_q() {
  55.     _status >/dev/null 2>&1
  56. }


  57. case "$1" in
  58.     start)
  59.         _status_q && exit 0
  60.         $1
  61.         ;;
  62.     stop)
  63.         _status_q || exit 0
  64.         $1
  65.         ;;
  66.     restart)
  67.         $1
  68.         ;;
  69.     reload)
  70.         _status_q || exit 7
  71.         $1
  72.         ;;
  73.     force-reload)
  74.         force_reload
  75.         ;;
  76.     status)
  77.         _status
  78.         ;;
  79.     condrestart|try-restart)
  80.         _status_q || exit 0
  81.         restart
  82.         ;;
  83.     *)
  84.         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
  85.         exit 2
  86. esac
  87. exit $?
复制代码

配置开机时strongswan服务自启动
  1. cd /etc/init.d
  2. chmod +x strongswan
  3. chkconfig --add strongswan
  4. chkconfig strongswan on
复制代码

启动strongswan服务
  1. service strongswan start       #或者  ipsec start
复制代码

查看strongswan服务状态
  1. service strongswan status       #或者  ipsec status
复制代码



以上为VPN服务器端的配置
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下为VPN客户端的配置


VPN客户端配置

基本上目前流行的平台都可以配置客户端和strongSwanVPN服务器对接。

  • windows 7+

    • 导入证书
      开始菜单搜索“cmd”,打开后输入mmc(Microsoft管理控制台);
      “文件”-“添加/删除管理单元”,添加“证书”单元;
      证书单元的弹出窗口中一定要选“计算机账户”,之后选“本地计算机”,确定;
      在左边的“控制台根节点”下选择“证书”-“个人”,然后选右边的“更多操作”-“所有任务”-“导入”打开证书导入窗口;
      选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码 pceva.com 。下一步“证书存储”选“个人”;
      导入成功后,把导入的 CA 证书剪切到“受信任的根证书颁发机构”的证书文件夹里面;

      打开剩下的那个私人证书,看一下有没有显示“您有一个与该证书对应的私钥”,以及“证书路径”下面是不是显示“该证书没有问题”;
      然后关闭 mmc,提示“将控制台设置存入控制台1吗”,选“否”即可。
    • 新建vpn连接
      控制面板 - 网络和共享中心
      设置新的连接或网络 - 连接到工作区 - 使用我的Internet连接(VPN)
      Internet地址:119.81.236.70
      目标名称:VPN连接
      勾选:允许其他人使用此连接;现在不连接。
      用户名:stone
      密码:PCeva2016
      勾选:记住此密码
      更改适配器设置,右击VPN连接,选择安全栏
      VPN类型:IKEv2
      数据加密:需要加密(如果服务器拒绝将断开连接)
      身份验证:(下面两项任选一项即可)
      使用可扩展的身份验证协议(EAP)- Microsoft:安全密码(EAP-MSCHAP v2)(启用加密)
      使用计算机证书


  • Android

    • Android 4.x自带的VPN客户端
      目前只支持IKEv1,使用预共享密钥外加用户账号验证,不需要导入证书。
      设置 – 更多 – VPN,点击右上角的+。

      名称:随便起。
      类型:IPSec Xauth PSK。Xauth表示用户账户验证,PSK就是Pre-Shared Key,也即预共享密钥。
      服务器地址:119.81.236.70
      IPSec标示符:放空不填。
      IPSec预共享密钥:写ipsec.secrets里PSK后面的那个密码 hello2016.pceva.com
    • strongSwan APP
      strongSwan有发布安卓平台上的客户端APP:strongSwan VPN Client for Android 4 and newer,
      https://play.google.com/store/ap ... .strongswan.android
      可在各大应用市场下载,目前版本1.5.0,只支持IKEv2。

      我手上的安卓手机无法导入CA证书,就没有继续测试了。

  • IOS
    苹果的系统可以使用IKEv1和IKEv2,建议使用IKEv2的配置。

    • IKEv1配置:预共享密钥+用户账户验证,不需要证书,配置最简单,老系统版本都支持。

      设置 – 通用 – VPN
      点击 添加VPN配置,点击类型
      选择IPSec,返回
      描述:随便填
      服务器:119.81.236.70
      账户: stone
      密码: PCeva2016
      密钥: hello2016.pceva.com
    • IKEv2配置:证书+用户账户验证,最安全和稳定。
      需要导入2个证书:CA和客户端证书
      将文件ca.cert.pem和client.cert.p12通过邮件发给自己。
      注意:导入client.cert.p12时需要输入密码:pceva.com
      导入完成后,在 设置 – 通用 – 描述文件 里,能看见刚才导入的两个证书。

      再到 设置 – 通用 – VPN 里,添加VPN配置
      类型:    IKEv2
      描述:    随便填
      服务器:119.81.236.70
      远程ID:119.81.236.70
      本地ID:随便填或不填
      用户名:stone
      密码:   PCeva2016

  • Linux
    Linux作为客户端的配置(以CentOS为例),很多帖子都说strongSwan本身就是客户端,但是却没有给出例子,我这里就多写点。

    查看客户端CentOS当前版本
    1. [root@test ~]# uname -a
    2. Linux test 2.6.32-573.18.1.el6.x86_64 #1 SMP Tue Feb 9 22:46:17 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    复制代码

    查看客户端当前网卡配置
    1. [root@test ~]# ip add list
    2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    3.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4.     inet 127.0.0.1/8 scope host lo
    5.     inet6 ::1/128 scope host 
    6.        valid_lft forever preferred_lft forever
    7. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    8.     link/ether 00:0c:29:bf:74:da brd ff:ff:ff:ff:ff:ff
    9.     inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
    10.     inet6 fe80::20c:29ff:febf:74da/64 scope link 
    11.        valid_lft forever preferred_lft forever
    复制代码

    strongSwan软件安装
    1. yum update
    2. yum install gpm-devel pam-devel openssl-devel make gcc

    3. wget http://download.strongswan.org/strongswan.tar.gz
    4. tar xzvf strongswan.tar.gz
    5. cd strongswan-5.3.5

    6. ./configure --prefix=/usr --sysconfdir=/etc/strongswan --enable-eap-identity --enable-eap-md5 \
    7.             --enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap \
    8.             --enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap \
    9.             --enable-xauth-pam  --enable-dhcp  --enable-openssl  --enable-addrblock \
    10.             --enable-unity  --enable-certexpire --enable-radattr --enable-tools \
    11.             --enable-openssl --disable-gmp
    12. make
    13. make install
    复制代码

    安装证书
    用scp将文件client.cert.p12从VPN服务器复制到此目录中:/etc/strongswan/ipsec.d/private/

    配置文件:strongswan.conf
    vi /etc/strongswan/strongswan.conf 
    1. # strongswan.conf - strongSwan configuration file
    2. #
    3. # Refer to the strongswan.conf(5) manpage for details
    4. #
    5. # Configuration changes should be made in the included files

    6. charon {
    7.         load_modular = no
    8.         plugins {
    9.                 include strongswan.d/charon/*.conf
    10.                 resolve {
    11.                         file = /etc/resolv.conf                        #设置reslov.conf文件的正确路径为/etc/
    12.                 }
    13.         }
    14. }

    15. include strongswan.d/*.conf
    复制代码

    默认情况下,strongswan启动时将DNS服务器地址插入文件/etc/strongswan/resolv.conf

    配置文件:ipsec.conf
    vi /etc/strongswan/ipsec.conf
    1. # ipsec.conf - strongSwan IPsec configuration file

    2. config setup
    3.     uniqueids=never


    4. conn %default
    5.     dpdaction=clear


    6. conn home
    7.     keyexchange=ikev1
    8.     left=%any                                       #本地端IP地址,魔术字%any表示任意
    9.     leftsourceip=%config                            #本地端(VPN客户端)的虚拟IP由远程端(VPN服务器)指定
    10.     leftauth=psk
    11.     leftauth2=xauth
    12.     right=119.81.236.70                             #远程端(VPN服务器)的IP地址
    13.     rightsubnet=0.0.0.0/0                           #远程端网络,0.0.0.0/0为通配,表示所有IP网段
    14.     rightauth=psk
    15.     xauth_identity=stone                            #指定XAUTH验证的用户名为stone
    16.     auto=add                                        #strongSwan启动时添加连接类型但不启动


    17. conn rw
    18.     keyexchange=ikev2
    19.     left=%any
    20.     leftsourceip=%config
    21.     leftauth=pubkey
    22.     leftid="C=CN, O=VPN, CN=strongSwan Client"      #本地端标识,使用客户端证书的DN
    23.     right=119.81.236.70
    24.     rightid="C=CN, O=VPN, CN=119.81.236.70"         #远程端标识,使用VPN服务器证书的DN
    25.     rightsubnet=0.0.0.0/0
    26.     rightauth=pubkey
    27.     auto=add

    28. conn exempt                                         #配置LAN访问不走IPsec通道
    29.     right=127.0.0.1
    30.     leftsubnet=192.168.1.0/24
    31.     rightsubnet=192.168.1.0/24
    32.     type=passthrough
    33.     auto=route                                      #strongSwan启动时添加连接类型,有流量时启动连接
    复制代码

    密码文件:ipsec.secrets 
    vi /etc/strongswan/ipsec.secrets 
    1. : P12 client.cert.p12 "pceva.com"
    2. : PSK "hello2016.pceva.com"
    3. stone : XAUTH "PCeva2016"
    4. stone : EAP "PCeva2016"
    复制代码

    启动strongswan服务
    1. [root@test strongswan]# ipsec start
    2. Starting strongSwan 5.3.5 IPsec [starter]...
    3. insmod /lib/modules/2.6.32-573.18.1.el6.x86_64/kernel/net/key/af_key.ko 
    4. insmod /lib/modules/2.6.32-573.18.1.el6.x86_64/kernel/net/ipv4/ah4.ko 
    5. insmod /lib/modules/2.6.32-573.18.1.el6.x86_64/kernel/net/ipv4/esp4.ko 
    6. insmod /lib/modules/2.6.32-573.18.1.el6.x86_64/kernel/net/xfrm/xfrm_ipcomp.ko 
    7. insmod /lib/modules/2.6.32-573.18.1.el6.x86_64/kernel/net/ipv4/ipcomp.ko 
    8. insmod /lib/modules/2.6.32-573.18.1.el6.x86_64/kernel/net/ipv4/tunnel4.ko 
    9. insmod /lib/modules/2.6.32-573.18.1.el6.x86_64/kernel/net/ipv4/xfrm4_tunnel.ko
    复制代码

    启动连接rw
    1. [root@test strongswan]# ipsec up rw
    2. initiating IKE_SA rw[1] to 119.81.236.70
    3. generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(HASH_ALG) ]
    4. sending packet: from 192.168.1.22[500] to 119.81.236.70[500] (1148 bytes)
    5. received packet: from 119.81.236.70[500] to 192.168.1.22[500] (481 bytes)
    6. parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(HASH_ALG) N(MULT_AUTH) ]
    7. local host is behind NAT, sending keep alives
    8. received cert request for "C=CN, O=VPN, CN=strongSwan CA"
    9. sending cert request for "C=CN, O=VPN, CN=strongSwan CA"
    10. authentication of 'C=CN, O=VPN, CN=strongSwan Client' (myself) with RSA_EMSA_PKCS1_SHA256 successful
    11. sending end entity cert "C=CN, O=VPN, CN=strongSwan Client"
    12. establishing CHILD_SA rw
    13. generating IKE_AUTH request 1 [ IDi CERT CERTREQ IDr AUTH CPRQ(ADDR DNS) SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(MULT_AUTH) N(EAP_ONLY) ]
    14. sending packet: from 192.168.1.22[4500] to 119.81.236.70[4500] (1564 bytes)
    15. received packet: from 119.81.236.70[4500] to 192.168.1.22[4500] (1420 bytes)
    16. parsed IKE_AUTH response 1 [ IDr CERT AUTH CPRP(ADDR DNS NBNS DNS NBNS) SA TSi TSr N(AUTH_LFT) N(MOBIKE_SUP) N(ADD_4_ADDR) ]
    17. received end entity cert "C=CN, O=VPN, CN=119.81.236.70"
    18.   using certificate "C=CN, O=VPN, CN=119.81.236.70"
    19.   using trusted ca certificate "C=CN, O=VPN, CN=strongSwan CA"
    20. checking certificate status of "C=CN, O=VPN, CN=119.81.236.70"
    21. certificate status is not available
    22.   reached self-signed root ca with a path length of 0
    23. authentication of 'C=CN, O=VPN, CN=119.81.236.70' with RSA_EMSA_PKCS1_SHA256 successful
    24. IKE_SA rw[1] established between 192.168.1.22[C=CN, O=VPN, CN=strongSwan Client]...119.81.236.70[C=CN, O=VPN, CN=119.81.236.70]
    25. scheduling reauthentication in 9988s
    26. maximum IKE_SA lifetime 10528s
    27. installing DNS server 8.8.8.8 to /etc/resolv.conf
    28. handling INTERNAL_IP4_NBNS attribute failed
    29. installing DNS server 8.8.4.4 to /etc/resolv.conf
    30. handling INTERNAL_IP4_NBNS attribute failed
    31. installing new virtual IP 10.10.10.1
    32. CHILD_SA rw{1} established with SPIs c7bfc2e3_i c6a4003a_o and TS 10.10.10.1/32 === 0.0.0.0/0
    33. received AUTH_LIFETIME of 9871s, scheduling reauthentication in 9331s
    34. peer supports MOBIKE
    35. connection 'rw' established successfully
    复制代码

    查看出口的公网IP
    1. [root@test ~]# curl -s ip.cn | egrep -o '[0-9\.]+'
    2. 119.81.236.70
    复制代码

    查看VPN连接建立后的网卡配置
    1. [root@test ~]# ip add list
    2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    3.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4.     inet 127.0.0.1/8 scope host lo
    5.     inet6 ::1/128 scope host 
    6.        valid_lft forever preferred_lft forever
    7. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    8.     link/ether 00:0c:29:bf:74:da brd ff:ff:ff:ff:ff:ff
    9.     inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
    10.     inet 10.10.10.1/32 scope global eth0
    11.     inet6 fe80::20c:29ff:febf:74da/64 scope link 
    12.        valid_lft forever preferred_lft forever
    复制代码
    注意:网卡eth0多绑定了一个虚拟IP: 10.10.10.1/32

    查看策略路由
    1. ip route list table 220
    2. 192.168.1.0/24 dev eth0  proto static  src 192.168.1.22 
    3. default via 192.168.1.1 dev eth0  proto static  src 10.10.10.1
    复制代码

    查看ipsec状态
    1. [root@test strongswan]# ipsec statusall
    2. Status of IKE charon daemon (strongSwan 5.3.5, Linux 2.6.32-573.18.1.el6.x86_64, x86_64):
    3.   uptime: 56 seconds, since Apr 03 18:58:32 2016
    4.   malloc: sbrk 405504, mmap 0, used 349408, free 56096
    5.   worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 5
    6.   loaded plugins: charon aes des rc2 sha1 sha2 md5 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl fips-prf xcbc cmac hmac attr kernel-netlink resolve socket-default stroke updown eap-identity eap-md5 eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp certexpire radattr addrblock unity
    7. Listening IP addresses:
    8.   192.168.1.22
    9. Connections:
    10.         home:  %any...119.81.236.70  IKEv1, dpddelay=30s
    11.         home:   local:  uses pre-shared key authentication
    12.         home:   local:  uses XAuth authentication: any with XAuth identity 'stone'
    13.         home:   remote: [119.81.236.70] uses pre-shared key authentication
    14.         home:   child:  dynamic === 0.0.0.0/0 TUNNEL, dpdaction=clear
    15.           rw:  %any...119.81.236.70  IKEv2, dpddelay=30s
    16.           rw:   local:  [C=CN, O=VPN, CN=strongSwan Client] uses public key authentication
    17.           rw:   remote: [C=CN, O=VPN, CN=119.81.236.70] uses public key authentication
    18.           rw:   child:  dynamic === 0.0.0.0/0 TUNNEL, dpdaction=clear
    19.       exempt:  127.0.0.1...%any  IKEv1/2, dpddelay=30s
    20.       exempt:   local:  [127.0.0.1] uses public key authentication
    21.       exempt:   remote: uses public key authentication
    22.       exempt:   child:  192.168.1.0/24 === 192.168.1.0/24 PASS, dpdaction=clear
    23. Shunted Connections:
    24.       exempt:  192.168.1.0/24 === 192.168.1.0/24 PASS
    25. Security Associations (1 up, 0 connecting):
    26.           rw[1]: ESTABLISHED 26 seconds ago, 192.168.1.22[C=CN, O=VPN, CN=strongSwan Client]...119.81.236.70[C=CN, O=VPN, CN=119.81.236.70]
    27.           rw[1]: IKEv2 SPIs: 84ebacd73cf20b96_i* c0793701f46c9363_r, public key reauthentication in 2 hours
    28.           rw[1]: IKE proposal: AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048
    29.           rw{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c7bfc2e3_i c6a4003a_o
    30.           rw{1}:  AES_CBC_128/HMAC_SHA1_96, 0 bytes_i, 0 bytes_o, rekeying in 42 minutes
    31.           rw{1}:   10.10.10.1/32 === 0.0.0.0/0
    复制代码

    VPN服务器端查看IPsec状态
    1. [root@slhk strongswan]# ipsec statusall
    2. Status of IKE charon daemon (strongSwan 5.3.5, Linux 2.6.32-573.18.1.el6.x86_64, x86_64):
    3.   uptime: 17 hours, since Apr 03 17:01:25 2016
    4.   malloc: sbrk 528384, mmap 0, used 347424, free 180960
    5.   worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 4
    6.   loaded plugins: charon aes des rc2 sha1 sha2 md5 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl fips-prf xcbc cmac hmac attr kernel-netlink resolve socket-default stroke updown eap-identity eap-md5 eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp certexpire radattr addrblock unity
    7. Virtual IP pools (size/online/offline):
    8.   10.10.10.0/24: 254/1/1
    9. Listening IP addresses:
    10.   10.110.71.123
    11.   119.81.236.70
    12. Connections:
    13. IKEv1-CERT-XAUTH:  %any...%any  IKEv1, dpddelay=30s
    14. IKEv1-CERT-XAUTH:   local:  [C=CN, O=VPN, CN=119.81.236.70] uses public key authentication
    15. IKEv1-CERT-XAUTH:    cert:  "C=CN, O=VPN, CN=119.81.236.70"
    16. IKEv1-CERT-XAUTH:   remote: [C=CN, O=VPN, CN=strongSwan Client] uses public key authentication
    17. IKEv1-CERT-XAUTH:    cert:  "C=CN, O=VPN, CN=strongSwan Client"
    18. IKEv1-CERT-XAUTH:   remote: uses XAuth authentication: any
    19. IKEv1-CERT-XAUTH:   child:  0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
    20. IKEv1-PSK-XAUTH:  %any...%any  IKEv1, dpddelay=30s
    21. IKEv1-PSK-XAUTH:   local:  [119.81.236.70] uses pre-shared key authentication
    22. IKEv1-PSK-XAUTH:   remote: uses pre-shared key authentication
    23. IKEv1-PSK-XAUTH:   remote: uses XAuth authentication: any
    24. IKEv1-PSK-XAUTH:   child:  0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
    25.   IKEv2-CERT:  %any...%any  IKEv2, dpddelay=30s
    26.   IKEv2-CERT:   local:  [C=CN, O=VPN, CN=119.81.236.70] uses public key authentication
    27.   IKEv2-CERT:    cert:  "C=CN, O=VPN, CN=119.81.236.70"
    28.   IKEv2-CERT:   remote: [C=CN, O=VPN, CN=strongSwan Client] uses public key authentication
    29.   IKEv2-CERT:    cert:  "C=CN, O=VPN, CN=strongSwan Client"
    30.   IKEv2-CERT:   child:  0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
    31.    IKEv2-EAP:  %any...%any  IKEv2, dpddelay=30s
    32.    IKEv2-EAP:   local:  [119.81.236.70] uses public key authentication
    33.    IKEv2-EAP:    cert:  "C=CN, O=VPN, CN=119.81.236.70"
    34.    IKEv2-EAP:   remote: uses EAP_MSCHAPV2 authentication with EAP identity '%any'
    35.    IKEv2-EAP:   child:  0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
    36. Security Associations (1 up, 0 connecting):
    37.   IKEv2-CERT[6]: ESTABLISHED 20 seconds ago, 119.81.236.70[C=CN, O=VPN, CN=119.81.236.70]...116.233.140.216[C=CN, O=VPN, CN=strongSwan Client]
    38.   IKEv2-CERT[6]: IKEv2 SPIs: 7dc5e36f3505c5db_i be111cf11e69652d_r*, public key reauthentication in 2 hours
    39.   IKEv2-CERT[6]: IKE proposal: AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048
    40.   IKEv2-CERT{6}:  INSTALLED, TUNNEL, reqid 6, ESP in UDP SPIs: c835f5db_i c1c6879b_o
    41.   IKEv2-CERT{6}:  AES_CBC_128/HMAC_SHA1_96, 0 bytes_i, 0 bytes_o, rekeying in 42 minutes
    42.   IKEv2-CERT{6}:   0.0.0.0/0 === 10.10.10.1/32
    复制代码

    查看相关证书
    1. [root@test strongswan]# ipsec listcerts

    2. List of X.509 End Entity Certificates:

    3.   subject:  "C=CN, O=VPN, CN=strongSwan Client"
    4.   issuer:   "C=CN, O=VPN, CN=strongSwan CA"
    5.   serial:    4a:4b:78:d6:5c:4a:b7:51
    6.   validity:  not before Mar 15 15:46:35 2016, ok
    7.              not after  Mar 15 15:46:35 2026, ok 
    8.   pubkey:    RSA 2048 bits, has private key
    9.   keyid:     ef:75:ce:5a:0c:c6:15:14:4c:25:98:f5:a2:b7:b5:f4:73:bc:1d:c6
    10.   subjkey:   d5:9f:d0:c3:43:9b:53:4c:a5:ed:91:3e:49:b2:80:3e:6e:34:83:5c
    11.   authkey:   3e:fe:ce:09:95:0f:89:9e:ab:bd:70:bc:7b:69:dc:94:30:86:c4:be

    12.   altNames:  119.81.236.70
    13.   subject:  "C=CN, O=VPN, CN=119.81.236.70"
    14.   issuer:   "C=CN, O=VPN, CN=strongSwan CA"
    15.   serial:    24:99:5a:2f:0c:e9:fa:a8
    16.   validity:  not before Mar 29 15:25:30 2016, ok
    17.              not after  Mar 29 15:25:30 2026, ok 
    18.   pubkey:    RSA 2048 bits
    19.   keyid:     28:b8:cc:62:36:88:ee:6f:c5:f6:81:46:5e:22:51:b3:dd:f3:cf:fd
    20.   subjkey:   3a:28:1e:00:7a:4b:17:13:97:a7:78:34:ad:ca:16:cf:e4:06:36:d9
    21.   authkey:   3e:fe:ce:09:95:0f:89:9e:ab:bd:70:bc:7b:69:dc:94:30:86:c4:be
    复制代码

    查看CA证书
    1. [root@test strongswan]# ipsec listcacerts

    2. List of X.509 CA Certificates:

    3.   subject:  "C=CN, O=VPN, CN=strongSwan CA"
    4.   issuer:   "C=CN, O=VPN, CN=strongSwan CA"
    5.   serial:    6f:95:be:cc:f9:a9:0c:4f
    6.   validity:  not before Mar 15 15:45:34 2016, ok
    7.              not after  Mar 15 15:45:34 2026, ok 
    8.   pubkey:    RSA 2048 bits
    9.   keyid:     32:16:22:cb:f3:45:7a:cb:f7:ea:b2:b5:fd:36:2d:06:76:27:11:5b
    10.   subjkey:   3e:fe:ce:09:95:0f:89:9e:ab:bd:70:bc:7b:69:dc:94:30:86:c4:be
    复制代码

    关闭连接rw
    1. [root@test strongswan]# ipsec down rw
    2. deleting IKE_SA rw[1] between 192.168.1.22[C=CN, O=VPN, CN=strongSwan Client]...119.81.236.70[C=CN, O=VPN, CN=119.81.236.70]
    3. sending DELETE for IKE_SA rw[1]
    4. generating INFORMATIONAL request 3 [ D ]
    5. sending packet: from 192.168.1.22[4500] to 119.81.236.70[4500] (76 bytes)
    6. received packet: from 119.81.236.70[4500] to 192.168.1.22[4500] (76 bytes)
    7. parsed INFORMATIONAL response 3 [ ]
    8. IKE_SA deleted
    9. removing DNS server 8.8.4.4 from /etc/resolv.conf
    10. removing DNS server 8.8.8.8 from /etc/resolv.conf
    11. IKE_SA [1] closed successfully
    复制代码

    启动连接home
    1. [root@test ~]# ipsec up home
    2. initiating Main Mode IKE_SA home[1] to 119.81.236.70
    3. generating ID_PROT request 0 [ SA V V V V ]
    4. sending packet: from 192.168.1.22[500] to 119.81.236.70[500] (248 bytes)
    5. received packet: from 119.81.236.70[500] to 192.168.1.22[500] (136 bytes)
    6. parsed ID_PROT response 0 [ SA V V V ]
    7. received XAuth vendor ID
    8. received DPD vendor ID
    9. received NAT-T (RFC 3947) vendor ID
    10. generating ID_PROT request 0 [ KE No NAT-D NAT-D ]
    11. sending packet: from 192.168.1.22[500] to 119.81.236.70[500] (372 bytes)
    12. received packet: from 119.81.236.70[500] to 192.168.1.22[500] (372 bytes)
    13. parsed ID_PROT response 0 [ KE No NAT-D NAT-D ]
    14. local host is behind NAT, sending keep alives
    15. generating ID_PROT request 0 [ ID HASH ]
    16. sending packet: from 192.168.1.22[4500] to 119.81.236.70[4500] (76 bytes)
    17. received packet: from 119.81.236.70[4500] to 192.168.1.22[4500] (76 bytes)
    18. queueing TRANSACTION request as tasks still active
    19. received packet: from 119.81.236.70[4500] to 192.168.1.22[4500] (76 bytes)
    20. parsed ID_PROT response 0 [ ID HASH ]
    21. parsed TRANSACTION request 272908667 [ HASH CPRQ(X_USER X_PWD) ]
    22. generating TRANSACTION response 272908667 [ HASH CPRP(X_USER X_PWD) ]
    23. sending packet: from 192.168.1.22[4500] to 119.81.236.70[4500] (92 bytes)
    24. received packet: from 119.81.236.70[4500] to 192.168.1.22[4500] (76 bytes)
    25. parsed TRANSACTION request 4281219443 [ HASH CPS(X_STATUS) ]
    26. XAuth authentication of 'stone' (myself) successful
    27. IKE_SA home[1] established between 192.168.1.22[192.168.1.22]...119.81.236.70[119.81.236.70]
    28. scheduling reauthentication in 9939s
    29. maximum IKE_SA lifetime 10479s
    30. generating TRANSACTION response 4281219443 [ HASH CPA(X_STATUS) ]
    31. sending packet: from 192.168.1.22[4500] to 119.81.236.70[4500] (76 bytes)
    32. generating TRANSACTION request 2403667200 [ HASH CPRQ(ADDR DNS) ]
    33. sending packet: from 192.168.1.22[4500] to 119.81.236.70[4500] (76 bytes)
    34. received packet: from 119.81.236.70[4500] to 192.168.1.22[4500] (108 bytes)
    35. parsed TRANSACTION response 2403667200 [ HASH CPRP(ADDR DNS NBNS DNS NBNS) ]
    36. installing DNS server 8.8.8.8 to /etc/resolv.conf
    37. handling INTERNAL_IP4_NBNS attribute failed
    38. installing DNS server 8.8.4.4 to /etc/resolv.conf
    39. handling INTERNAL_IP4_NBNS attribute failed
    40. installing new virtual IP 10.10.10.2
    41. generating QUICK_MODE request 4142496424 [ HASH SA No ID ID ]
    42. sending packet: from 192.168.1.22[4500] to 119.81.236.70[4500] (236 bytes)
    43. received packet: from 119.81.236.70[4500] to 192.168.1.22[4500] (172 bytes)
    44. parsed QUICK_MODE response 4142496424 [ HASH SA No ID ID ]
    45. connection 'home' established successfully
    复制代码

    查看网卡配置
    1. [root@test ~]# ip add list
    2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    3.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4.     inet 127.0.0.1/8 scope host lo
    5.     inet6 ::1/128 scope host 
    6.        valid_lft forever preferred_lft forever
    7. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    8.     link/ether 00:0c:29:bf:74:da brd ff:ff:ff:ff:ff:ff
    9.     inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
    10.     inet 10.10.10.2/32 scope global eth0
    11.     inet6 fe80::20c:29ff:febf:74da/64 scope link 
    12.        valid_lft forever preferred_lft forever
    复制代码

    查看策略路由
    1. [root@test ~]# ip route list table 220
    2. 192.168.1.0/24 dev eth0  proto static  src 192.168.1.22 
    3. default via 192.168.1.1 dev eth0  proto static  src 10.10.10.2
    复制代码

    VPN服务器端查看IPsec状态
    1. [root@slhk ~]# ipsec statusall
    2. Status of IKE charon daemon (strongSwan 5.3.5, Linux 2.6.32-573.18.1.el6.x86_64, x86_64):
    3.   uptime: 45 hours, since Apr 03 17:01:25 2016
    4.   malloc: sbrk 528384, mmap 0, used 347424, free 180960
    5.   worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 9
    6.   loaded plugins: charon aes des rc2 sha1 sha2 md5 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl fips-prf xcbc cmac hmac attr kernel-netlink resolve socket-default stroke updown eap-identity eap-md5 eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp certexpire radattr addrblock unity
    7. Virtual IP pools (size/online/offline):
    8.   10.10.10.0/24: 254/1/1
    9. Listening IP addresses:
    10.   10.110.71.123
    11.   119.81.236.70
    12. Connections:
    13. IKEv1-CERT-XAUTH:  %any...%any  IKEv1, dpddelay=30s
    14. IKEv1-CERT-XAUTH:   local:  [C=CN, O=VPN, CN=119.81.236.70] uses public key authentication
    15. IKEv1-CERT-XAUTH:    cert:  "C=CN, O=VPN, CN=119.81.236.70"
    16. IKEv1-CERT-XAUTH:   remote: [C=CN, O=VPN, CN=strongSwan Client] uses public key authentication
    17. IKEv1-CERT-XAUTH:    cert:  "C=CN, O=VPN, CN=strongSwan Client"
    18. IKEv1-CERT-XAUTH:   remote: uses XAuth authentication: any
    19. IKEv1-CERT-XAUTH:   child:  0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
    20. IKEv1-PSK-XAUTH:  %any...%any  IKEv1, dpddelay=30s
    21. IKEv1-PSK-XAUTH:   local:  [119.81.236.70] uses pre-shared key authentication
    22. IKEv1-PSK-XAUTH:   remote: uses pre-shared key authentication
    23. IKEv1-PSK-XAUTH:   remote: uses XAuth authentication: any
    24. IKEv1-PSK-XAUTH:   child:  0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
    25.   IKEv2-CERT:  %any...%any  IKEv2, dpddelay=30s
    26.   IKEv2-CERT:   local:  [C=CN, O=VPN, CN=119.81.236.70] uses public key authentication
    27.   IKEv2-CERT:    cert:  "C=CN, O=VPN, CN=119.81.236.70"
    28.   IKEv2-CERT:   remote: [C=CN, O=VPN, CN=strongSwan Client] uses public key authentication
    29.   IKEv2-CERT:    cert:  "C=CN, O=VPN, CN=strongSwan Client"
    30.   IKEv2-CERT:   child:  0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
    31.    IKEv2-EAP:  %any...%any  IKEv2, dpddelay=30s
    32.    IKEv2-EAP:   local:  [119.81.236.70] uses public key authentication
    33.    IKEv2-EAP:    cert:  "C=CN, O=VPN, CN=119.81.236.70"
    34.    IKEv2-EAP:   remote: uses EAP_MSCHAPV2 authentication with EAP identity '%any'
    35.    IKEv2-EAP:   child:  0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
    36. Security Associations (1 up, 0 connecting):
    37. IKEv1-PSK-XAUTH[19]: ESTABLISHED 10 seconds ago, 119.81.236.70[119.81.236.70]...116.233.140.216[192.168.1.22]
    38. IKEv1-PSK-XAUTH[19]: Remote XAuth identity: stone
    39. IKEv1-PSK-XAUTH[19]: IKEv1 SPIs: 157cb85bea66c692_i cefcd0f0616019e9_r*, pre-shared key reauthentication in 2 hours
    40. IKEv1-PSK-XAUTH[19]: IKE proposal: AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048
    41. IKEv1-PSK-XAUTH{38}:  INSTALLED, TUNNEL, reqid 18, ESP in UDP SPIs: c42d14a1_i cc0a9d50_o
    42. IKEv1-PSK-XAUTH{38}:  AES_CBC_128/HMAC_SHA1_96, 0 bytes_i, 0 bytes_o, rekeying in 46 minutes
    43. IKEv1-PSK-XAUTH{38}:   0.0.0.0/0 === 10.10.10.2/32
    复制代码

    关闭连接home
    1. [root@test ~]# ipsec down home
    2. closing CHILD_SA home{1} with SPIs cc0a9d50_i (0 bytes) c42d14a1_o (0 bytes) and TS 10.10.10.2/32 === 0.0.0.0/0
    3. sending DELETE for ESP CHILD_SA with SPI cc0a9d50
    4. generating INFORMATIONAL_V1 request 1048339490 [ HASH D ]
    5. sending packet: from 192.168.1.22[4500] to 119.81.236.70[4500] (76 bytes)
    6. deleting IKE_SA home[1] between 192.168.1.22[192.168.1.22]...119.81.236.70[119.81.236.70]
    7. sending DELETE for IKE_SA home[1]
    8. generating INFORMATIONAL_V1 request 1136352302 [ HASH D ]
    9. sending packet: from 192.168.1.22[4500] to 119.81.236.70[4500] (92 bytes)
    10. removing DNS server 8.8.4.4 from /etc/resolv.conf
    11. removing DNS server 8.8.8.8 from /etc/resolv.conf
    12. IKE_SA [1] closed successfully
    复制代码

    停止strongswan服务
    1. [root@test strongswan]# ipsec stop
    2. Stopping strongSwan IPsec...
    复制代码




结束语
现在市场上云服务商已经有很多了,象亚马逊AWS,阿里云,腾讯云等等,在世界多地都有节点,主机节点的位置对于VPN的访问体验至关重要,因为即便是加密的流量,也是依托于国内和VPN服务器之间的公网连接,以我的经验,香港节点对我们来说应该是个最好的选择了。

自己动手才是王道,真是谁用谁知道。
阅读全文
2 0