实验室新购置了服务器,为了在实验室局域网之外访问服务器,需要在服务器上部署
VPN
。我选择了客户端设置比较简单的PPTP
类型的VPN
。而在服务器端,则使用了pptpd
完成了VPN
基本框架的部署,使用iptables
完成IP
的转发。本科专业是网络工程的我,除了配置家里的路由器,终于做了件和网络配置有点关系的事情了: ) 以下为详细的配置步骤。
1. 部署准备
先要弄清楚服务器所在网络的架构。实验室通过路由器将真实网段上的一个ip
映射到虚拟的网段的很多ip
之上,而后实验室的其他设备通过连接这些虚拟ip
连接到外部网络,要使用的服务器也在这个网段之内。
假设路由器连接的wan
口端的真实ip
为122.0.0.22
,路由器lan
口的虚拟网段的网关为192.168.0.1
,我要部署的服务器的虚拟ip
为192.168.0.2
。所以在服务器上部署VPN
的话,要让VPN
请求连接的数据包可以通过路由器,并且传达到服务器之上。所以要做的准备工作就是:
-
登陆路由器的管理界面,在防火墙设置中,设置
VPN穿透
,如果要连接的服务器之前有多级路由或交换机,那么所有前置设备都要设置VPN穿透
。 -
登陆路由器的管理界面,在
虚拟服务器
设置中,将流入路由器而没有下一步目的地的数据包重定向到DMZ
主机,这里我将DMZ
主机设置为服务器,所以将服务器ip
地址填入即可。之后从外网通过VPN
传入的数据包会流入服务器。
这样准备工作就做完了,下面开始正式在服务器上配置
VPN
。
2. 部署pptp步骤
-
我们要使用
PPTP
协议,首先验证服务器是否支持MPPE
模块,在服务器终端输入modprobe ppp-compress-18 && echo MPPE is ok
若显示
MPPE is ok
,则说明服务器的linux
内核支持MPPE
模块,否则请升级linux
内核到2.6.15
以上版本,或者给内核打上MPPE
的补丁,相应具体详细配置请点击,这里不再赘述。 -
安装
pptpd
插件,ubuntu
下使用下面指令安装,其他linux
指令不再赘述sudo apt-get install pptpd
-
编辑配置文件
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
,而我们要配置的服务器所在的网段的主机(网关),也就是实验室的路由器的ip
为192.168.0.1
,这样可以避免将来在外网登陆VPN
时,VPN
虚拟主机分配的ip
与实验室内网的ip
冲突。而参数rempteip
表示VPN
最多接受90
个外网链接。 -
编辑配置文件
pptpd-options
,设置这个VPN
虚拟网络的DNS
,输入下面,指令打开配置文件sudo emacs /etc/ppp/pptpd-options
修改以下部分,这里使用
google
的DNS
ms-dns 8.8.8.8 ms-dns 8.8.4.4
这里也可以填上,服务器主机所在网络使用的
DNS
地址。 -
编辑配置文件
chap-secrets
,设置这个VPN
的登陆账号和密码,输入下面指令打开配置文件sudo emacs /etc/ppp/chap-secrets
添加一行,依次为:用户名,服务,密码,限制
ip
:user pptpd 123 *
*
表示ip
无限制。 -
输入下面指令以重启服务
sudo /etc/init.d/pptpd restart
3. 部署IP转发步骤
-
配置
sysctl.conf
文件,输入下面命令打开配置文件sudo emacs /etc/sysctl.conf
去掉下面一行的注释,允许服务器
ip
路由的转发,否则服务器将不能转发接收到的外网的VPN
请求数据包。net.ipv4.ip_forward=1
输入下面指令,使得配置马上生效
sudo sysctl -p
-
输入下面的指令,安装
iptables
,如果你还没有安装的话:sudo apt-get install iptables
-
输入下面的指令,开启
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
-
输入下面指令,开启一个
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.1
,192.168.2.1/24
和192.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
包会丢失。 -
如果不小心手残,敲错了参数,或者是想重新设置,那么请输入如下指令,可以清空
iptables
转发规则sudo iptables -F sudo iptables -X sudo iptables -t nat -F sudo iptables -t nat -X
-
在终端中输入以下指令重启服务,使我们的配置生效
sudo service pptpd restart
至此服务器端的配置全部完成,在客户端配置相应的pptp
设置即可连接。
4. 客户端配置
本人使用
macbook
,在MACOS
系统下远程登陆VPN
,步骤如下
-
打开网络偏好设置,之后添加
设置pptp
类型的VPN
连接,之后如下图,服务器地址
位置填入路由器WAN口的外网IP地址
,账户名称
位置填入在部署pptp步骤第5步中设置的VPN账户名称
。
-
之后点击鉴定设置,在
设置密码
位置输入之前设置的VPN密码
-
之后点击高级,点击
设置通过VPN连接发送所有流量
,否则连接VPN
后可能会无法连接网络。
-
设置完成后,点击连接即可登录到架设好的
VPN
之上。windows
和Linux
下的客户端配置不再赘述,过程大同小异。
5. 无法访问外网问题的解决方案
参照上述设置后可能后无法访问
vpn
之外的网络资源,原因是不同的vpn
客户端会对本地路由表(远程登录的客户端上的路由表)做不同的配置。现对Ubuntu
下无法连接的情况作出分析,Windows
和MACOS
无法连接外网的原因大同小异。以下设置均在局域网之外的待连接vpn
的客户端上完成
连接vpn
后,发现无法上网,在命令行下输入route -n
,查看本地路由表情况。
ppp0
为vpn
网络生成的虚拟网卡,eth0
为本地客户端的网卡,0.0.0.0
表示所有网址,10.112.0.1
为本地客户端的网关,10.112.0.0-10.112.255.255
为本地客户端所在的网段,红色覆盖部分为远程服务器在外网的真实ip
,192.168.2.1
为vpn
生成的虚拟网络的网关。
我们发现第一条ppp0
的路由可能会出问题,这条路由的意思,是将通向所有网关的全部数据包都交到vpn
网络的虚拟网卡ppp0
来处理,如果服务器上没有做好相关包转发设置的话,就会出现无法访问外网的情况。
所以我们重新设置路由,使得路由表满足以下两点:
- 当需要访问外网时,使用
eth0
网卡来路由 - 当需要访问
vpn
资源时,使用ppp0
网卡来路由
- 命令行下运行如下指令删除可能出现问题的路由:
route del -net 0.0.0.0 netmask 0.0.0.0 ppp0
- 运行如下指令,添加路由:
route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.112.0.1 eth0
使得路由表满足第一点,“当需要访问外网时,使用eth0
网卡来路由”,因为通过本地客户端网关10.112.0.1
的数据包都是请求访问外网的数据包,我们将这些数据包交给本地网卡eth0
来处理即可。
- 运行如下指令,添加路由:
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.1
为vpn
的虚拟网关,通过虚拟网关的数据包都是请求访问vpn
内网的数据包,我们将这些数据包交给ppp0
虚拟网卡来处理即可。
设置过后,就可以根据不同的路由来同时访问外网和
vpn
资源,Windows
和MACOS
下可以参照这个思路修改一下路由表,具体指令不再赘述。
6. 无法访问局域网中其他主机的解决方案
以上的解决方案只能在外网访问到局域网中一台服务器,然而局域网中,可能不止有一台服务器,当存在多台服务器时,在其他服务器上设置相应的路由即可解决问题,以下为详细设置方法。
假设局域网内有两台服务器,分别为A
服务器和B
服务器,现在在A
服务器上已经设置了vpn
网络,这时,正常登录vpn
后是无法连接B
服务器的。
- 首先在
B
服务器上配置sysctl.conf文件,输入下面命令打开配置文件
去掉下面一行的注释,允许sudo emacs /etc/sysctl.conf
B
服务器ip
路由的转发,否则B
服务器将不能接收到的由A
服务器转发而来的VPN
请求数据包。
输入下面指令,使得配置马上生效net.ipv4.ip_forward=1
sudo sysctl -p
- 添加向
A
服务器回传的数据包的路由,输入以下指令
上述路由的sudo route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.0.2
192.168.2.0
与255.255.255.0
为设置的vpn
虚拟网段,虚拟网段中的地址分配给了通过外网连接到vpn
的客户端,而192.168.0.2
为架设vpn
服务的服务器(A
服务器)在局域网内的ip
。通过上面的路由,B
服务器可以通过A
服务器将收到的vpn
请求回复给外网上的客户端。
在局域网中其他有需要远程vpn
访问的服务器都进行上述设置,即可实现对局域网中多台主机的远程访问。
至此,VPN网络搭建完毕,希望可以给想要在Ubuntu下部署PPTP类型VPN的同学一些帮助。
网友评论