VPN
net-to-net VPN
上次的隧道实例在传输过程中是没有加密的,加密后就是网对网的VPNVirtual Private Network)了。如
何加密?
: 可以使用IPSec协议来进行加密。
IPSec是什么?
: IPSec(Internet Protocol Security, Internet 协议安全性) 一组IP安全协议集, 通过使用加密的安全服务以确
保在 Internet 协议 (IP) 网络上进行保密而安全的通讯。我们这里主要的应用就是IPSec VPNIPSEC的加密
通信中包含了两个协议,分别为AH(Authentication header验证包头),用于对端验证,ESP(Encapsulating
security payload,封装安全载荷)协议,用于加密。
如何实现IPSec VPN?
: linux上相应的开源软件有freeswan,strongswan,openswan,libreswan等。目前centos7的镜像文件里自
带的软件为libreswan
实验: libreswan实现net-to-net VPN
实验准备: 四台虚拟机,和隧道实验的一样。可以直接接着隧道实验继续做
实验步骤:
1. 把隧道先删除(如果是新准备的环境没有隧道环境,无视这一步)
2. 两地VPN服务器上安装libreswan软件包
3. 两地VPN服务器上分别产生加密传输所需要的密钥
4. 配置两地VPN服务器(主要配置两地的公网IP,内网网段,密钥等)
5. 启动两地的VPN服务(服务名称为ipsec)
6. 测试验证
1,先使用ip tunnel del tun0把上面做的tunnel给删除掉,确认深圳与北京内网不能互通。而下面我们的目的就是
要让它们互通,并且加密传输
2,在深圳vpn和北京vpn上安装libreswan(本地yum源就可以)
# yum install libreswan
3,在深圳vpn和北京vpn上分别产生密钥(我这里定义深圳为left,北京为right)
深圳vpn
# rm /etc/ipsec.d/*.db -rf
# ipsec initnss
# rm /etc/ipsec.secrets -rf
# ipsec newhostkey --output /etc/ipsec.secrets
# ipsec showhostkey --left --这里是left
ipsec showhostkey loading secrets from "/etc/ipsec.secrets"
ipsec showhostkey loaded private key for keyid: PPK_RSA:AQOwU+sNI
# rsakey AQOwU+sNI
leftrsasigkey=0sAQOwU+sNITn......
====================================================
注意:centos7.4以上自带的librewan在创建key的时候要多加一个ckaid;操作如下
# ipsec newhostkey --output /etc/ipsec.secrets
Generated RSA key pair with CKAID b24219f0e84b0aaa6e3b054c707e1993c0c1c78d was stored
in the NSS database
# ipsec showhostkey --left --ckaid b24219f0e84b0aaa6e3b054c707e1993c0c1c78d
# rsakey AwEAAdbBY
leftrsasigkey=0sAwEAAdbBYBxjW......
========================================================
北京vpn
# rm /etc/ipsec.d/*.db -rf
# ipsec initnss
# rm /etc/ipsec.secrets -rf
# ipsec newhostkey --output /etc/ipsec.secrets
Generated RSA key pair using the NSS database
# ipsec showhostkey --right --这里是right
ipsec showhostkey loading secrets from "/etc/ipsec.secrets"
ipsec showhostkey loaded private key for keyid: PPK_RSA:AQPtd7QeG
# rsakey AQPtd7QeG
rightrsasigkey=0sAQPtd7QeG.......
===========================================================
4, 配置两边VPN服务器的主配置文件,建立新的VPN链接(先只配置一边VPN,配置完后直接scp拷到另一边的VPN,不
用做任何修改)
# vim /etc/ipsec.d/sz-to-bj.conf --自己建立一个子配置文件,名字以.conf结尾就行
conn sz-to-bj --一个vpn连接的名称,名字随意
   leftid=@szvpn --vpnid标识,按格式,名字随意
   left=192.168.72.128 --vpn的公网ip
   leftsubnet=192.168.100.0/24 --vpn的内网网段
   leftrsasigkey=0sAQOwU+sNIT...... --前面第二步在左vpn上得到的leftkey(最好复制粘贴过
)
   rightid=@bjvpn
   right=192.168.72.129
   rightsubnet=192.168.101.0/24
   rightrsasigkey=0sAQPtd7QeG......
   auto=start --启动服务时,会自动启动这个连接
scp把配置文件拷给另外一台,路径保持一致
# scp /etc/ipsec.d/sz-to-bj.conf 192.168.72.129:/etc/ipsec.d/
5, 两边vpn服务器启服务
# systemctl start ipsec.service
# systemctl status ipsec.service
# systemctl enable ipsec.service
6, 还要注意两点:
a),把两台vpn服务器的ip_forward打开
b),两台vpn服务器上要随便加一个网关(这个网关ip可以不存在都行)
--原因是这个网关是默认的下一跳地址,实际环境指的就是前端路由出口,但我们这里是把192.168.72.129
192.168.72.129直接模拟公网ip,所以就不需要前端路由。但是这个软件还是要加一个网关才行
问题: 上面做的是深圳,北京两地的局域网互连,如果再加一个上海,怎么实现sz,bj,sh三地局域网的vpn互联呢?
: 两两互联。
拓展实验:实现sz,bj,sh三地局域网的vpn互联
然后两边的内网就可以互相ping通了
在两台vpn服务器上tcpdump抓包可以看到有ipsec的加密
# tcpdump -i eth0 host 192.168.72.128 and 192.168.72.129 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:15:10.535976 IP 192.168.72.128 > 192.168.72.129: ESP(spi=0x4255583a,seq=0x179),
length 132
12:15:10.536429 IP 192.168.72.128 > 192.168.72.129: ESP(spi=0xd97b1499,seq=0x179),
length 132
12:15:10.873037 IP 192.168.72.128 > 192.168.72.129: ESP(spi=0xd97b1499,seq=0x17a),
length 132
12:15:10.873392 IP 192.168.72.128 > 192.168.72.129: ESP(spi=0x4255583a,seq=0x17a),
length 132
12:15:11.536145 IP 192.168.72.128 > 192.168.72.129: ESP(spi=0x4255583a,seq=0x17b),
length 132
12:15:11.536668 IP 192.168.72.128 > 192.168.72.129: ESP(spi=0xd97b1499,seq=0x17b),
length 132
12:15:11.873129 IP 192.168.72.128 > 192.168.72.129: ESP(spi=0xd97b1499,seq=0x17c),
length 132
12:15:11.873679 IP 192.168.72.128 > 192.168.72.129: ESP(spi=0x4255583a,seq=0x17c),
length 132
抓包里看到有ESP的信息则表示隧道加密了
深圳    北京 上海
192.168.72.128192.168.72.129192.168.72.130
  1    23
192.168.100.2   192.168.101.3   192.168.102.4
  12 3
192.168.100.6   192.168.101.5   192.168.102.5
网关指向192.168.100.2网关指向192.168.101.3  网关指向192.168.102.4
答:
配置方法一:
深圳:
sz-to-bj
sz-to-sh
北京:
sz-to-bj
bj-to-sh
上海:
sz-to-sh
bj-to-sh
配置方法二:
深圳:
sz-to-bj
sz-to-sh
bj-to-sh
北京:
sz-to-bj
sz-to-sh
bj-to-sh
上海:
sz-to-bj
sz-to-sh
bj-to-sh
roadwarrior VPN
问题: 如果我出差在外住酒店,也要有和公司内网有安全传输的需求,如何实现?
什么是roadwarrior VPN
: raodwarrior在这里指的是出差的人。所以这种模式的VPN是指出差的人在外地通过VPN可以连接到公司
网络。
主要应用场景为以下几种:
1,这个你懂的
国内用户 --》 因特网 --》 国外VPN服务器 --》 facebook,youtube
2,出差员工在外任何地方(只要有网络)就可以通过加密链路连接到公司内网
出差用户windows --》 酒店路由器 --》 公司VPN服务器 --》 公司内网服务器
3, 运维人员在外或在家就可以办公
在家管理员用户 --》 家里路由器 --》 公司VPN服务器(防火墙,堡垒机,跳板机,审计等) --》 公司内
部被管理的服务器集
拓展实验: libreswan实现linux客户端点对网VPN
仍然使用上例用到的结构图(ip不变,但角色变了)
实验准备:
 192.168.72.128      192.168.72.129
  酒店路由器   公司VPN服务器(打开ip_forward)
 192.168.100.2   192.168.101.3
员工在酒店内笔记本获取的内网IP 公司内网机器
192.168.100.6 192.168.101.5
网关指向192.168.100.2 网关指向192.168.101.3
实验步骤:
1. 在出差员工笔记本上和VPN服务器上安装libreswan
2. 在出差员工笔记本上和VPN服务器上产生加密传输所需的密钥
3. 在出差员工笔记本上和VPN服务器上配置
4. 在出差员工笔记本上和VPN服务器上启动服务
5. 验证
1,在酒店路由器上systemctl stop ipsec.service;还要把网关也删除掉。因为现在它是默认酒店的一个路由器,
你不可能在上面安装libreswan;
2,需要在酒店路由器做一个SNAT伪装,让员工能上外网
# systemctl start firewalld
# systemctl enable firewalld
# firewall-cmd --add-masquerade
# firewall-cmd --runtime-to-permanent
3,VPN服务器上再次确认打开ip_forward
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p --保存退出后,用此使用使之生效
做完上面的准备工作后,出差员工在192.168.100.6上能ping192.168.72.129公司VPN服务器公网IP了,但
ping不通192.168.101.5公司内网服务器,所以需要做VPN拔号上去
1,192.168.100.6(这里模拟出差的员工带的笔记本)上安装libreswan
# yum install libreswan
2,在192.168.100.6(出差员工电脑)192.168.72.129(公司VPN服务器)上配置libreswanleftkey
rightkey
步骤也是和上面架构安装时一样,我这里的步骤如下
192.168.100.6(出差员工电脑)上的步骤
# rm /etc/ipsec.d/*.db -rf
# ipsec initnss
# rm /etc/ipsec.secrets -rf
# ipsec newhostkey --output /etc/ipsec.secrets
Generated RSA key pair using the NSS database
# ipsec showhostkey --left
leftrsasigkey=0sAQO8q6mzHW......
192.168.72.129(公司VPN服务器)上的步骤
# rm /etc/ipsec.d/*.db -rf
# ipsec initnss
# rm /etc/ipsec.secrets -rf
# ipsec newhostkey --output /etc/ipsec.secrets
Generated RSA key pair using the NSS database
问题: 这个VPN实验在实际应用时有哪些缺点?
# ipsec showhostkey --right
rightrsasigkey=0sAQPCb+Wdc7......
3,配置客户端和VPN服务器的ipsec.conf主配置文件
先在出差用户的笔记本上(192.168.100.6)配置
# vim /etc/ipsec.d/roadwarrior.conf --手动增加这个子配置文件
conn zhangsan
left=%defaultroute --因为在外出差,酒店的公网IP不固定,所以这里直接指向你的网关就行
leftid=@zhangsan --对你的笔记本做一个标识ID,只要和vpn服务器不一样就行,名字随意
leftrsasigkey=0sAQO8q6mzHW...... --这里的leftkey就是在员工笔记本上得到的key(你在笔
记本上--left--right显示的key是一样的)
right=192.168.72.129 --VPN服务器公网IP,要求IP是固定的
rightid=@vpnserver --vpn服务器的标识ID,名字随意
rightsubnet=192.168.101.0/24--公司的内网网段(再次提一下,192.168.101.0实际上是公
网网段,我这里是实验环境而已)
rightrsasigkey=0sAQPCb+Wdc7..... --这里是rightkey就是在VPN服务器上得到的key(使用-
-left--right也是一样的,同一台服务器左和右显示的key是一样的)
auto=start --表示启动服务时,自动连接.如果笔记本chkconfig ipsec on,那么开机就会自动vpn
连上公司
再在vpn服务器(192.168.72.129)上配置
# rm /etc/ipsec.d/sz-to-bj.conf -rf  --先删除前面实验的配置文件
# vim /etc/ipsec.d/roadwarrior.conf --加上下面一段
conn zhangsan
left=192.168.72.129 --这里VPN服务器公网IP(注意这里leftright换了角色了,在这里
vpnserverleft,出差客户端为right)
leftid=@vpnserver
leftsubnet=192.168.101.0/24
leftrsasigkey=0sAQPCb+Wdc7...... --这是vpn服务器上--left得到的key,--right是一
样的key(只是前面的前缀不一样而已)
right=%any --因为不知道客户端的公网IP(动态的),所以用%any
rightsubnet=vhost:%priv,%no --这句话很重要,如果出差用户是在一个NAT后面(在路由器后
).也就是说出差用户用的是私网IP,那么这句话就是支持这种情况用的
rightid=@zhangsan
rightrsasigkey=0sAQO8q6mzH...... --这是出差用户--right得到的key,--left是一样
auto=start
4,vpn服务器和用户客户端都启动服务
# systemctl start ipsec.service
5,测试
vpn服务器还是随便指一个网关(这个问题在上例中有解释)
客户端(192.168.100.6)就可以ping192.168.101.5这个公司内网了
1. 客户端为linux
2. 如果100个人出差,那么就得做100对密钥。
什么是SSL VPN?
: 与复杂的IPSec VPN相比,SSL通过简单易用的方法实现信息远程连通。典型的Linux下的开源软件
OpenVPN就是一个基于 OpenSSL 库的应用层 VPN实现,它就可以解决上面实验的缺点。
实验: 使用openvpn实现远程vpn
实验准备: 重点是模拟出差员工的电脑要换成windows(要求时间都要同步)
192.168.72.128      192.168.72.129
酒店或者网吧路由器(打开ip_forward)   公司vpn服务器(打开ip_forward)
     192.168.100.2    192.168.101.3
出差用户自带笔记本或者网吧电脑(windows系统) 公司内部服务器
192.168.100.6 192.168.101.5
网关指向192.168.100.2网关指向192.168.101.3
实验步骤:
1. VPN服务器上安装openvpn服务端软件和产生SSL证书的工具
2. 产生相关证书
3. 配置VPN服务器配置文件
4. 启动VPN服务器
5. windows客户端下载openvpn客户端软件和相应的证书文件
6. windows客户端安装openvpn客户端软件
7. windows客户端配置连接的服务器和相应证书
8. 连接测试
准备工作:
1,把上面实验的服务关闭
# systemctl stop ipsec.service
# systemctl status ipsec.service
# systemctl disable ipsec.service
2,windows系统模拟出差员工客户端,网关要指向酒店路由器(dns这里可以不用指,实际情况就直接指向类似
114.114.114.114这种的服务器)
3,在酒店路由器做snat,让内网能够上外网,也就是能够访问到192.168.72.129这个vpn服务器公网ip
# systemctl start firewalld
# systemctl enable firewalld
# firewall-cmd --add-masquerade
# firewall-cmd --runtime-to-permanent
4,在酒店路由器上和VPN服务器都要确认打开ip_forward
5,在模拟员工出差笔记本的这台机器,尝试ping 192.168.72.129,能ping通则表示ok
但现在ping不通192.168.101.5(这也是我们做这个点对网vpn的目的)
服务器端操作:
1,在vpn服务器上安装openvpn(需要epel)  --或者拷贝我提供的软件,然后使用rpm进行安装
# yum install openvpn easy-rsa
2,拷贝easy-rsa目录到openvpn的主配置目录下,并创建相关密钥
# cp -rf /usr/share/easy-rsa/2.0/ /etc/openvpn/
# cd /etc/openvpn/2.0/
# vim vars --修改生成证书的信息,为了后面生成证书方便
export KEY_COUNTRY="CN"
export KEY_PROVINCE="GD"
export KEY_CITY="bj"
export KEY_ORG="itcast"
export KEY_EMAIL="daniel@itcast.cn"
export KEY_OU="IT"
# cp openssl-1.0.0.cnf openssl.cnf
# source vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/2.0/keys
# ./clean-all --执行这句,如果你以前做过keys的话,那么它会帮你删除以前做在/etc/openvpn/2.0/keys
目录里的密钥文件.如果你是第一次,它会帮你产生这个目录
生成ssl证书
# ./build-ca
生成服务器证书
# ./build-key-server server --名字也是随意(但是在后面的配置文件里要对应上)
生成客户端证书
# ./build-key client
生成dh
# ./build-dh   --Diffie hellman(一种确保共享KEY安全穿越不安全网络的方法)
做完之后,确认一共有17个文件,个数不对,表示生成证书步骤有问题,从./clean-all这步重做
# ls keys/ |wc -l
17
3,拷贝主配置文件模版,并修改配置
# cp /usr/share/doc/openvpn-2.4.2/sample/sample-config-files/server.conf /etc/openvpn/
# vim /etc/openvpn/server.conf
32 port 1194
36 proto udp
53 dev tun
78 ca /etc/openvpn/2.0/keys/ca.crt
79 cert /etc/openvpn/2.0/keys/server.crt
80 key /etc/openvpn/2.0/keys/server.key --路径不要写错
85 dh /etc/openvpn/2.0/keys/dh2048.pem
101 server 10.8.0.0 255.255.255.0 --服务器端tun0网卡所在网段,和分配拔号成功的客户端IP所在网
段,也就是他们隧道通迅的网段
142 push "route 192.168.101.0 255.255.255.0" --拔号后给他加一个路由,192.168.101.0就是公司
的内网网段
209 client-to-client --多客户端能互相访问
windows客户端操作:
244 #tls-auth ta.key 0 --注释这一句
263 comp-lzo
267 max-clients 100 --允许的最大客户端数
4VPN服务器上启动服务
# systemctl start openvpn@server.service
# systemctl status openvpn@server.service
# systemctl enable openvpn@server.service
ifconfig tun0 --可以看到下面的信息
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
   inet 10.8.0.1 netmask 255.255.255.255 destination 10.8.0.2
5,把客户端证书和openvpn客户端软件拷贝到windows客户端
要拷的文件有:
/etc/openvpn/2.0/keys/
client.crt
client.key
ca.crt
openvpn-install-2.4.2-I601.exe
6,在windows客户端先双击安装openvpn-install-2.4.2-I601.exe
我的openvpn默认安装路径为C:\Program Files\OpenVPN\
所以把client.crt,client.key,ca.crt三个文件拷贝到C:\Program Files\OpenVPN\config目录
还要把C:\Program Files\OpenVPN\sample-config\里的client文件也拷到
C:\Program Files\OpenVPN\config目录
7,配置client配置文件
用写字板程序打开client配置文件(如果没有写字板,可以使用word打开)
client
dev tun
proto udp
remote 192.168.72.129 1194    --192.168.72.129VPN服务器通向外网的公网IP
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key --这三个文件的路径要对应好,我都在config目录下,所以这里是相对路径
comp-lzo  --这一句也要必须打开注释(对应服务器那边的配置)
实验补充1: 如果公司有多个不同分部(北京,深圳,上海)vpn服务器怎么做?
实验补充2: 这样做的VPN,只要能下载到客户端的SSL证书就可以连接VPN服务器了,还是不够安全。能否加上验证
的功能?
#tls-auth ta.key 1 --注释这一句
8.连接测试
client文件右键--- start ....来进行拔号
--注意1:客户端和服务器时间一定要同步,否则拔号时TLS握手失败
--注意2:注意这几个文件的后缀名和文件类型,要确认是证书文件和key文件(如果不是,可能是保存时的类型不对,
再改后缀名就好)
桌面有一个openvpn的快捷方式,点击后右下角会有一个连接图标(以后可以直接使用这个小图标来连接)
ping 10.8.0.1 可以ping
ping 192.168.101.5也可以ping通了(因为他加了这个网段的路由),说明可以访问内部
192.168.101.0/24这个内网了
答案:
客户端做多个配置文件(名字不一样就行),就配置连接vpn服务器的ip不同,证书不同就可以了
1# vim /etc/openvpn/server.conf --配置文件最后加上下面几句
script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
client-cert-not-required
username-as-common-name
2# vim /etc/openvpn/checkpsw.sh --创建此脚本文件,直接复制下面一大段
#!/bin/sh
PASSFILE="/etc/openvpn/psw-file"
LOG_FILE="/var/log/openvpn/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >>
${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
总结性问题: 下面这几种网络安全传输的应用有哪些区别?
1. 使用gpg2软件网络上使用非对称加密和数字签名实现安全传输(个人与个人)
2. 使用https实现安全传输(客户与网站或应用)
3. 使用VPN实现安全传输 (网对网,点对网)
什么是pptp?
: 点对点隧道协议PPTP(Point to Point Tunneling Protocol)是一种支持多协议虚拟专用网络的网络技术。
echo "${TIME_STAMP}: User does not exist: username=\"${username}\",
password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >>
${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\",
password=\"${password}\"." >> ${LOG_FILE}
exit 1
# chmod 755 /etc/openvpn/checkpsw.sh --给脚本执行权限
3,产生密码文件并添加验证用户和密码
# echo "testuser 123" > /etc/openvpn/psw-file --产生密码文件(路径不能乱改,和上面脚本要对
应,多个用户名和密码,一行一个)
# chmod 600 /etc/openvpn/psw-file --为了安全,密码文件给600权限
4,在windows客户端配置文件的最后也加上下面两句
auth-user-pass
reneg-sec 360000
5,服务器端重启
# systemctl restart openvpn@server.service
6,测试
客户端断开再重新连接测试,会出现登录框,输入上面的用户名和密码验证通过
拓展实验: 使用pptpd实现VPN
实验步骤:
1. pptpd服务器上安装相关软件包,并打开ip_forward
2. 配置pptpd相关配置文件
3. pptpd服务器上启动服务
4. windows客户端配置连接
5. 连接测试
192.168.72.128--这是能上外网的IP
windows pptpd服务器(打开ip_forward)
192.168.100.6 192.168.100.3--这是私有内网网络
实现目的:
windows虚拟机通过pptpdvpn拔号,能够上外网
1, pptpd服务器上安装软件包(需要本地yum源和epel),并确认打开ip_forward
# yum install ppp pptpd -y
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 --改为1
# sysctl -p
2, 配置pptpd相关配置文件
# vim /etc/ppp/options.pptpd
67 ms-dns 114.114.114.114--打开注释,并写上公网的DNS服务器IP
# vim /etc/pptpd.conf
12 ppp /usr/sbin/pppd --打开这一行的注释
102 localip 192.168.72.128 --最后写上这两句(localip要写vpn服务器上外网的IP
103 remoteip 192.168.72.10-100 --写一个分配给客户端拔号的IP范围
# vim /etc/ppp/chap-secrets --写上可以拔号vpn服务器的用户名和密码
test  pptpd  123456* --代表用户名为test,密码为123456;pptpd表示服务名,*表示所有人能连
3, 服务器启动服务
# systemctl restart pptpd
4, windows客户端配置连接
winXP客户端配置
右键网上邻居--》属性--》创建一个新的连接--》下一步--》连接到我的工作场所--》下一步--》虚拟专
用网络连接--》下一步--》填一个随意的连接名(:zhangsan)--》填vpn内网的IP(这里就是
192.168.100.1)-->下一步--》填用户名(test),密码(123456)--》点连接
win7客户端配置
右下角打开网络和共享中心--》设置新的连接和网络--》连接到工作区(VPN)--》使用我的internet连接
(VPN)--》internet地址(填写vpn服务器内网的ip,我这里就是192.168.100.1);目标名称:(随意,
:zhangsan)-->下一步--》填用户名(test),密码(123456)--》点连接
5, 测试:
windows可以上外网了