在阿里云/腾讯云上使用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 | |
随后创建对应文件夹存放执行脚本与客户认证凭据:
1 | |
将运行docker容器的指令写进shell脚本,注意将映射的路径改为自己本机绝对/相对路径。
1 | |
接着再创建用户登录凭据,每行代表了一个用户,*代表的配置内容用不上(详细可以参考官方docker image页面)。如下指令创建了一个用户名为testuser密码为testpasswd的用户。
1 | |
随后增加执行权限并运行:
1 | |
此时查看端口占用情况,可以看到本机1723端口已经占用,说明pptpd已经配置成功。
1 | |
配置iptable
完成pptpd的配置,这时候可以在客户端上尝试连接了。在win11上,在设置内找到网络,在其内找到VPN选项:

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

添加完成后点击连接。之前的步骤没出错的话正常来说可以连接成功,但会发现客户端没有任何网络连接,网页打不开,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 | |
完成之后再尝试连接就会发现可以正常上网了,我们可以在vps上使用ifconfig指令查看各个客户端对应的隧道子网ip地址,用于监控其是否正常运行。每个正常连接的客户端都会作为一个单独的interface显示在vps上。如下的输出展示了一个隧道子网ip为10.99.99.100的客户端。
1 | |