在阿里云/腾讯云上使用docker配置pptp VPNserver

需求

和同学联机打游戏有个vps可以方便很多,联机玩minecraft/饥荒/terraria/l4d/CS2什么的基本上都可以用frp内网穿透解决。但是前几天联机Stellaris的时候发现想配置一个群星dedicate server还是有些困难的,和饥荒类似这种游戏都是先走steam的联机api再连入主机,相当于steam帮忙做了一层内网穿透。不同于饥荒的是,饥荒还留了自己的端口允许客户端通过ip地址与端口号直连但群星没有。同学开了加速器也没用,该卡还是卡。

最后迫不得已决定在自己的vps挂一个全连接隧道vpn server,客户端可以连接到vpn让自己大部分的网络流量全都走隧道,包括游戏流量。 其实相当于大家都使用同一个节点的加速器加速某个游戏。只要所有联机用户主机与vps之间的延迟较低(取决于vps供应商的网络质量),就可以做到联机不卡顿。

既然只是游戏专用,也不需要考虑安全性、持久性。PPTP作为一个历史悠久的隧道协议,虽然安全性欠佳,但胜在配置方便并且win10/win11操作系统内置点对点协议栈支持pptp可以一键连接(不需要额外的客户端)。同时其服务端配置也很简单,使用docker image基本上可以一键配置,迁移起来也非常方便(用户认证资料仅存在一个文件内)。当然,如果对安全性与稳定性有考量,推荐还是使用更现代的vpn协议例如openVPN/WireGuard,这些开源的vpn协议也都有可用的docker image,但相对的其配置也更加复杂,用户也需要下载额外的客户端进行vpn连接。

在vps上配置pptpd

首先可以目测一下自己的vps能不能带得动pptpd,一般来说单核1G的配置肯定都没问题,主要还是带宽。因为客户端连上vpn后大部分本机流量都会走隧道,如果vps带宽太低是根本撑不住多个人连接的。个人建议带宽在6M以上,并且多人使用时需要关掉一些社交app(例如qq微信以及各种语音聊天软件)。满足配置后登陆至shell。目前我自己使用的是阿里云上的轻量化服务器,2核2G内存,带公网IP,峰值100M带宽,每年价格百元左右,很适合当个用户数量不多的vpn server。

使用的镜像为mobtitude/vpn-pptp。首先拉取镜像:

1
docker pull mobtitude/vpn-pptp

随后创建对应文件夹存放执行脚本与客户认证凭据:

1
2
3
mkdir pptpd-vpn && cd pptpd-vpn     # 创建总目录
touch chap-secrets # 创建认证凭据
touch run_pptpd.sh # 创建运行容器的脚本

将运行docker容器的指令写进shell脚本,注意将映射的路径改为自己本机绝对/相对路径。

1
2
3
$ vim run_pptpd.sh

docker run -d --name pptpd --net=host --privileged -v /path/to/vpn/chap-secrets:/etc/ppp/chap-secrets mobtitude/vpn-pptp

接着再创建用户登录凭据,每行代表了一个用户,*代表的配置内容用不上(详细可以参考官方docker image页面)。如下指令创建了一个用户名为testuser密码为testpasswd的用户。

1
2
3
4
5
6
$ vim chap-secrets

# 每行代表一个用户的登录凭据
# 格式如下
# username * password *
testuser * testpasswd *

随后增加执行权限并运行:

1
2
chmod +x run_pptpd.sh
./run_pptpd.sh

此时查看端口占用情况,可以看到本机1723端口已经占用,说明pptpd已经配置成功。

1
2
3
4
5
6
$ netstat -ntlp

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN 161832/pptpd

配置iptable

完成pptpd的配置,这时候可以在客户端上尝试连接了。在win11上,在设置内找到网络,在其内找到VPN选项:

win11设置内的网络界面

随后点击添加VPN选项,填入连接名(自己随便指定)、vps的ip地址、vpn类型(pptp)、之前预设好的用户名和密码:

win11添加新的VPN

添加完成后点击连接。之前的步骤没出错的话正常来说可以连接成功,但会发现客户端没有任何网络连接,网页打不开,QQ掉线。这是由于vps的网络接口并没有forward客户端的网络流量,我们需要配置一下vps上的iptable。

参考askubuntu上的讨论贴,以下指令允许iptable forward pptp客户端的网络流量。之前上面使用的docker image内默认配置好了pptp客户端的子网ip地址范围(10.99.99.0/24),因此我们下面的指令内的子网范围也填入10.99.99.0/24。这些指令的具体用途可以参考我另外一篇讲解iptables的博客。

1
2
3
4
5
6
7
8
9
10
11
iptables -I INPUT -p tcp --dport 1723 -m state --state NEW -j ACCEPT

iptables -I INPUT -p gre -j ACCEPT

iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -s 10.99.99.0/24 -j TCPMSS --clamp-mss-to-pmtu
sudo iptables-save

sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables-save

完成之后再尝试连接就会发现可以正常上网了,我们可以在vps上使用ifconfig指令查看各个客户端对应的隧道子网ip地址,用于监控其是否正常运行。每个正常连接的客户端都会作为一个单独的interface显示在vps上。如下的输出展示了一个隧道子网ip为10.99.99.100的客户端。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

$ ifconfig

...

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1396
inet 10.99.99.1 netmask 255.255.255.255 destination 10.99.99.100
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 11718 bytes 13601420 (13.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4096 bytes 731423 (731.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

...

在阿里云/腾讯云上使用docker配置pptp VPNserver
https://blog.bakeneko-kuro.com/2025/10/30/linux/install-pptpd-on-vps/
作者
迷途黑猫
发布于
2025年10月30日
许可协议