一、写作目的
现有一台搬瓦工的VPS,需要在上面搭建PPTP服务器,本以为很简单的事结果弄了大半天,踩了不少坑。大部分的过程来自于参考链接,结合自己遇到的一些问题,纠正了部分细节,本文仅作为一种补充!
二、环境说明
由于服务器是朋友的,笔者也不知道版本,这里通过uname给出内核,应该是Centos 7.x
1 | [root@45 ~]# uname -a |
三、环境检查
- 检查是否支持PPTP
执行命令:理想输出:1
$ modprobe ppp-compress-18 && echo success
尝试纠正:1
success
1
$ yum install kernel-devel
- 检查是否开启Tun/TAP
执行命令:理想输出:1
$ cat /dev/net/tun
1
$ cat: /dev/net/tun: File descriptor in bad state
- 检查是否开启PPP:
执行命令:理想输出:1
$ cat /dev/ppp
注: 以上环境检查均应符合理想输出1
$ cat: /dev/ppp: No such device or address
四、安装步骤
安装epel仓库,否则安装pptpd的时候会显示包不存在
1
$ yum install epel-release
安装必要软件包
1
$ yum install ppp pptpd net-tools iptables-services -y
配置pptpd.conf
1
$ vim /etc/pptpd.conf
内容如下:
1
2
3
4option /etc/ppp/options.pptpd
logwtmp
localip 192.168.100.1
remoteip 192.168.100.2-101其中localip和remoteip原始文档提供了模板,可以参考。以上配置文件意思是建立V**(平台限制,不能写全)网络后,服务器地址为
192.168.100.1
,客户端地址为192.168.100.2 ~ 192.168.100.101
。默认最大客户端连接数为100。因此这里remoteip个数不应该小于100个(超出100时会自动截取前面100个ip,并给出warning)配置options.pptpd
1
$ vim /etc/ppp/options.pptpd
内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 8.8.8.8
ms-dns 8.8.4.4
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd其中ms-dns为使用的DNS服务器,如果你的VPS在国外,推荐使用谷歌的DNS:
8.8.8.8、8.8.4.4
;如果你的VPS在国内,推荐使用阿里、百度的DNS:119.29.29.29、223.5.5.5
配置登录账户密码chap-secrets
1
$ vim /etc/ppp/chap-secrets
内容如下:
1
2username1 pptpd 123456 *
username2 pptpd 123456 *中间的占位符尽量用空格,
username1、username2
即为登录时的用户名,密码为123456
。pptpd
为固定内容,最后的*
表示分配的IP地址为任意地址开启IP转发
1
2$ echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
$ sysctl -p # 使生效输出:
1
2
3
4
5
6
7
8
9
10net.ipv4.neigh.default.base_reachable_time_ms = 600000
net.ipv4.neigh.default.mcast_solicit = 20
net.ipv4.neigh.default.retrans_time_ms = 250
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_fastopen = 3
net.ipv4.ip_forward = 1这里要关注最后一行是否确实为1!
配置防火墙
一般的VPS网络环境相对复杂,这里需要考虑三个位置的网络问题:1
2
3系统内的Firewall
系统内 iptables(数据包过滤及转发规则)
云提供商的上层防火墙(例如阿里云)Firewall: 笔者这里采用直接关闭的方案:
1
2$ systemctl stop firewalld
$ systemctl disable firewalld无法执行
systemctl
命令,显示权限不足的解决方案:1
2
3
4切换到root用户
# root用户仍然无法执行,则执行下面的命令
$ kill -TERM 1iptables:
1
$ vim /etc/sysconfig/iptables
设置内容:
1
2
3
4
5
6
7
8
9# 在*filter 的部分加入以下内容:
-A INPUT -p gre -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1723 -j ACCEPT
-A FORWARD -s 192.168.100.0/24 -j ACCEPT
-A FORWARD -p tcp --syn -s 192.168.100.0/255.255.255.0 -j TCPMSS --set-mss 1356
# 在*nat 的部分加入以下内容:
-A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.100.0/255.255.255.0 -o eth0 -j SNAT --to-source 45.62.121.97其中的
192.168.100.0/24
应该相应修改为之前设置的网段,1723
端口为pptp默认端口;eth0
为系统能上网的网卡,可通过ifconfig
查看,读者应该根据自身环境调整。继续执行:
下面的eth0注意同步修改
1
2
3
4
5
6$ iptables -F
$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 设置开机自动执行
$ echo "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE" >> /etc/rc.d/rc.local
$ chmod +x /etc/rc.d/rc.local重启iptables服务,并设置开机自启动
1
2$ systemctl restart iptables
$ chkconfig iptables on检查一下是否成功:(
Active: active
即为成功)1
2
3
4
5
6
7
8
9
10
11
12$ systemctl status iptables
# 输出
● iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2021-08-25 01:52:52 EDT; 3h 6min ago
Main PID: 2541 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 2886)
Memory: 0B
CGroup: /system.slice/iptables.service
Aug 25 01:52:52 45.62.121.97.16clouds.com systemd[1]: iptables.service: Succeeded.云提供商的上层防火墙:
读者应考虑允许1723端口数据,并允许GRE协议!由于笔者用的搬瓦工服务 器,这个位置无需设置,因此仅供读者参考。
此处问题比较多,保险起见笔者给出我现在机器上的完整信息,供读者参考:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36$ cat /etc/sysconfig/iptables
# 输出如下:
# Generated by iptables-save v1.8.4 on Tue Aug 24 22:37:56 2021
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 28891 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 11195 -j ACCEPT
-A INPUT -p icmp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p gre -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1723 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -s 192.168.100.0/24 -j ACCEPT
-A FORWARD -p tcp --syn -s 192.168.100.0/255.255.255.0 -j TCPMSS --set-mss 1356
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Tue Aug 24 22:37:56 2021
# Generated by iptables-save v1.8.4 on Tue Aug 24 22:37:56 2021
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.100.0/255.255.255.0 -o eth0 -j SNAT --to-source 45.62.121.97
COMMIT
# Completed on Tue Aug 24 22:37:56 20211
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27$ ifconfig
# 输出如下:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 45.62.121.97 netmask 255.255.255.0 broadcast 45.62.121.255
inet6 fe80::a8aa:ff:fe0b:ddc8 prefixlen 64 scopeid 0x20<link>
ether aa:aa:00:0b:dd:c8 txqueuelen 1000 (Ethernet)
RX packets 104843 bytes 26239896 (25.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 107204 bytes 27871267 (26.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether ba:aa:00:0b:dd:c8 txqueuelen 1000 (Ethernet)
RX packets 85460 bytes 29048440 (27.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2520 bytes 416880 (407.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 使用pptpd服务
启动服务:设置自启动:1
$ systemctl restart pptpd
检查是否正常启动:1
$ chkconfig pptpd on
查看出错信息:(启动失败时可参考)1
$ systemctl status pptpd # 判断方式同上判断iptables服务
至此,PPTP服务器搭建完毕1
$ journalctl | grep 'pptpd'
五、测试是否搭建好
两台客户端通过PPTP协议连接到VPS即可,连接信息如下:
1
2
3
4
5
6
7
8
9
10
11服务器地址: <你的VPS公网地址>
协议:PPTP
端口:默认(1723)
# 账户1
用户名:username1
密码:123456
# 账户2
用户名:username2
密码:123456客户端(windows为例)通过PPTP连接到服务器后,
ipconfig -a
可以看到一个PPTP的虚拟网卡,分配ip地址为192.168.100.{2~101}
检查是否能进行以下操作:
1
2客户端、VPS三台设备之间,任意两台可以通过虚拟IP相互访问(ping不通有可能是smtp协议被禁用)
客户端可以通过VPS上网(如果VPS是国外的,理论上可以上谷歌,服务器有被封掉的危险)六、若干问题的参考解决方案
这一章节笔者写出一些经验,供读者参考。
启动pptpd时,显示地址占用
比较简单的方法,直接重启VPS.
客户端基于PPTP连接时,一直在访问ip,未进行到验证用户密码
可能是服务器防火墙问题,考虑暂时关闭 firewalld、iptables,以及云提供商控制台处,是否合理设置防火墙
1 | $ systemctl stop firewalld |
客户端基于PPTP连接时,验证用户密码,紧接着远程端口被关闭。服务器端
journalctl | grep 'pptpd'
显示gre
错误a. 确认服务器云提供商防火墙已设置允许GRE协议
b. 检查iptables中,是否设置了 < -A INPUT -p gre -j ACCEPT>
c. 考虑客户端上游网络防火墙以及GRE支持(最简单的办法就是手机开热点测试,笔者这里被公司的网坑了一个多小时)客户端可以连接上服务器,多个客户端之间可以通过虚拟IP相互访问,但是无法访问外网。
考虑iptables的nat转发有问题,考虑执行以下命令
1
2
3
4
5
6
7
8
9
10# 下面的eth0要同步修改,通过ifconfig查看
$ iptables -F
$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 下面两行为设置开机自动执行
$ echo "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE" >> /etc/rc.d/rc.local
$ chmod +x /etc/rc.d/rc.local
# 重启iptables服务
$ systemctl restart iptables在VPS端通过
ifconfig
找不到PPTP相关的虚拟网卡,笔者这里网卡名为ppp0
只需要找个客户端基于PPTP连接一下服务器,这个网卡信息就会出现了,而且笔者发现destination会显示为这个客户端被分配的ip,例如笔者这里是<192.168.100.2>,这是正常的
VPS上
ifconfig
显示PPTP虚拟网卡下一跳为192.168.100.{2~101}
是正常的吗?是正常现象,不用更改,可通过”$ route -n”查看路由表,对应行显示为“UH”。下面给出笔者这里的,供读者参考。
1 | [root@45 ~]# ifconfig |