美文网首页网络基础
Ubuntu16.04下在服务器上部署PPTP类型的VPN

Ubuntu16.04下在服务器上部署PPTP类型的VPN

作者: qgpmztmf | 来源:发表于2017-08-04 21:57 被阅读7817次

    实验室新购置了服务器,为了在实验室局域网之外访问服务器,需要在服务器上部署VPN。我选择了客户端设置比较简单的PPTP类型的VPN。而在服务器端,则使用了pptpd完成了VPN基本框架的部署,使用iptables完成IP的转发。本科专业是网络工程的我,除了配置家里的路由器,终于做了件和网络配置有点关系的事情了: ) 以下为详细的配置步骤。

    1. 部署准备

    先要弄清楚服务器所在网络的架构。实验室通过路由器将真实网段上的一个ip映射到虚拟的网段的很多ip之上,而后实验室的其他设备通过连接这些虚拟ip连接到外部网络,要使用的服务器也在这个网段之内。

    假设路由器连接的wan口端的真实ip122.0.0.22,路由器lan口的虚拟网段的网关为192.168.0.1,我要部署的服务器的虚拟ip192.168.0.2。所以在服务器上部署VPN的话,要让VPN请求连接的数据包可以通过路由器,并且传达到服务器之上。所以要做的准备工作就是:

    • 登陆路由器的管理界面,在防火墙设置中,设置VPN穿透,如果要连接的服务器之前有多级路由或交换机,那么所有前置设备都要设置VPN穿透

    • 登陆路由器的管理界面,在虚拟服务器设置中,将流入路由器而没有下一步目的地的数据包重定向到DMZ主机,这里我将DMZ主机设置为服务器,所以将服务器ip地址填入即可。之后从外网通过VPN传入的数据包会流入服务器。

    DMZ服务器设置
    这样准备工作就做完了,下面开始正式在服务器上配置VPN

    2. 部署pptp步骤

    1. 我们要使用PPTP协议,首先验证服务器是否支持MPPE模块,在服务器终端输入

       modprobe ppp-compress-18 && echo MPPE is ok
      

      若显示MPPE is ok,则说明服务器的linux内核支持MPPE模块,否则请升级linux内核到2.6.15以上版本,或者给内核打上MPPE的补丁,相应具体详细配置请点击,这里不再赘述。

    2. 安装pptpd插件,ubuntu下使用下面指令安装,其他linux指令不再赘述

      sudo apt-get install pptpd
      
    3. 编辑配置文件pptpd.conf,添加建立VPN虚拟网络时的主机ip(网关)和这个虚拟主机分配给其他设备的虚拟ip 段。注意这个VPN虚拟ip主机和我们的服务器的ip没有关系,可以任意设置。而且最好避免和服务器所在网段内的其他设备ip冲突。输入下面指令,打开配置文件,编辑器使用vim的话替换参数即可。

      sudo emacs /etc/pptpd.conf
      

      在文件最后添加下面两行

      localip  192.168.2.1
      remote 192.168.2.10-99
      

      这里我将参数localip也就是VPN虚拟网络的主机(网关)设置成了192.168.2.1,而我们要配置的服务器所在的网段的主机(网关),也就是实验室的路由器的ip192.168.0.1,这样可以避免将来在外网登陆VPN时,VPN虚拟主机分配的ip与实验室内网的ip冲突。而参数rempteip表示VPN最多接受90个外网链接。

    4. 编辑配置文件pptpd-options,设置这个VPN虚拟网络的DNS,输入下面,指令打开配置文件

      sudo emacs /etc/ppp/pptpd-options
      

      修改以下部分,这里使用googleDNS

      ms-dns 8.8.8.8
      ms-dns 8.8.4.4
      

      这里也可以填上,服务器主机所在网络使用的DNS地址。

    5. 编辑配置文件chap-secrets,设置这个VPN的登陆账号和密码,输入下面指令打开配置文件

      sudo emacs /etc/ppp/chap-secrets
      

      添加一行,依次为:用户名,服务,密码,限制ip

      user pptpd 123 *
      

      *表示ip无限制。

    6. 输入下面指令以重启服务

      sudo /etc/init.d/pptpd restart
      

    3. 部署IP转发步骤

    1. 配置sysctl.conf文件,输入下面命令打开配置文件

      sudo emacs /etc/sysctl.conf
      

      去掉下面一行的注释,允许服务器ip路由的转发,否则服务器将不能转发接收到的外网的VPN请求数据包。

      net.ipv4.ip_forward=1
      

      输入下面指令,使得配置马上生效

      sudo sysctl -p
      
    2. 输入下面的指令,安装iptables,如果你还没有安装的话:

      sudo apt-get install iptables
      
    3. 输入下面的指令,开启gre协议,并打开服务器47,1723号端口。使用VPN需要开启gre协议,而gre协议需要使用服务器的471723号端口。

      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 
      
    4. 输入下面指令,开启一个NAT转发

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

      注意,上面指令中ip要填写部署pptp步骤中第3步中设置的localip,也就是虚拟vpn的主机的ip,上面设置的是192.168.2.1192.168.2.1/24192.168.2.1-255等价。POSTROUTING参数表示,指定当数据包离开服务器的时候,对数据包进行处理。eno1表示当前服务器的网卡,这里不同机器可能不一样,可以通过ifconfig指令进行查询,之后修改成对应的设备名称即可。MASQUERADE这个参数的意思就是即将从服务器封包出去(-o)的那块网卡上的IP,由于实验室的服务器是固定ip,所以这里修改成192.168.0.2也是可以的。

      通过上面的指令,iptables做了这样一件事情:将所有从服务器上传出的源地址为192.168.2.1-255之中的ip数据包的源ip改成服务器的ip
      很好理解,如果不做这个操作,服务器通过VPN传回的数据包将不包含服务器自己的源ip,所以远程访问主机的回复ip包会丢失。

    5. 如果不小心手残,敲错了参数,或者是想重新设置,那么请输入如下指令,可以清空iptables转发规则

      sudo iptables -F
      sudo iptables -X
      sudo iptables -t nat -F
      sudo iptables -t nat -X
      
    6. 在终端中输入以下指令重启服务,使我们的配置生效

      sudo service pptpd restart
      

    至此服务器端的配置全部完成,在客户端配置相应的pptp设置即可连接。

    4. 客户端配置

    本人使用macbook,在MACOS系统下远程登陆VPN,步骤如下

    1. 打开网络偏好设置,之后添加pptp类型的VPN连接,之后如下图,服务器地址位置填入路由器WAN口的外网IP地址账户名称位置填入在部署pptp步骤第5步中设置的VPN账户名称

      设置
    2. 之后点击鉴定设置,在密码位置输入之前设置的VPN密码

      设置
    3. 之后点击高级,点击通过VPN连接发送所有流量,否则连接VPN后可能会无法连接网络。

      设置
    4. 设置完成后,点击连接即可登录到架设好的VPN之上。windowsLinux下的客户端配置不再赘述,过程大同小异。

    5. 无法访问外网问题的解决方案

    参照上述设置后可能后无法访问vpn之外的网络资源,原因是不同的vpn客户端会对本地路由表(远程登录的客户端上的路由表)做不同的配置。现对Ubuntu下无法连接的情况作出分析,WindowsMACOS无法连接外网的原因大同小异。以下设置均在局域网之外的待连接vpn的客户端上完成

    连接vpn后,发现无法上网,在命令行下输入route -n,查看本地路由表情况。

    本地路由表情况
    ppp0vpn网络生成的虚拟网卡,eth0为本地客户端的网卡,0.0.0.0表示所有网址,10.112.0.1为本地客户端的网关,10.112.0.0-10.112.255.255为本地客户端所在的网段,红色覆盖部分为远程服务器在外网的真实ip192.168.2.1vpn生成的虚拟网络的网关。

    我们发现第一条ppp0的路由可能会出问题,这条路由的意思,是将通向所有网关的全部数据包都交到vpn网络的虚拟网卡ppp0来处理,如果服务器上没有做好相关包转发设置的话,就会出现无法访问外网的情况。

    所以我们重新设置路由,使得路由表满足以下两点:

    • 当需要访问外网时,使用eth0网卡来路由
    • 当需要访问vpn资源时,使用ppp0网卡来路由
    1. 命令行下运行如下指令删除可能出现问题的路由:
      route del -net 0.0.0.0 netmask 0.0.0.0 ppp0 
      
    2. 运行如下指令,添加路由:
      route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.112.0.1 eth0
      

    使得路由表满足第一点,“当需要访问外网时,使用eth0网卡来路由”,因为通过本地客户端网关10.112.0.1的数据包都是请求访问外网的数据包,我们将这些数据包交给本地网卡eth0来处理即可。

    eth0 路由
    1. 运行如下指令,添加路由:
      sudo route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.2.1 ppp0 
      

    使得路由表满足第二点,“当需要访问vpn资源时,使用ppp0网卡来路由”,目标192.168.1.0和子网掩码255.255.255.0指定了我们要访问的vpn网络的局域网网段,192.168.2.1vpn的虚拟网关,通过虚拟网关的数据包都是请求访问vpn内网的数据包,我们将这些数据包交给ppp0虚拟网卡来处理即可。

    ppp0 路由
    设置过后,就可以根据不同的路由来同时访问外网和vpn资源,WindowsMACOS下可以参照这个思路修改一下路由表,具体指令不再赘述。

    6. 无法访问局域网中其他主机的解决方案

    以上的解决方案只能在外网访问到局域网中一台服务器,然而局域网中,可能不止有一台服务器,当存在多台服务器时,在其他服务器上设置相应的路由即可解决问题,以下为详细设置方法。

    假设局域网内有两台服务器,分别为A服务器和B服务器,现在在A服务器上已经设置了vpn网络,这时,正常登录vpn后是无法连接B服务器的。

    1. 首先在B服务器上配置sysctl.conf文件,输入下面命令打开配置文件
      sudo emacs /etc/sysctl.conf
      
      去掉下面一行的注释,允许B服务器ip路由的转发,否则B服务器将不能接收到的由A服务器转发而来的VPN请求数据包。
      net.ipv4.ip_forward=1
      
      输入下面指令,使得配置马上生效
      sudo sysctl -p
      
    2. 添加向A服务器回传的数据包的路由,输入以下指令
      sudo route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.0.2
      
      上述路由的192.168.2.0255.255.255.0为设置的vpn虚拟网段,虚拟网段中的地址分配给了通过外网连接到vpn的客户端,而192.168.0.2为架设vpn服务的服务器(A服务器)在局域网内的ip。通过上面的路由,B服务器可以通过A服务器将收到的vpn请求回复给外网上的客户端。

    在局域网中其他有需要远程vpn访问的服务器都进行上述设置,即可实现对局域网中多台主机的远程访问。


    至此,VPN网络搭建完毕,希望可以给想要在Ubuntu下部署PPTP类型VPN的同学一些帮助。


    相关文章

      网友评论

        本文标题:Ubuntu16.04下在服务器上部署PPTP类型的VPN

        本文链接:https://www.haomeiwen.com/subject/xthvlxtx.html