计算机网络:VPN详解以及VPN服务器搭建

1. 前言

最近在研究VPN服务器搭建以及VPN的一些基础知识。VPN在我们今后的工作中一定会广泛应用,因为它能解决我们大部分条件不能访问集群中内网中的问题。比如,我们可以访问集群中的一台机器(因为那台机器有外网IP,但是集群中的其他机器没有外网IP)。所以我们要访问集群中的其他机器,我们可以通过搭建VPN服务器,通过VPN虚拟网络访问集群中的内网机器。

2 VPN简介

VPN(全称Virtual Private Network)虚拟专有网络,是依靠ISP和其他的NSP,在公网中建立专用的数据通信网络的技术,可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两个节点之间的连接并没有传统的专用网络所需要的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专有网络有同样的功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用了公共Internet网络实现。

2.1 VPN分类

根据常见的企业营业,我们可以将其分为4类:

  • 远程访问VPN服务(个人出差)
  • 企业内部网络之间VPN服务(总部与分公司之间)
  • 互联网公司多IDC机房之间VPN服务
  • 企业外部VPN服务

3. 隧道协议

隧道技术的实质是用一种网络层的协议来传输另一种网络层协议,其基本功能是封装和加密,主要利用网络隧道来实现。

对于构建VPN来说,隧道技术是一个关键技术。它用来在IP公网中仿真一条点到点的通路,实现两个节点间(VPN网关之间,或VPN网关与VPN远程能过户之间)的安全通信,使数据包在公共网络上的专用隧道内传输。

隧道的基本组成包括:隧道启动结点;隧道终结结点;IP网等路由的分组网络。

隧道的启动和终止结点可由许多网络设备和软件来实现。例如:ISP接入服务器、企业网防火墙,或者其他支持VPN的设备主机等。这里统称为VPN结点,其功能还可能包括:防火墙和地址转换、数据加密、身份鉴别和授权的功能。

3.1 PPTP

点对点隧道协议(PPTP)是由包括微软和3Com公司等组成的PPTP论坛开放的一种点对点隧道协议,基于拨号使用的PPP协议,使用PAP或CHAP之类的加密算法,或者使用Microsoft的点对点加密算法MMPE。其通过跨越基于TCP/IP的数据网络创建VPN实现了从远程客户端到专用企业服务器之间数据的安全传输。PPTP支持通过公共网络(例如Internet)建立按需的、多协议的、虚拟专用网络。PPTP允许加密IP通讯,然后再要跨域公司的IP或者公共IP(Internet)发送的IP中对其进行封装。典型的Linux平台的开源软件为pptp。

PPTP协议假定在PPTP客户机和PPTP服务器之间有连通并且可用的IP网络。因此如果PPTP客户机本身已经是IP网络的组成部分,那么即可通过该 IP网络与PPTP服务器取得连接;

在这里插入图片描述

3.2 L2TP

L2TP协议提供了对PPP链路层数据包的通道(Tunnel)传输支持,允许二层链路端点和PPP会话点驻留在不同设备上并且采用包交换网络技术进行信 息交互,从而扩展了PPP模型。L2TP协议结合了L2F协议和PPTP协议的各自优点,成为IETF有关二层隧道协议的工业标准。PPTP和L2TP都是使用PPP协议对数据进行封装,然后添加包头用于数据在互联网上传输。PPTP只能在两个端点之间建立单一隧道。L2TP支持在两个端点之间使用多隧道,用于可以针对不同的服务质量创建不同的隧道。L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP或PPTP与IPSEC共同使用的时候,可以由IPSEC提供隧道验证,不需要在第二层协议上验证隧道使用L2TP。PPTP要求互联网络为IP网络。

在这里插入图片描述

3.3 IPSec

IP安全协议(IPSec:IP Security)实际上是一套协议包而不是独立的协议。从1995年开始IPSec开始研究以来,IETF IPSec工作组在它的主页上发布了几十个Internet草案文案和12个RFC文件。IPSec隧道模式隧道是封装、路由与解封装的整个过程。隧道将原始数据包隐藏(或封装)在新的数据包内部。该新的数据包可能会有新的寻址或者路由信息,从而使得能够通过网络进行传输。隧道与数据保密性结合使用,在网络上窃听通讯的人将无法获取原始数据包数据(以及原始的源和目标)。封装的数据包到达目的地时,会删除封装,原始数据包头用于将数据包路由最终发送到目的地中。

在这里插入图片描述

3.4 SSL VPN

SSL VPN ,SSL协议提供了数据私密性、端点验证、信息完整等特性。SSL协议由许多子协议组成,其中最主要的子协议是握手协议和记录协议。握手协议允许服务器和客户端在应用协议传输第一个数据字节以前,彼此确认,协商一种加密算法和密码钥匙。在数据传输期间,记录协议利用握手协议生成的密钥加密和解密来交换数据。

SSL独立于应用,因此任何一个应用程序都可以享受它的安全性而不必理会执行细节。SSL置身于网络结构体系的传输层和应用层之间。此外,SLL本身就集合被所有的Web浏览器使用。这意味着客户端不需要为了支持SSL连接安装额外的软件。

典型的SSL VPN应用如Open VPN,是一个非常好的开源的软件。Open VPN允许参与建立VPN的单点使用预设的私钥,第三方证书,或者用户/密码来进行身份验证。它大量的使用了OpenSSL加密库,以及SSLv3、TLSv1协议。

4. VPN的原理

在这里插入图片描述

在vps上部署vpn server,客户端所有数据将经过虚拟网卡的加密封装后都转发给vps上的vpn server,由它来转发给目标服务器,这和ss server原理类似,由vpn协议加密从而绕过GFW实现访问墙外网站,下面将以pptp vpn协议为例说明。

在这里插入图片描述

  1. 假设要访问谷歌,那么客户端发出的数据包首先通过协议栈处理封装成IP包,其源地址是虚拟网卡的地址,例如:192.168.0.2,而目标地址是谷歌的IP。
  2. 原始IP包交给虚拟网卡发送时,PPTP网卡驱动会按PPP协议对这个IP包整体加密封装作为新的payload,用一层新的IP头封装这个payload发送出去,这个新IP头的目标地址是vpn server,源地址是客户端的外网IP。
  3. vpn server的协议栈会剥离掉新IP头,将内部PPP协议的payload交给pptpd进程处理,pptpd进程会按PPP协议解包得到原始的IP包,我们知道这个IP包的源地址是192.168.0.2,目标地址google。因此,pptpd进程需要做的是将这个IP包的源IP地址改为vps的地址,然后将IP包发给谷歌,从而和谷歌进行数据交换。、
  4. 最终,pptpd理所应当将谷歌的应答IP包的目标IP地址换成192.168.0.2(虚拟网卡地址),然后经过PPP协议封装并添加新的IP头后发回给客户端既可。

不过要注意在pptpd的实现里,这个源地址修改是通过iptables实现的,也就是添加通过iptables添加一个NAT规则,实现来源地址的映射转换,这个在你配置pptp的过程中就会看到

5. PPTP环境搭建

5.1 安装pptpd

Ubuntu 环境

第一步当然是安装这个软件包了。(下面所有的代码,如果需要修改的,我会特别标记出来的,其他都表示可以直接复制)

sudo apt-get install pptpd

Centos 环境

第一步当然是安装这个软件包了。(下面所有的代码,如果需要修改的,我会特别标记出来的,其他都表示可以直接复制)

sudo yum -y install pptpd

5.2 编辑pptpd.conf文件

(1)打开这个文件并进入编辑模式

vim /etc/pptpd.conf

vim是一个编辑软件,跟vi一样。假如没有安装它,直接把vim替换为 vi 也可以。

(2)取消注释,并修改ip(配置虚拟IP地址)

在这里插入图片描述

这一步的作用是配置VPN虚拟网络的主机ip(网关)和这个虚拟主机分配给其他设备的虚拟ip 段。

注意这个VPN虚拟ip主机和我们的服务器的ip没有关系,可以任意设置,ABC三类的内网地址都可以。而且最好避免和服务器所在网段内的其他设备ip冲突。比如说办公室的内网ip是192.168.1.1,我们在配置vpn虚拟网络时就不能配置这个网段的,不然可能会跟内网ip起冲突。

这个文件打开后呢,里面是有内容的,不过都是被注释掉的。

里面有两个参数:localip 和 remoteip 。

  # localip 192.168.2.1             ---(要填内网ip)表示分配给服务器的内部网关地址。
  # remoteip 192.168.2.2-255   ----当客户机通过pptp连接到vpn后所能拿到的ip地址范围,默认从第一个开始分配给客户

5.3 修改chap-secrets文件,添加可以登录的用户

vim /etc/ppp/chap-secrets

打开这个文件后,就可以编辑了。

# client server secret IP addresses    ---标题
    name  pptpd  123456     *               ---如果不指定ip,用*表示。如果要给每个账户分配一个固定的ip,就把ip写在后面。这里分配的ip就在上面设置的remoteip段内。

红色字根据自己喜好填写。分别是指用户名和密码。在登录vpn账号时要用到。

5.4 设置dns解析

vim /etc/ppp/pptpd-options

找到ms-dns ,取消掉注释,并修改dns地址(下面这是Google的dns,也可以填上服务器主机所在网络的dns地址。

ms-dns 8.8.8.8
ms-dns 8.8.4.4

5.5 开启转发

vim /etc/sysctl.conf

(1)取消注释以下内容(打开内核ip转发)

net.ipv4.ip_forward=1

(2)更新配置

sudo sysctl -p

(3)安装iptable

Ubuntu环境

apt-get install iptables

Centos 环境

yum -y install iptables

(4)开启gre协议
输入下面的指令,开启gre协议,并打开服务器47,1723号端口。

使用VPN需要开启gre协议,而gre协议需要使用服务器的47和1723号端口。

sudo iptables -A INPUT -p gre -j ACCEPT 
sudo iptables -A INPUT -p tcp --dport 1723 -j ACCEPT   
sudo iptables -A INPUT -p tcp --dport 47 -j ACCEPT

(5)开启NAT转发

sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eno1 -j MASQUERADE

注意

上面指令中ip要填写部署pptp步骤中第1.2步中设置的localip,也就是虚拟vpn的主机的ip,上面设置的是192.168.2.1,192.168.2.1/24和192.168.2.1-255等价。

eno1表示当前服务器的网卡,这里不同机器可能不一样,可以通过ifconfig指令进行查询,之后修改成对应的设备名称即可。
POSTROUTING参数表示,指定当数据包离开服务器的时候,对数据包进行处理。
MASQUERADE这个参数的意思就是即将从服务器封包出去(-o)的那块网卡上的IP,由于实验室的服务器是固定ip,所以这里修改成服务器的虚拟ip也是可以的。

通过上面的指令,iptables做了这样一件事情:将所有从服务器上传出的源地址为192.168.2.1-255之中的ip数据包的源ip改成服务器的ip。如果不做这个操作,服务器通过VPN传回的数据包将不包含服务器自己的源ip,所以远程访问主机的回复ip包会丢失。(这里就是我们在VPN原理中讲解的需要自己实现来源地址的映射转换)

5.6 重启服务

sudo iptables-save
service pptpd restart
service iptables restart

5.7 配置客户端,连vpn

在这里插入图片描述

在这里插入图片描述

6. 配置VPN中可能出现的常见问题

6.1 Windows主机连接VPN服务器后不能上网

在当前用户配置(个人VPN进该文件夹)%AppData%\Microsoft\Network\Connections\Pbk,找到 rasphone.pbk 文件

在这里插入图片描述

编辑当中 对应你vpn 链接的段落属性 IpPrioritizeRemote=0

取消 “从远程网络上使用默认网关”

以记事本形式打开,查找最上面开始的关键字,默认为1,改为0,保存即可。操作完毕后连接VPN,一切OK。注意,DNS修改,可以修改IpDnsAddress 的值来实现!还有其他配置要求的也能在VPN配置文件里面找到,修改参数大家自行查找一下。

6.2 无法连接内网机器

Windows修改“从远程网络上使用默认网关”,后出现无法连接内网机器。这个时候我们就需要为我们的Windows手动添加路由功能。

route add -p 单个目标地址 mask 255.255.255.255  Windows主机 vpn分配后的虚拟地址
route add -p 192.168.223.0/24 mask 255.255.255.255 192.168.0.234

第一个ip地址就是内网集群网络号(网段和子网掩码)。最后一个ip地址,就是你通过哪个网关路由。这里我们配置我们本机Windows分配之后的虚拟VPN IP地址。-p表示配置永久路由

猜你喜欢

转载自blog.csdn.net/qq_21125183/article/details/86606815