本帖最后由 Princeling 于 2020-1-25 17:42 编辑
目前混合云的大形势下,很多企业都有自己的公有云上业务,云上业务要实现与企业出口设备实现互联互通,
本案例主要还是还原验证一下openswan(小编最终的目的本来是要做内网穿透的) 第一章:实验验证环境介绍 本次实验是尽力模仿真实的环境,在云上直接购买一台VPS云主机,纯属测试,带宽只有1Mbps,测试是足够用了。 整体拓扑如下: 为了深入了解这其中ipsec VPN的工作原理,包括openswan小弟我也亲历亲为一下,因为linux功底差。来回的折腾,因为之前没有参考社区大神发的文章,踩了不少坑,也算是搞成了。 云主机配置:百度云1C 1G 1Mbps centos6.5 安装opemswan(注意网上教程大部分是6.5的,用7.0搭建很容易踩坑)
第二章:配置最终效果展示 (1)深信服端配置,标准ipsec VPN,采用野蛮模式: iskmp第一阶段配置:
isakmp第二阶段,入站与出站配置:
默认安全选项是 ESP MD5 3DES PFS参数默认是第一阶段的DH5
设备PDLAN日志确认连接过程: 一阶段成功: 二阶段成功
连接状态确认:
(2)百度云VPS主机的openswan上的配置: openswan配置文件:/etc/ipsec.conf 一阶段配置:
二阶段配置:(二阶段left VPS云主机一侧为什么没有配置弹性公网IP,而是用了内网IP,也是因为排错过程中发现公有云会将isakmp协商数据包500端口的报文的目的地址由106.12.X.X自动替换为内网IP172.16.0.4 ,导致的虚拟机云主机收到该报文后发现目的地址不一致导致报文丢弃,因此才改了,详细的排错过程还会有说明)这都是公有云下VPC弹性网络搞的怪!!!!也可以让left或者right设置为0.0.0.0用于接收所有的IP连接请求。
openswan ike协商预共享密钥文件配置:/etc/ipsec.secrets 配置全0.0.0.0是为了让所有的连接都能使用该密码,这个实际上不安全,可以使用RSA证书认证,但是配置太麻烦了,我放弃了。当然也可以使用ID域名字符串来定义匹配的预共享密钥 注意openswan很注重格式,/etc/ipsec.conf中有TAB空格,如果格式错误,openswan的ipsec vpn服务无法正常拉起!!!!!! openswan建立成功:#/etc/init.d/ipsec status 输出:1active
(3)验证连通性: 企业内网192.168.4.X主机访问VPS云主机;
云主机访问企业内部网络:
第三章: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)云主机的购买与使用小编不做过多描述,一般有公有云的流行程度,没有什么难度,花钱就可以了。
(2)云主机的SSH登录安装openswan 安装前的准备工作 a.关闭SELinux [root@instance-k0k440ti ~]# setenforce 0 setenforce: SELinux is disabled
b.开启数据转发# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0
c.关闭icmp重定向 # sysctl -a | egrep"ipv4.*(accept|send)_redirects" | awk -F "="'{print$1"= 0"}' >> /etc/sysctl.con # sysctl -p 写入内存
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
安装openswan # yum install openswan lsof -y 安装lsof:用于数据访问,没有安装下面配置完openswan验证时可能会报错 安装命令:(也可以使用编译安装方法) # yum install -y make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced man nss openswan (成功的时候用了这个)
# rpm -ql libreswan (//查看安装了那些文件,要用libreswan)
验证服务,如果有报错,根据提示处理相应的问题: # ipsec verify(正常的话如下图) 启动服务:ipsec setup start|stop|restart (centos6.5可用 7.2不能) 7.2用此命令来启动服务:systemctl start ipsec.service systemctl status ipsec.service (查看服务状态)
配置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 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则代表着启动自动连接
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地址,会导致第一阶段无法建立,一直处于超时状态 最后设备VPN服务自启动:chkconfig ipsec on
第四章:排错过程分享(排错值得分享) 所有的操作不可能像上面第一二三章的看着那么随意,个人的重点目的还是为了练习自己在ipsec VPN方面的排错能力:下边分享自己搭建后对接时候几个问题:
问题(1):第一阶段建立连接超时:
思路:这个报错第一想到就是,我是拿深信服主动去连接的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地址 端口 结果返回正常
如果返回不正常,可以检查下边几点:(个人建议,方法很多很灵活) VPC云主机的平台界面防火墙,云主机控制台界面有防火墙; openswan的ipsec VPN的服务状态是否running, 运行#netstat -npl 产看平台监听端口状态是否有4500和500; iptales防火墙端口状态 SElinux防火墙状态是否正常放通。
c.是openswan的云主机VPS根本没有收到包或者收到包了没有回包?? linux主机上使用tacpdump进行抓包:深信服AC使用界面抓包:(在这里发面了问题,果然是VPC云主机收到了包但是不回包)
深信服一侧抓包,发现500端口的isakmp第一阶段协商报文是发出去了。
云主机一侧抓包eth0网卡,确认数据包也收到了:
但是问题来了,目的地址有VPC弹性公网IP变成了内网IP,于是改了openswan的第一阶段参数,更改left=172.16.0.4,更改后马上就有VPC主句的对isakmp协商报文的response响应:
问题(2)收到VPC云主句openswan关于ipsec isakmp协商的相应报文,但是只提示没有可选的提议:
这个报错更让我郁闷了,查看openswan报错日志,cat /var/log/pluto.log ,以及两边抓包日式也都是没有可选提议,没什么参考价值嘛:
于是反复google一堆,因为百度实在是百度不出来,发现是二阶段少配置了一些参数: /etc/ipsec.conf少配置了一些参数: version 2 //没有配置,最早前面有#号不生效 phase2=esp //二阶段的一些参数也没有配置 phase2alg=3des-md5 配置后遇到问题(3)
问题(3)深信服一侧看到了常见的协商参数错误,NAT-T DH PFS,看到这个就感觉快要成功了:
解决方法更改为野蛮模式对接:野蛮模式的一些报错更改深信服一侧的参数就可以解决了:
常见的身份ID错误
更改后成功协商:搞定了!!!:大哭:
好了,本次的分享就到这里,其实开源的openswan还是比较灵活的,但是好在有深信服强大的PDLAN日志分析功能,让我不用看openswan的log日志和具体wireshark分析(其实我也看不懂) 但愿有大神多多指正!!! |