1.准备阶段
最近对VPN很感兴趣(虽然我不用)于是乎想利用虚拟机的虚拟网络来,搭建一个site to site 的VPN通信环境来连接两个内网(先用虚拟机来试验试验),我对虚拟机的虚拟网段的IP进行了更改(为了方便记忆),vmnet1为192.168.10网段、vmnet2为192.168.20网段······以此类推。
其网络的拓扑图如下(vmnet8为虚拟机里net模式的虚拟网络,具体在虚拟网络编辑器里设置)
如图 ,两个内网网段分别是
left:192.168.10.0/24
right:192.168.20.0/24
左右两个VPN服务器都有两个网卡,一个为内网的,另一个为外网的(vmnet8),其地址在图中已表示。图中用一个路由器来表示两个服务器在外网网段内的连接(其实简化了许多)。
PS:在vmware虚拟机上添加网卡(默认只有一个)
打开虚拟机后,在开启的下面,点击编辑虚拟机设置,在弹出的对话框中点击添加,选择网络适配器即可,之后在编辑虚拟机的对话框内,设置两个网卡一个为vmnet8,一个为vmnet1(另一个vmnet2)。
接下来开启虚拟机,打开之后先用ifconfig看一下有没有地址配上,如果发现网卡(我的是ens33与ens37)下面没有IP地址相匹配,则需要修改一下配置
#vi /etc/sysconfig/network-scripts/ifcfg-ens33
将里面的ONBOOT=no改为ONBOOT=yes
之后再重启一下network就行了
#systemctl restart network
再ifconfig就正常了,记住两个网卡的IP地址之后要用。
接下来开启数据转发:
# vim /etc/sysctl.conf
对这个文件进行改动添加 :
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
添加这些就可以了(有些情况下不添加好像也行,还是保险些吧>>_>>),接下来是关闭icmp重定向
# sysctl -a | egrep "ipv4.*(accept|send)_redirects" | awk -F "=" '{print$1"= 0"}' >> /etc/sysctl.conf
之后再运行
# sysctl -p
运行完这个后会发现/etc/sysctl.conf中又会多出一些多东西那些是系统自动生成的关于自身网卡的
最后我们关闭SELinux,准备工作就结束了!
#setenforce 0
2.下载openswan(libreswan)与xl2tpd
在centos上我是直接用yum 下载的,首先安装epel源,要不你下载openswan与xl2tpd是会显示没有这个包
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
安装完后直接yum正常下载就行了
#yum install openswan -y
#yum install xl2tpd
安装往后细心的会发现我们安装是libreswan, 其实与openswan 都差不多,这个不用细究。
我们可以先启动一下ipsec与xl2tpd 看看有没有什么问题(这个阶段一般不会有问题,不过还是启动一下看一看)
#systemctl start ipsec
#systemctl start xl2tpd
#ipsec verify 来验证一下是这个样子的:
如果不能正常启动那就卸了重装。
接下来通过netstat -anp可以看到openswan 监视再500与4500端口:
#netstat -anp
3.服务端配置相关文件
在这里我们采用基于RSA的数字签名算法的认证方式,首先我们初始化NSS数据库:/etc/ipsec.d中,
#ipsec initnss --nssdir /etc/ipsec.d
之后再生成新的本机密钥
#ipsec newhostkey --output /etc/ipsec.secrets
这里的ckaid 后面的一大串字符要记录下来之后有用
之后再生成本机的公钥,这里为right的服务器上:
#ipsec showhostkey --right --ckaid "上面CKAID后面的字符串"
当在左边的服务器是把上面的 --right 改为 --left,在这里的rightrsasigkey(leftrsasigkey)要记录下来之后的配置文件里都要用到。
接下来在/etc/ipsec.d/文件下创建自己的连接配置文件mytunnel.conf,这个是两个服务器VPN通信的配置文件
#touch /etc/ipsec.d/mytunnel.conf
接着开始编写这个配置文件:
上面的rightrsasigkey(leftrsasigkey)为刚刚生成的服务器的公钥,到时候传输过程中会利用这个公钥进行加密以保证安全
left与right分别为两个服务器位于80(vmnet8)网段的网卡的地址(之前记录过),leftsubnet(rightsubnet)为服务器另两个网卡所属的想要利用VPN进行通信的两个内网的地址(本例中为10网段与20网段)。leftnexthop(rightnexthop)设置为默认路由就行了,auto设置为start,到时候启动ipsec时就会自动引入mytunnel配置文件。
接下来修改/etc/ipsec.conf文件
#vi /etc/ipsec.conf
在virtual下面加上这三个就行了:(virtual的值不要改动!!)
接下来对xl2tpd相关文件进行配置:
#vi /etc/xl2tpd/xl2tpd.conf
vi /etc/ppp/options.xl2tpd
其中的ip range为内网中希望允许进行通信的IP地址区间,local ip为服务器位于内网的网卡的ip地址。其余的照着写上就行了。
然后添加客户端可以使用的的xl2tpd用户的用户名与密码
#vi /etc/ppp/chap-secrets
接下来还需要修改一下防火墙的策略,直接运行下面这几行代码就行:
#iptables -t nat -A POSTROUTING -m policy --dir out --pol none -j MASQUERADE
#iptables -A FORWARD -i ppp+ -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o em1 -j MASQUERADE
#iptables -I INPUT -p udp -m multiport --dport 1701,4500,500 -j ACCEPT
#iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o em1 -j MASQUERADE
#iptables -I FORWARD -s 192.168.20.0/24 -j ACCEPT
#iptables -I FORWARD -d 192.168.20.0/24 -j ACCEPT
最后三条命令里面的ip要改为服务器所在的内网的网段。
两端的服务器都是如此的配置
最后重启ipsec 与xl2tpd就行了
#systemctl restart ipsec
#systemctl restart xl2tpd
再查看一下ipsec的运行状态看看是否已经连接:
systemctl status -l ipsec
到此服务端的配置就已经完事了。接下来看看在Linux与Windows下如何连接服务器进行通信
4.客户端配置相关文件
4.1Linux下的配置(centos7):
首先在客户端下载xl2tpd之前已经说过了
下载完后首先编辑/etc/xl2tpd/xl2tpd.conf文件
上面的那些不用动,将里面的[lns ....]那个栏目删去就行了,直接添加图中的[lac l2tpvpn]栏目。
接下来编辑/etc/ppp/options.xl2tpd文件:
user与password为在服务端中设置的用户名与密码。
接下来在如下目录中创建l2tpd-control控制文件:
然后重启(启动)xl2tpd引入客户端的lac配置:
#systemctl restart xl2tpd
# xl2tpd -c /etc/xl2tpd/xl2tpd.conf
# echo 'c l2tpvpn' >/var/run/xl2tpd/l2tp-control
查看ip link 看看是否已经出现了ppp通信隧道(客户端与主机):
会看到下面有一个ppp0,这里就已经成功建立好了!
这里都会看到已经建立成功!
下来在客户端添加路由表(另一个要通信的内网网段与服务器通信所在的80网段):
# ip route add 192.168.80.0/24 via 192.168.10.1
# ip route add 192.168.20.0/24 via 192.168.10.1
192.168.10.1为ifconfig 后所看到的ppp0所使用的隧道通信的地址
之后再ping 80网段与20网段(内网)的服务器地址均能ping通。site to site vpn 通信搭建成功!!!!!
在80网段与10网段进行抓包分析:
两个服务器间的80网段上的来自数据包客户端的数据包,已经加密(ESP加密包),状态正常。
服务器与客户端的通信使用的也是l2tp数据包,一切正常,哈哈哈哈哈~~~
4.2Windows10客户端上的配置
Windows上的配置就比较简单了
点击添加
如上配置,然后保存即可
点击连接,之后输入服务端中设置的用户名与密码即可
连接成功!!!
ping也通了,有时候会超时,这个不用担心,去另一个内网的客户端ping一下,再回来ping就通了
因为有一个路由表的更新过程。
至此大功告成!!!