1. 简介
本文介绍在CentOS与Ubuntu操作系统如何搭建PPTP VPN服务。包括PPTP的安装、配置,以及相应的iptables/firewalld/ufw规则。之所以选择PPTP VPN,是考虑到客户端连接起来会比较方便。Linux Desktop、Windows还有Android这些终端原生都自带PPTP的客户端。
2. PPTP的配置主要有下面五个步骤
- 验证内核是否加载了MPPE模块
- 安装所需的软件包
- 配置PPP和PPTP的配置文件
- 打开内核的IP转发功能
- 启动pptpd守护进程
- 配置iptables防火墙放行和转发规则
下面的所有配置操作都需要root权限,如无特别说明,所有命令都在root的家目录下执行。
Step1: 验证内核是否加载了MPPE模块
由于Ubuntu默认权限设置限制(默认情况下禁用了root账户),所以本文中的命令,都需要额外添加sudo以获取root权限。
比如
[root@zcwyou ~]# vi /etc/ppp/options.pptpd
应该在命令之前添加sudo
[root@zcwyou ~]# sudo vi /etc/ppp/options.pptpd
本文在CentOS系统直接使用root帐户。
内核的MPPE模块用于支持Microsoft Point-to-Point Encryption。Windows自带的VPN客户端就是使用这种加密方式,主流的Linux Desktop也都有MPPE支持。其实到了我们这个内核版本,默认就已经加载了MPPE,只需要使用下面命令验证一下,显示”MPPE ok”即可:
[root@zcwyou ~]# modprobe ppp-compress-18 && echo MPPE is ok
获取你的系统版本号,本文内容基于CentOS/Ubuntu系统而编写:
如果只需要虚拟机上练习,请查看我的视频教程:如何安装CentOS/Ubuntu系统:
如果是公网的,直接在阿里云或者腾讯云上购买云主机和操作系统即可。
CentOS系统执行以下查看指令查看系统版本
[root@zcwyou ~]# cat /etc/centos-release
输出如下:
如果是CentOS6,则有以下类似的结果:
CentOS release 6.10 (Final)
如果是CentOS7,则有以下类似的结果:
CentOS Linux release 7.6.1810 (Core)
确认自己是用哪个版本号,下面的教程有区分CentOS6和CentOS7的,请根据你的系统执行对应的指令。
Ubuntu系统执行以下命令查看系统版本:
oucanrong@zcwyou:~$ cat /etc/issue
输出结果可以看到当前Ubuntu的版本
Ubuntu 18.04.1 LTS \n \l
Step2: CentOS系统安装额外epel仓库
CentOS6:
[root@zcwyou ~]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm
CentOS7:
[root@zcwyou ~]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
或者使用以下方式,适用于CentOS 6 和CentOS 7:
[root@zcwyou ~]# yum -y install epel-release.noarch
以下提示安装成功:
Ubuntu不需要安装额外的软件库
Step3: 安装所需的软件包
CentOS安装pptpd:
[root@zcwyou ~]# yum install ppp pptpd -y
看到如下图示即代表安装成功:
Ubuntu安装pptpd:
sudo apt install pptpd -y
PPTP使用PPP协议对用户数据进行封装,然后将PPP数据帧封装在IP数据报里,经由IP网络传播。因此首先需要支持PPP协议,我们使用的完整版CentOS已经自带了ppp这个软件包,如果你安装的是Minial CentOS之类的精简系统,则可能需要自行安装ppp,因为系统yum可以解决软件包的依赖关系,我们直接安装我们最终目的的软件包即可。
Step4: 配置PPP和PPTP的配置文件
2.4.1修改 /etc/ppp/options.pptpd ,这个文件需要配置的不多,我们只需指定dns服务器即可。
[root@zcwyou ~]# vi /etc/ppp/options.pptpd
如果服务器在国内,使用阿里DNS:
ms-dns 223.5.5.5
ms-dns 223.6.6.6
如果服务器在中国大陆以外,使用Google公共DNS服务:
ms-dns 8.8.8.8
ms-dns 8.8.4.4
2.4.2修改 /etc/pptpd.conf
[root@zcwyou ~]# vi /etc/pptpd.conf
确保有以下内容
option /etc/ppp/options.pptpd
logwtmp
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245
部分参数解释:
option /etc/ppp/options.pptpd指定使用/etc/ppp/options.pptpd中的配置,默认已经开启
logwtmp表示使用WTMP日志,默认已经开启
localip把前面的#删除。这是拨入vpn后的网关,localip会在pptpd服务器的ppp0网卡产生
remoteip把前面的#删除。这是vpn服务器分配给客户端的地址池,remoteip在客户端拨入后产生配置在ppp0接口中
2.4.3修改 /etc/ppp/chap-secrets ,存储着用户账户的文件,这个文件非常简单,其中用明文存储VPN客户的用户名、服务名称、密码和IP地址范围,每行一个账户:
[root@zcwyou ~]# vi /etc/ppp/chap-secrets
username1 pptpd passwd1 *
username2 pptpd passwd2 *
其中第一第三列分别是用户名和密码;第二列应该和上面的文件/etc/ppp/options.pptpd中name后指定的服务名称一致;最后一列限制客户端IP地址,星号表示没有限制。
2.4.4设置MTU大小
[root@zcwyou ~]# vi /etc/ppp/ip-up
在文件倒数第二行,即exit 0上一行添加如下内容
[root@zcwyou ~]# ifconfig ppp0 mtu 1492
2.4.5修改内核文件,支持ipv4路由转发
CentOS6:
[root@zcwyou ~]# vi /etc/sysctl.conf
将
net.ipv4.ip_forward=0
改成
net.ipv4.ip_forward=1
马上生效
[root@zcwyou ~]# sysctl -p
CentOS7:
[root@zcwyou ~]# vi /etc/sysctl.conf
在文件最后一行添加以下内容
net.ipv4.ip_forward=1
马上生效
[root@zcwyou ~]# sysctl -p
Ubuntu
sudo vi /etc/sysctl.conf
在文件最后一行添加以下内容
net.ipv4.ip_forward=1
马上生效
sudo sysctl -p
sudo /etc/init.d/procps restart
Step5:配置防火墙
2.5.1允许PPTP与GRE流量进入,并且做NAT
CentOS7 firewalld的配置
[root@zcwyou ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
[root@zcwyou ~]# firewall-cmd --permanent --zone=public --add-port=1723/tcp
[root@zcwyou ~]# firewall-cmd --permanent --zone=public --add-masquerade
CentOS6 iptables的配置
[root@zcwyou ~]# iptables -A INPUT -p gre -j ACCEPT
[root@zcwyou ~]# iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
[root@zcwyou ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
Ubuntu 设置ufw防火墙放行TCP 1723端口
sudo ufw allow 1723/tcp
2.5.2调整TCP MSS值,为转发TCP流量作优化
CentOS6 iptables的配置
[root@zcwyou ~]# iptables -A FORWARD -p tcp --syn -s 192.168.0.0/24 -j TCPMSS --set-mss 1356
[root@zcwyou ~]# iptables -t mangle -I POSTROUTING -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
[root@zcwyou ~]# iptables -t mangle -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Ubuntu iptable配置:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 你的服务器的公网IP地址
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o 服务器的公网接口比如[eth0] -j MASQUERADE
保存重启防火墙
[root@zcwyou ~]# service iptables save
[root@zcwyou ~]# service iptables reload
CentOS7 firewalld的配置
[root@zcwyou ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter POSTROUTING 0 -p tcp -i gre+ -j TCPMSS --syn --set-mss 1356
[root@zcwyou ~]# firewall-cmd --permanent --direct --add-rule ipv4 mangle FORWARD 0 -p tcp -i gre+ -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
重新加载配置
[root@zcwyou ~]# firewall-cmd --reload
3. 启动pptpd守护进程
CentOS6启动pptpd服务并且设置开机自启:
[root@zcwyou ~]# service pptpd start
[root@zcwyou ~]# chkconfig pptpd --level 345 on
CentOS 7启动pptpd服务并且设置开机自启:
[root@zcwyou ~]# systemctl start pptpd.service
[root@zcwyou ~]# systemctl enable pptpd.service
Ubuntu启动pptpd服务并且设置开机自启:
sudo systemctl start pptpd.service
sudo systemctl enable pptpd.service
4. 使用另一台CentOS作为Client端拔号:
当然,你可以使用Windows系统作测试,跳过这一步。
4.1安装客户端所需
[root@zcwyou ~]# yum install -y ppp pptp pptp-setup net-tools
4.2拔号测试,用户名username1,密码passwd1
[root@zcwyou ~]# pptpsetup --create myvpn --server pptp_server --username username1 --password passwd1 --encrypt -start
4.3在客户端上检查
[root@zcwyou ~]# ifconfig
看看有没有ppp0接口
如果有ppp0,ping对端私网IP
[root@zcwyou ~]# ping 192.168.0.1
如果通了,就证明能拔号了,用Windows自带的拔号程序试试
5、排错
如何开启pptpd默认日志记录功能。
修改/etc/ppp/options.pptpd中的nologfd,默认没有开,把nologfd注释掉,然后添加 logfile /var/log/pptpd.log(将nologfd改成这个,在这个日志里就可以查到pptpd日志)
修改后重启下pptpd服务,就可以了
CentOS 6系统重新启动pptpd服务:
[root@zcwyou ~]# service pptpd restart
CentOS 7系统重新启动pptpd服务:
[root@zcwyou ~]# systemctl restart pptpd.service
Ubuntu系统重新启动pptpd服务:
sudo systemctl restart pptpd.service
查看PPTP服务的日志
[root@zcwyou ~]# cat /var/log/pptpd.log
评论前必须登录!
注册