Centos 7 搭建 VPN 服务器

近日把公司的数据库启用了白名单,只添加了一些必要的服务器IP进去,由于公司的破网络不是固定IP,所以不好添加白名单,所以想到用VPN来解决,特此记录一下VPN服务器的部署。

1、先看看你的主机是否支持pptp,返回结果为yes就表示通过

modprobe ppp-compress-18 && echo yes

2、是否开启了TUN,有的虚拟机主机需要开启,返回结果为 cat: /dev/net/tun: File descriptor in bad state。就表示通过

cat /dev/net/tun

3、安装ppp , pptpd 和 iptables

yum -y install ppp pptpd iptables iptables-service

4、配置localip

vi /etc/pptpd.conf    #找到localip,去掉开始的那个#符号
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245
#这些是默认的,一般不需要去修改,分配给客户端的ip就是234到238之间,你也可以往大了写,看你的客户端有多少。

5、配置options.pptpd

vi /etc/ppp/options.pptpd      #在末尾添加dns
ms-dns  223.5.5.5
ms-dns  114.114.114.114

6、配置连接VPN客户端要用到的帐号密码

vi /etc/ppp/chap-secrets   
#   client为帐号,server是pptpd服务,secret是密码,*表示是分配任意的ip
# Secrets for authentication using CHAP
# client        server     secret                  IP addresses
  zlfzy         pptpd      9527                    *

7、修改内核设置,使其支持转发

vi /etc/sysctl.conf
net.ipv4.ip_forward=1    #如果原来是0,就改成1,如果没有就添加
#net.ipv4.tcp_syncookies=1        #注释这条
保存退出
sysctl -p使其生效

8、添加iptables转发规则

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -jMASQUERADE
#eth1是阿里云ECS的外网网卡,根据自身实际情况修改
如果原来开启了iptables端口限制,还需要放开如下端口
iptables -I INPUT -p tcp --dport 1723 -j ACCEPT
iptables -I INPUT -p tcp --dport 47 -j ACCEPT
iptables -I INPUT -p gre -j ACCEPT

9、重启pptpd和iptables

systemctl restart iptables
systemctl restart pptpd

这个时候一般情况下VPN已经可以连接,但是有可能网速很慢,甚至有些网页打不开有些网页打得开

解决方法

在pptp所在的linux服务的iptables的*filter表中加入(/etc/sysconfig/iptables)
-I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356
或者在命令提示符运行
iptables -I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356
改完之后执行:systemctl reload iptables

原因分析
拨通vpn,在服务器上用netstat –i查看接口,得到

Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 102528561 0 0 0 194391413 0 0 0 BRU
eth1 1500 0 519820535 954 11553 924 208798037 0 0 0 BRU
lo 16436 0 151062 0 0 0 151062 0 0 0 LRU

ppp0 1396 0 19 0 0 0 8 0 0 0 OPRU

可知ppp的最大mtu为1396,当然,对应的mss应为(mtu-20字节的IP头部+20字节的TCP 头部=)1356

1、计算机网络中的MSS:
MSS: Maximum Segment Size 最大分段大小
MSS最大传输大小的缩写,是TCP协议里面的一个概念。

MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

2、mtu是网络传输最大报文包。
mss是网络传输数据最大值。
mss加包头数据就等于mtu.
简单说拿TCP包做例子。
报文传输1400字节的数据的话,那么mss就是1400,再加上20字节IP包头,20字节tcp包头,那么mtu就是1400+20+20.

当然传输的时候其他的协议还要加些包头在前面,总之mtu就是总的最后发出去的报文大小。mss就是你需要发出去的数据大小。

假设PC建立了到SERVER的HTTP连接,PC希望从SERVER下载一个大的网页。SERVER接收到PC的请求后开始发送大网页文件,其IP的DF位置1,不允许分片,IP报文长度为1500字节。到达VPN网关2的外网口(以太)后,VPN网关2发现其长度超过了1500个字节,于是将其丢弃,并给SERVER发回一个目的地址不可达的ICMP信息,同时指出“MTU of next hop: 1500”。PC接收到该消息后,又按照1500字节对外发送,又被丢弃,于是就形成了循环,无法通讯。

根据上述的分析,很容易得到如下解决方式,在VPN网关2的出接口设置MTU为1500-4-20=1476,这样VPN网关2返回ICMP不可达消息时将给出”MTU of next hop: 1476”。SERVER将以1476作为自己的最大MTU对外发送,到达VPN网关1,封装GRE和外层IP头后就不会超过1500而顺利发到对端。

-I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356

因为mss是在TCP连接建立开始时,通过带有syn标志的IP数据包进行传输的,所以我们在iptables里面规定,在转发数据时,只要发现产生于ppt*的带有 syn标志数据包时,将其mss设定为1356字节,这样就与ppp0接口的路径MTU向匹配了,数据自然就可以畅通无阻啦。

(注,vpn拨入一个,则建立一个ppt*的虚拟设备,这个可以再linux上用ifcpnfig看到,第一个为ppp1,第二个为ppp2……)

3、在iptables里面加入一条规则:

iptables -A FORWARD -p tcp --syn -s 10.87.200.0/31 -j TCPMSS --set-mss 1356

因为mss是在TCP连接建立开始时,通过带有syn标志的IP数据包进行传输的,所以我们在iptables里面规定,在转发数据时,只要发现带有 syn标志并且源地址为主机B的IP数据包时,将其mss设定为1356字节,这样就与ppp0接口的路径MTU向匹配了,数据自然就可以畅通无阻啦。

因为mss是在TCP连接建立开始时,通过带有syn标志的IP数据包进行传输的,所以我们在iptables里面规定,在转发数据时,只要发现带有 syn标志并且源地址为主机B的IP数据包时,将其mss设定为1356字节,这样就与ppp0接口的路径MTU向匹配了,数据自然就可以畅通无阻啦。

添加新评论