一、VPN
VPN属于远程访问技术,简单地说就是利用公用网络架设专用网络。例如某公司员工出差到外地,他想访问企业内网的服务器资源,这种访问就属于远程访问。
在传统的企业网络配置中,要进行远程访问,传统的方法是租用DDN(数字数据网)专线或帧中继,这样的通讯方案必然导致高昂的网络通讯和维护费用。对于移动用户(移动办公人员)与远端个人用户而言,一般会通过拨号线路(Internet)进入企业的局域网,但这样必然带来安全上的隐患。
让外地员工访问到内网资源,利用VPN的解决方法就是在内网中架设一台VPN服务器。外地员工在当地连上互联网后,通过互联网连接VPN服务器,然后通过VPN服务器进入企业内网。为了保证数据安全,VPN服务器和客户机之间的通讯数据都进行了加密处理。有了数据加密,就可以认为数据是在一条专用的数据链路上进行安全传输,就如同专门架设了一个专用网络一样,但实际上VPN使用的是互联网上的公用链路,因此VPN称为虚拟专用网络,其实质上就是利用加密技术在公网上封装出一个数据通讯隧道。有了VPN技术,用户无论是在外地出差还是在家中办公,只要能上互联网就能利用VPN访问内网资源,这就是VPN在企业中应用得如此广泛的原因.
常用的VPN技术
GRE,PPTP,L2TP+IPSec
常见的用途
网络fanqiang(不打拼音不让发呀);出差在外连接公司内部服务器;分公司之间的连接
二、GRE VPN
GRE VPN(Generic Routing Encapsulation)即通用路由封装协议,是对某些网络层协议(如IP和IPX)的数据报进行封装,使这些被封装的数据报能够在另一个网络层协议(如IP)中传输。如将ip协议的数据报包装成GRE协议的数据报,并在网络层协议中传输,这样对外来说ip协议数据报就会被隐藏
GRE是VPN(Virtual Private Network)的第三层隧道协议(ip网络层),即在协议层之间采用了一种被称之为Tunnel(隧道)的技术。
有两个知识必须先了解
[GRE协议]https://www.cnblogs.com/sky5hat/p/10470456.html
[IP隧道技术]https://baike.baidu.com/item/IP%E9%9A%A7%E9%81%93%E6%8A%80%E6%9C%AF/8518974?fr=aladdin
配置案例:
1.拓扑图
我们要实现Linux终端与VPN服务器互通,必须知道双方的ip并且做好配置,我们会利用它们的真实ip创造一个隧道,并且为这个隧道配置一个虚拟ip(任意的),这样我们就建立了一个一对一的网络连接
2.Linux终端配置
1)加载ip_gre模块
- [root@client ~]# modprobe ip_gre
- [root@client ~]# lsmod | grep ip_gre //确定是否加载了gre模块
2)建造网络隧道
- [root@client ~]# ip tunnel add tun0 mode gre remote 201.1.2.5 local 201.1.2.10
- //ip tunnel add创建隧道(隧道名称为tun0),ip tunnel help可以查看帮助
- //mode设置隧道使用gre模式
- //local后面跟本机的IP地址,remote后面是与其他主机建立隧道的对方IP地址
3)启用隧道
与网卡的up操作相似
- [root@client ~]# ip link set tun0 up //设置UP
- [root@client ~]# ip link show
4)为VPN配置隧道IP地址
- [root@client ~]# ip addr add 10.10.10.10/24 peer 10.10.10.5/24 dev tun0
- //为隧道tun0设置本地IP地址(10.10.10.10.10/24)
- //隧道对面的主机IP的隧道IP为10.10.10.5/24
- [root@client ~]# ip a s //查看IP地址
- [root@client ~]# firewall-cmd --set-default-zone=trusted //关闭防火墙
3.VPN服务器配置
与Linux客户终端大致相同,VPN服务器一般充当跳板机的作用,作为访问内网的一个入口
1)加载ip_gre模块
- [root@proxy ~]# modprobe ip_gre
- [root@proxy ~]# lsmod | grep ip_gre //确定是否加载了gre模块
2)建造网络隧道
- [root@proxy ~]# ip tunnel add tun0 mode gre remote 201.1.2.10 local 201.1.2.5
- //ip tunnel add创建隧道(隧道名称为tun0),ip tunnel help可以查看帮助
- //mode设置隧道使用gre模式
- //local后面跟本机的IP地址,remote后面是与其他主机建立隧道的对方IP地址
3)启用隧道
与网卡的up操作相似
- [root@proxy ~]# ip link set tun0 up //设置UP
- [root@proxy ~]# ip link show
4)为VPN配置隧道IP地址
- [root@proxy ~]# ip addr add 10.10.10.5/24 peer 10.10.10.10/24 dev tun0
- //为隧道tun0设置本地IP地址(10.10.10.10.10/24)
- //隧道对面的主机IP的隧道IP为10.10.10.5/24
- [root@proxy ~]# ip a s //查看IP地址
- [root@proxy ~]# firewall-cmd --set-default-zone=trusted //关闭防火墙
4.ping命令测试连通性
在两台机子上ping对方,用配置的隧道ip
- [root@proxy ~]# ping -c1 10.10.10.10
- [root@client ~]# ping -c1 10.10.10.5
我们查看一下路由表,会发现多了一个跳转地址,并且是以隧道的形式
[root@proxy ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
192.168.4.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
201.1.2.0 0.0.0.0 255.255.255.0 U 101 0 0 eth3
5.补充
我们可以多创建几个隧道,ip仍然可以随意配置,这么做只是让大家知道,隧道的ip只是一个虚拟ip,我们的目的是要建立这个隧道,这样我们需要达到几个条件:
1.两台终端之间的网络是互通的
2.两台终端必须有真实网卡
3.在两台主机之间建立一个隧道并且保证这条隧道是有效的
[root@proxy ~]# ip addr add 100.100.100.5/24 peer 100.100.100.10/24 dev tun0 //可以多添加一些隧道 并且使用这个隧道的ip去连接其他主机
[root@client ~]# ip addr add 100.100.100.5/24 peer 100.100.100.10/24 dev tun0
三、PPTP VPN
点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术,它工作在第二层。通过该协议,远程用户能够通过 Microsoft Windows NT工作站、Windows xp 、 Windows 2000 和windows2003、windows7操作系统以及其它装有点对点协议的系统安全访问公司网络,并能拨号连入本地ISP,通过 Internet 安全链接到公司网络。
[PPTP协议]https://baike.baidu.com/item/PPTP/610663
PPTP VPN提供了加密机制(通过MPPE),使数据传输更加安全
1.拓扑图
准备两台主机,windows终端和VPN服务器,实验用虚拟机就可以,保证他们有相同网段的虚拟网卡,这里使用201.1.2.0网段的地址
2.VPN服务器-Linux配置
1)安装pptp软件包
- [root@proxy ~]# yum localinstall pptpd-1.4.0-2.el7.x86_64.rpm
- [root@proxy ~]# rpm -qc pptpd
- /etc/ppp/options.pptpd
- /etc/pptpd.conf
- /etc/sysconfig/pptpd
2)修改配置文件
- [root@proxy ~]# vim /etc/pptpd.conf
- .. ..
- localip 201.1.2.5 //服务器本地IP
- remoteip 192.168.1.1-50 //分配给客户端的IP池
- [root@proxy ~]# vim /etc/ppp/options.pptpd
- require-mppe-128 //使用MPPE加密数据
- ms-dns 8.8.8.8 //DNS服务器
- [root@proxy ~]# vim /etc/ppp/chap-secrets //修改账户配置文件
- jacob * 123456 *
- //用户名 服务器标记 密码 客户端
- [root@proxy ~]# echo "1" > /proc/sys/net/ipv4/ip_forward //开启路由转发
3)启动服务
[root@proxy ~]# systemctl start pptpd
- [root@proxy ~]# systemctl enable pptpd
- [root@proxy ~]# firewall-cmd --set-default-zone=trusted
- [root@proxy ~]# iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 201.1.2.5 //翻墙设置,非必须
3.Windows终端配置
需要一台真机,可以与VPN服务器正常通信
或者启动一台Windows虚拟机,使windows虚拟机和VPN虚拟机的虚拟网卡一致,配置本地连接的IP地址为201.1.2.20。
1)设置新的连接或网络
2)连接到工作区
3)否,创建新的连接
4)使用我的Internet连接
5)连接到工作区
输入VPN服务器的配置文件中的ip地址,上面是201.1.2.5
用户名密码输入在VPN服务器上添加的,域不填即可,完了之后点连接
4.测试连通性
在window上win+R 输入cmd打开终端,ping 192.168.1.1-50都可,以VPN服务器上分配的ip为准
四、L2TP+IPSec VPN
L2TP第二层隧道协议(英语:Layer Two Tunneling Protocol,缩写为L2TP)是一种虚拟隧道协议,通常用于虚拟专用网。L2TP协议自身不提供加密与可靠性验证的功能,可以和安全协议搭配使用,从而实现数据的加密传输。经常与L2TP协议搭配的加密协议是IPsec,当这两个协议搭配使用时,通常合称L2TP/IPsec。
L2TP支持包括IP、ATM、帧中继、X.25在内的多种网络。在IP网络中,L2TP协议使用注册端口UDP 1701。因此,在某种意义上,尽管L2TP协议的确是一个数据链路层协议,但在IP网络中,它又的确是一个会话层协议。
IPSec互联网安全协议(英语:Internet Protocol Security,缩写为IPsec),是一个协议包,通过对IP协议的分组进行加密和认证来保护IP协议的网络传输协议族(一些相互关联的协议的集合)。 [1]
IPsec主要由以下协议组成:一、认证头(AH),为IP数据报提供无连接数据完整性、消息认证以及防重放攻击保护;二、封装安全载荷(ESP),提供机密性、数据源认证、无连接完整性、防重放和有限的传输流(traffic-flow)机密性;三、安全关联(SA),提供算法和数据包,提供AH、ESP操作所需的参数。
[L2TP]https://baike.baidu.com/item/L2TP/609253
[IPSec]https://baike.baidu.com/item/ipsec
1.拓扑图
2.VPN服务器配置
1)部署IPSec服务
分为三步:安装软件->修改配置文件-->启动服务
注意:此处需要注意myipsec.conf 格式问题,可以在评论区留言,因为不方便在文章中写出
- [root@client ~]# yum -y install libreswan ///安装软件
- [root@client ~]# cat /etc/ipsec.conf //这是ipsec的主配置文件
- .. ..
- include /etc/ipsec.d/*.conf //加载该目录下的所有配置文件,我们需要修改的是下面的文件
- [root@client ~]# vim /etc/ipsec.d/myipsec.conf //新建该文件,基本配置如下
- conn IDC-PSK-NAT
- rightsubnet=vhost:%priv //允许建立的VPN虚拟网络
- also=IDC-PSK-noNAT
- conn IDC-PSK-noNAT
- authby=secret //加密认证
- ike=3des-sha1;modp1024 //算法
- phase2alg=aes256-sha1;modp2048 //算法
- pfs=no
- auto=add
- keyingtries=3
- rekey=no
- ikelifetime=8h
- keylife=3h
- type=transport
- left=201.1.2.10 //重要,服务器本机的外网IP,本机网卡ip
- leftprotoport=17/1701
- right=%any //允许任何客户端连接
- rightprotoport=17/%any
- [root@client ~]# cat /etc/ipsec.secrets //仅查看,不要修改该文件
- include /etc/ipsec.d/*.secrets
- [root@client ~]# vim /etc/ipsec.d/mypass.secrets //新建该文件
- 201.1.2.10 %any: PSK "randpass" //randpass为预共享密钥 201.1.2.10是VPN服务器的IP
- [root@client ~]# systemctl start ipsec //启动服务
- [root@client ~]# netstat -ntulp |grep pluto //查看是否启动,端口号为3148
- udp 0 0 127.0.0.1:4500 0.0.0.0:* 3148/pluto
- udp 0 0 192.168.4.10:4500 0.0.0.0:* 3148/pluto
- udp 0 0 201.1.2.10:4500 0.0.0.0:* 3148/pluto
- udp 0 0 127.0.0.1:500 0.0.0.0:* 3148/pluto
- udp 0 0 192.168.4.10:500 0.0.0.0:* 3148/pluto
- udp 0 0 201.1.2.10:500 0.0.0.0:* 3148/pluto
- udp6 0 0 ::1:500 :::* 3148/pluto
2)部署XL2TP服务
大家需要下载XL2TP软件包https://pkgs.org/download/xl2tpd
- [root@client ~]# yum localinstall xl2tpd-1.3.8-2.el7.x86_64.rpm //安装软件包
- [root@client ~]# vim /etc/xl2tpd/xl2tpd.conf //修改主配置文件
- [global]
- .. ..
- [lns default]
- .. ..
- ip range = 192.168.3.128-192.168.3.254 //分配给客户端的IP池
- local ip = 201.1.2.10 //VPN服务器的IP地址
- [root@client ~]# vim /etc/ppp/options.xl2tpd //认证配置
- require-mschap-v2 //添加一行,强制要求认证
- #crtscts //注释或删除该行
- #lock //注释或删除该行
- root@client ~]# vim /etc/ppp/chap-secrets //修改密码文件
- jacob * 123456 * //账户名称 服务器标记 密码 客户端IP
- [root@client ~]# systemctl start xl2tpd //启动服务
- [root@client ~]# netstat -ntulp |grep xl2tpd
- udp 0 0 0.0.0.0:1701 0.0.0.0:* 3580/xl2tpd
- [root@client ~]# echo "1" > /proc/sys/net/ipv4/ip_forward //设置路由转发,防火墙,仅实验修改
- [root@client ~]# firewall-cmd --set-default-zone=trusted
- [root@client ~]# iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 201.1.2.10 //翻墙设置
3.客户机配置
启动一台Windows虚拟机,将虚拟机网卡桥接到public2,配置IP地址为201.1.2.20。
新建网络连接(参考案例2),输入VPN服务器账户与密码(参考PPTP VPN)。
设置VPN连接的属性,预共享密钥是IPSec配置文件中填写的randpass,往前的配置在PPTP VPN中已经展示过了,我们现在只需要修改一下欲共享秘钥即可,以VPN服务器中的配置为主
设置Windows注册表(不修改注册表,连接VPN默认会报789错误),具体操作如下:
- 单击"开始",单击"运行",键入"regedit",然后单击"确定"
- 找到下面的注册表子项,然后单击它:
- HKEY_LOCAL_MACHINE\ System\CurrentControlSet\Services\Rasman\Parameters
- 在"编辑"菜单上,单击"新建"->"DWORD值"
- 在"名称"框中,键入"ProhibitIpSec"
- 在"数值数据"框中,键入"1",然后单击"确定"
- 退出注册表编辑器,然后重新启动计算机