#原创分享# 深信服与云上openswan(libreswan)实现ipsec VPN野蛮模式对接
  

Princeling 326

本帖最后由 Princeling 于 2020-1-25 17:42 编辑

   目前混合云的大形势下,很多企业都有自己的公有云上业务,云上业务要实现与企业出口设备实现互联互通,
解决方法:
1.一般为了保证业务的稳定性当然就是买和公有云业务可以直接实现对接的专线,一般是10M 100M专线级别
2.专线之外还可以购买云厂商提供的ipsec VPN服务,可以直接和自己公司的出口对接ipsec VPN
3.最为省钱测试用的,就是在云服务器搭建自己的ipsec VPN软件了(openswan或者strongswan),之前做深信服设备的时候也经常有客户提出要和strongswan对接的。社区内应该早已经有相关案例了:
https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=26265
本案例主要还是还原验证一下openswan(小编最终的目的本来是要做内网穿透的)
第一章:实验验证环境介绍
    本次实验是尽力模仿真实的环境,在云上直接购买一台VPS云主机,纯属测试,带宽只有1Mbps,测试是足够用了。
整体拓扑如下:
0.PNG
    为了深入了解这其中ipsec VPN的工作原理,包括openswan小弟我也亲历亲为一下,因为linux功底差。来回的折腾,因为之前没有参考社区大神发的文章,踩了不少坑,也算是搞成了。
   云主机配置:百度云1C 1G 1Mbps centos6.5 安装opemswan(注意网上教程大部分是6.5的,用7.0搭建很容易踩坑)

第二章:配置最终效果展示
(1)深信服端配置,标准ipsec VPN,采用野蛮模式:
iskmp第一阶段配置:
2020-01-25_142540.PNG

isakmp第二阶段,入站与出站配置:
2020-01-25_142636.PNG

默认安全选项是 ESP MD5 3DES
PFS参数默认是第一阶段的DH5
2020-01-25_142658.PNG

设备PDLAN日志确认连接过程:
一阶段成功:
2020-01-25_142742.png
二阶段成功
2020-01-25_142743.png

连接状态确认:
2020-01-25_143822.PNG

(2)百度云VPS主机的openswan上的配置:
openswan配置文件:/etc/ipsec.conf
一阶段配置:
2020-01-25_031407.PNG

二阶段配置:(二阶段left VPS云主机一侧为什么没有配置弹性公网IP,而是用了内网IP,也是因为排错过程中发现公有云会将isakmp协商数据包500端口的报文的目的地址由106.12.X.X自动替换为内网IP172.16.0.4 ,导致的虚拟机云主机收到该报文后发现目的地址不一致导致报文丢弃,因此才改了,详细的排错过程还会有说明)这都是公有云下VPC弹性网络搞的怪!!!!也可以让left或者right设置为0.0.0.0用于接收所有的IP连接请求。
2020-01-25_031431.PNG

openswan ike协商预共享密钥文件配置:/etc/ipsec.secrets
2020-01-25_031809.PNG
  配置全0.0.0.0是为了让所有的连接都能使用该密码,这个实际上不安全,可以使用RSA证书认证,但是配置太麻烦了,我放弃了。当然也可以使用ID域名字符串来定义匹配的预共享密钥
   注意openswan很注重格式,/etc/ipsec.conf中有TAB空格,如果格式错误,openswan的ipsec vpn服务无法正常拉起!!!!!!
openswan建立成功:#/etc/init.d/ipsec status  输出:1active
2020-01-25_031916.PNG

(3)验证连通性:
企业内网192.168.4.X主机访问VPS云主机;
2020-01-25_152644.PNG

云主机访问企业内部网络:
2020-01-25_152715.PNG


第三章:openswan搭建细节分享(防止大家踩坑)
    搭建过程中也确实踩了不少的坑,百度,google,github找了一堆的材料,一个一个的去尝试。因此在这里将搭建过程分享出来。
   搭建openswan不得不简单了解一下openswan:
    目前不通过yum安装的openswan:# yum install openswan lsof -y 实际上都是libreswan,Libreswan是基于(“IPsec”)和Internet密钥交换(“IKE”)的最广泛支持和标准化VPN协议的自由软件实现。这些标准由互联网工程任务组 (“IETF”)制作和维护。Libreswan已经积极开发超过15年,回到1996年由John Gilmore和Hugh Daniel创立FreeS/WAN项目。该代码在2003年被分为继续作为The Openswan项目。2012年,由于对“openswan”这一商标提起诉讼,它被迫重命名为Libreswan项目

    (1)云主机的购买与使用小编不做过多描述,一般有公有云的流行程度,没有什么难度,花钱就可以了。
1.PNG

   (2)云主机的SSH登录安装openswan
安装前的准备工作
a.关闭SELinux
[root@instance-k0k440ti ~]# setenforce 0
setenforce: SELinux is disabled
2.PNG

b.开启数据转发
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
3.PNG

c.关闭icmp重定向
# sysctl -a | egrep"ipv4.*(accept|send)_redirects" | awk -F "="'{print$1"= 0"}' >> /etc/sysctl.con
# sysctl -p 写入内存
4.PNG

d.关闭源路由验证(防止linux主机判断数据包转发路径不是最有而丢弃数据包)
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0
sysctl -p  写入内存
Linux内核参数之rp_filter:(为什么要关闭在原理上可以参考这个网址,认为写的很好)

e.Iptables防火墙正常放通
关闭iptables或者开启iptables必要端口,注意要保存iptables配置
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT   
iptables -A INPUT -p tcp --dport 4500 -j ACCEPT
# iptables –t nat -A POSTROUTING -m policy --dir out --pol none -j MASQUERADE (野蛮模式用到)
/etc/init.d/iptables save(只符合6.5版本)
也可以全部放通:(不太安全,不建议,除非在排错过程中采用)
清空iptables 并开启iptables 转发:
# iptables  -t nat -F
# iptables  -t nat -X
# iptables  -t nat -Z
# iptables   -F
# iptables   -Z
# iptables   -X
# iptables –t nat -A POSTROUTING -m policy --dir out --pol none -j MASQUERADE
# service iptables save

状态确认:# iptables -nL
13.png

安装openswan
# yum install openswan lsof -y
安装lsof:用于数据访问,没有安装下面配置完openswan验证时可能会报错
5.PNG
安装命令:(也可以使用编译安装方法)
# yum install -y make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced man nss openswan (成功的时候用了这个)

# rpm -ql libreswan (//查看安装了那些文件,要用libreswan)
14.png

验证服务,如果有报错,根据提示处理相应的问题:
# ipsec verify(正常的话如下图)
启动服务:ipsec setup  start|stop|restart (centos6.5可用 7.2不能)
7.2用此命令来启动服务:systemctl start  ipsec.service
systemctl status  ipsec.service (查看服务状态)

10.PNG

配置openswan的ipsec VPN参数(只需配置: /etc/ipsec.conf 和 /etc/ipsec.secrets
a.参考配置ipsec.conf:
# cat /etc/ipsec.conf
实际配置时候注意格式,config setup下每行前面TAB空格
version 2
config setup
        protostack=netkey       //使用2.6内核内建模块netkey,2.6以下是KLIPS模块
        nat_traversal=yes       //nat穿透,野蛮模式下要开启NAT穿透virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10   //允许这些私有网段在ipsec vpn中加密传输,保持默认即可,不用更改
        dumpdir=/var/run/pluto/
        logfile=/var/log/pluto.log     //log location,日志分析,排错时候要查看该日志目录信息。
        include /etc/ipsec.d/*.conf
2020-01-25_031407.PNG
conn BY-to-UC  //建立连接,名称随意
        # 第一阶段(两端要保持一致)
        ike=3des-sha1
        authby=secret  //使用预共享密钥方式进行认证
        # 第二阶段(两端要保持一致)
        phase2=esp  //用于连接的ESP加密/认证算法。
        phase2alg=3des-sha1
         aggrmode=yes  //开启野蛮模式,默认为no主模式
        compress=no  //所有计划的IPsec sa都要包含IPCOMP(压缩)。如果KLIPS没有配置IPCOMP支持,会忽略该选项。
        type=tunnel  //使用tunnel隧道模式
        pfs=yes  //完全加密

        leftid=@baiduyun
        left=公有云一侧地址(公网弹性IP或者虚拟机接口地址)
        leftsubnet=172.16.0.0/20 //公有云内网网段
        leftnexthop=%defaultroute        

        rightid=@sangfor
        right=深信服一侧IP地址(如果野蛮模式,深信服一侧没有公网IP可以写0.0.0.0)
        rightsubnet=192.168.4.0/24 //深信服一侧企业内网网段
        rightnexthop=%defaultroute
        auto=start   //add代表只是添加,但并不会连接,如果为start则代表着启动自动连接
2020-01-25_031431.PNG

b.配置与预共享key
# vim /etc/ipsec.secrets
##include /etc/ipsec.d/*.secrets
##源IP 目标IP: PSK "(key)" (0.0.0.0 即为所有 vpn 都使用这个 key)
0.0.0.0   0.0.0.0 : PSK "预共享密钥"  (注意空格格式不能错)

野蛮模式下可以使用:
@baiduyun @sangfor: PSK "与共享密钥"
Ps;此处很重要,如果还是填写ip地址,会导致第一阶段无法建立,一直处于超时状态
2020-01-25_031809.PNG
最后设备VPN服务自启动:chkconfig ipsec on

第四章:排错过程分享(排错值得分享)
    所有的操作不可能像上面第一二三章的看着那么随意,个人的重点目的还是为了练习自己在ipsec VPN方面的排错能力:下边分享自己搭建后对接时候几个问题:

问题(1):第一阶段建立连接超时:
建立连接超时.PNG
   思路:这个报错第一想到就是,我是拿深信服主动去连接的openswan,现在是建立连接超时是不是深信服设备与百度云VPS云主机:106.12.X.X 无法联通:

a.是无法ping这个IP?----这个验证比较简单检查第一阶段配置IP是否错误,AC控制台界面ping106.12.X.X检测;
b.是UDP/TCP 4500 UDP500端口不通?(方法:找一台linux主机nc命令验证UDP端口状态);
nc -z -v -u 目的IP地址 端口
2020-01-24_133922.png
结果返回正常

如果返回不正常,可以检查下边几点:(个人建议,方法很多很灵活)
    VPC云主机的平台界面防火墙,云主机控制台界面有防火墙;
    openswan的ipsec VPN的服务状态是否running,
    运行#netstat -npl  产看平台监听端口状态是否有4500和500;
    iptales防火墙端口状态 SElinux防火墙状态是否正常放通。

c.是openswan的云主机VPS根本没有收到包或者收到包了没有回包??
linux主机上使用tacpdump进行抓包:深信服AC使用界面抓包:(在这里发面了问题,果然是VPC云主机收到了包但是不回包)

深信服一侧抓包,发现500端口的isakmp第一阶段协商报文是发出去了。
15.png

云主机一侧抓包eth0网卡,确认数据包也收到了:
16.png

   但是问题来了,目的地址有VPC弹性公网IP变成了内网IP,于是改了openswan的第一阶段参数,更改left=172.16.0.4,更改后马上就有VPC主句的对isakmp协商报文的response响应:

问题(2)收到VPC云主句openswan关于ipsec isakmp协商的相应报文,但是只提示没有可选的提议:

参数报错.PNG

这个报错更让我郁闷了,查看openswan报错日志,cat /var/log/pluto.log ,以及两边抓包日式也都是没有可选提议,没什么参考价值嘛:

2020-01-25_172020.PNG

于是反复google一堆,因为百度实在是百度不出来,发现是二阶段少配置了一些参数: /etc/ipsec.conf少配置了一些参数:
version 2 //没有配置,最早前面有#号不生效
phase2=esp //二阶段的一些参数也没有配置
phase2alg=3des-md5
配置后遇到问题(3)

问题(3)深信服一侧看到了常见的协商参数错误,NAT-T DH PFS,看到这个就感觉快要成功了:

再次变更参数有算法交互了.PNG

解决方法更改为野蛮模式对接:野蛮模式的一些报错更改深信服一侧的参数就可以解决了:

更改为野蛮模式.PNG

常见的身份ID错误

野蛮模式更改后参数提醒.PNG

更改后成功协商:搞定了!!!
一阶段成功:
2020-01-25_142742.png
二阶段成功
2020-01-25_142743.png

好了,本次的分享就到这里,其实开源的openswan还是比较灵活的,但是好在有深信服强大的PDLAN日志分析功能,让我不用看openswan的log日志和具体wireshark分析(其实我也看不懂
但愿有大神多多指正!!!

喜欢这篇文章吗?喜欢就给楼主打赏吧!

打赏
5人已打赏

nihongliang 发表于 2020-1-29 20:36
  
写的很细致,关于openswan/strongswan的对接,还是有些细节上需要注意和区别,还有关于排错这一块plutolog也很重要,尤其是在野蛮模式下sangfor主动连接的时候,此时排错还是得靠plutolog可以快速定位问题,年后上班过来分享一下。现在openswan版本升级后nat_traversal=yes这行已经不需要配置了,配置后启动ipsec服务会有一个报错,提示是过期的配置。
Sangfor_闪电回_朱丽 发表于 2020-2-8 20:35
  
您好,感谢您参与社区原创分享计划6,您的文章已被收录到计划中,交由专家评审小组评审,文章标签在专家评审后设置,分享奖励将在活动结束后统一安排发放!分享越多,奖励越多,期待您更多的精彩分享哦!
关于技术文章的管理流程,请参考:https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=90279
心灵鸡汤 发表于 2020-2-11 15:56
  
ipsec VPN,学习了
新手719447 发表于 2020-2-12 19:59
  
看起来好复杂,写的也很细致,谢谢作者
flying 发表于 2020-2-13 08:51
  
干货慢慢,谢谢分享
新手031815 发表于 2020-2-16 13:32
  
不错,学习一下
司马缸砸了光 发表于 2020-2-16 13:41
  
来凑下热闹
司马缸砸了光 发表于 2020-2-16 13:42
  
来凑下热闹
新手741261 发表于 2020-2-16 14:23
  
谢谢分享,认真学习了