引言
在企业网络和远程办公场景中,经常需要将多台分布在异地的服务器或办公网络连接起来,实现内网级别的互访。虽然 WireGuard、OpenVPN 等现代 VPN 方案层出不穷,但 PPTP(Point-to-Point Tunneling Protocol) 凭借其轻量、配置简单、客户端广泛支持(Windows/macOS/Linux/iOS/Android 均原生支持)的特点,在特定场景下仍然是最快捷的内网互通方案。
适用场景:多台云服务器组建私有网络、远程办公接入公司内网、跨地域机房互联。PPTP 不适用于对加密强度要求极高的场景(如金融数据传输),但对于一般的内部资源访问完全够用。
本文将手把手教你如何在 CentOS/RHEL/Debian/Ubuntu 等主流 Linux 发行版上安装配置 pptpd,搭建自己的 VPN 服务器,并通过路由配置实现异地内网的互联互通。
一、环境准备
1.1 拓扑说明
假设我们有以下网络拓扑:
| 节点 | IP 地址 | 角色 |
|---|---|---|
| VPN 服务器(阿里云/腾讯云) | 公网: 47.x.x.x,内网: 10.0.0.1/24 | PPTP 服务端 |
| 分支机构 A 服务器(CentOS) | 192.168.1.0/24 | PPTP 客户端 1 |
| 分支机构 B 服务器(Ubuntu) | 172.16.0.0/24 | PPTP 客户端 2 |
我们的目标是:分支 A 和分支 B 的机器通过 VPN 隧道连接到服务器后,不仅能访问 VPN 服务器的内网,还能通过服务器做路由转发,实现分支 A 与分支 B 之间的互访。
1.2 系统要求
# 检查系统版本
cat /etc/os-release
uname -r
# 检查是否支持 TUN/TAP(PPTP 需要)
ls -l /dev/net/tun
# 如果存在 /dev/net/tun 则说明内核已支持
二、安装 pptpd
2.1 CentOS/RHEL 7/8/9
# 安装 EPEL 源和 pptpd
yum install -y epel-release
yum install -y pptpd
# 查看安装后的版本
pptpd --version 2>&1 || rpm -qa | grep pptpd
2.2 Debian/Ubuntu
# Ubuntu 18.04+ / Debian 10+
apt update
apt install -y pptpd
# 查看包信息
dpkg -l | grep pptpd
安装完成后,主要配置文件及路径:
| 文件 | 作用 |
|---|---|
/etc/pptpd.conf |
pptpd 主配置(IP 池、监听地址) |
/etc/ppp/pptpd-options |
PPP 连接选项(DNS、MTU、加密) |
/etc/ppp/chap-secrets |
VPN 用户认证信息(用户名+密码) |
/etc/sysctl.conf |
用于开启 IP 转发 |
三、配置 PPTP 服务端
3.1 主配置:pptpd.conf
编辑 /etc/pptpd.conf,主要配置 VPN 客户端的 IP 地址池和服务器本地的 VPN IP:
vim /etc/pptpd.conf
在文件末尾添加或修改以下内容:
# 监听所有网络接口
option /etc/ppp/pptpd-options
localip 10.0.0.1
remoteip 10.0.0.100-200
参数说明:
– localip:VPN 服务器在虚拟接口上的 IP 地址,客户端会将这个地址视为网关
– remoteip:分配给 VPN 客户端的 IP 地址池范围,最多支持 100 个客户端同时连接
3.2 PPP 选项配置:pptpd-options
编辑 /etc/ppp/pptpd-options:
vim /etc/ppp/pptpd-options
典型配置如下:
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 8.8.8.8
ms-dns 114.114.114.114
proxyarp
lock
nobsdcomp
novj
novjccomp
nopcomp
accomp
mtu 1400
mru 1400
lcp-echo-interval 30
lcp-echo-failure 4
关键说明:
– require-mschap-v2 和 require-mppe-128:启用 MS-CHAP v2 认证和 128 位 MPPE 加密,这是 PPTP 的基本安全保证
– ms-dns:分配给客户端的 DNS 服务器地址,可设置多个
– mtu 1400:PPTP 封装会增加包头,降低 MTU 避免分片问题
– lcp-echo-interval / failure:30 秒心跳探测,连续 4 次(120 秒)无响应则认为断线
3.3 用户认证:chap-secrets
编辑 /etc/ppp/chap-secrets:
vim /etc/ppp/chap-secrets
文件格式为每行一条记录:
# Secrets for authentication using CHAP
# client server secret IP addresses
vpn_user pptpd MySecurePass123 *
branch_a pptpd BranchAPass456 10.0.0.101
branch_b pptpd BranchBPass789 10.0.0.102
字段说明:
– client:登录用户名
– server:服务名,必须与 pptpd-options 中 name 字段一致
– secret:明文密码(PPTP 的加密在传输层,这里无法使用哈希)
– IP addresses:* 表示自动分配,也可以指定固定 IP(如给分支机构分配固定地址便于路由)
安全提示:
chap-secrets文件权限必须严格限制:chmod 600 /etc/ppp/chap-secrets。
3.4 开启 IP 转发
这是实现内网互通的核心步骤:
# 临时生效
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
验证 IP 转发是否生效:
sysctl net.ipv4.ip_forward
# 输出应为:net.ipv4.ip_forward = 1
四、防火墙与 NAT 配置
4.1 iptables 配置(推荐)
开启 iptables NAT 转发,允许 VPN 客户端的流量通过服务器访问外网或互通:
# 1. 放行 PPTP 控制连接(GRE 协议 + TCP 1723 端口)
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
# 2. VPN 客户端之间互通(关键)
iptables -A FORWARD -s 10.0.0.0/24 -d 10.0.0.0/24 -j ACCEPT
# 3. 允许 VPN 客户端访问服务器所在内网(如 192.168.1.0/24)
iptables -A FORWARD -s 10.0.0.0/24 -d 192.168.1.0/24 -j ACCEPT
# 4. NAT 伪装(允许 VPN 客户端通过服务器上网)
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
# 5. 放行转发流量(默认 FORWARD 规则通常是 DROP,需先放行已建立的连接)
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT
4.2 firewalld(CentOS 7/8)
如果使用 firewalld:
# 添加 PPTP 服务
firewall-cmd --permanent --add-service=pptpd
firewall-cmd --permanent --add-port=1723/tcp
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
# 开启 masquerade(NAT)
firewall-cmd --permanent --add-masquerade
# 重新加载
firewall-cmd --reload
4.3 保存 iptables 规则
# CentOS/RHEL
service iptables save
# 通用方法(安装 iptables-persistent)
apt install -y iptables-persistent # Debian/Ubuntu
netfilter-persistent save
五、启动与验证服务端
5.1 启动服务
systemctl enable pptpd
systemctl start pptpd
systemctl status pptpd
查看日志确认服务运行正常:
# 查看 pptpd 日志
journalctl -u pptpd -f
# 或查看 PPP 日志
tail -f /var/log/messages # CentOS
tail -f /var/log/syslog # Debian/Ubuntu
5.2 检查监听端口
# PPTP 使用 TCP 1723
ss -tlnp | grep 1723
# GRE 协议(47)不是端口,用 tcpdump 验证
tcpdump -i any port 1723 -c 10
正常情况下应看到 pptpd 在 0.0.0.0:1723 上监听。
六、配置 PPTP 客户端
6.1 Linux 客户端配置(CentOS/Ubuntu)
安装 PPTP 客户端:
# CentOS
yum install -y pptp pptp-setup network-manager-pptp
# Ubuntu/Debian
apt install -y pptp-linux network-manager-pptp
配置连接(以 branch-a 用户为例):
# 方式一:使用 pptpsetup(推荐)
pptpsetup --create vpn-to-server
--server 47.x.x.x
--username branch_a
--password BranchAPass456
--encrypt
--start
# 查看连接状态
ip addr show ppp0
手动配置 /etc/ppp/peers/vpn-to-server(如果 pptpsetup 不可用):
pty "pptp 47.x.x.x --nolaunchpppd"
name branch_a
password BranchAPass456
remotename pptpd
require-mppe-128
require-mschap-v2
refuse-eap
refuse-pap
refuse-chap
noauth
persist
maxfail 0
defaultroute
usepeerdns
mtu 1400
mru 1400
启动连接:
pon vpn-to-server
# 断开
poff vpn-to-server
6.2 Windows 客户端配置
- 设置 → 网络和 Internet → VPN → 添加 VPN 连接

- VPN 提供商:
Windows(内置) - 连接名称:
Linux-VPN-Server - 服务器地址:
47.x.x.x - VPN 类型:
点对点隧道协议(PPTP) - 登录信息类型:
用户名和密码 - 输入
vpn_user和密码 → 保存
- ipv4的网络要取消【在远程网络上使用默认网关】,否则本地网络会断网

注意:Windows 10/11 默认禁用了 PPTP,需要手动启用:
– 控制面板 → 程序和功能 → 启用或关闭 Windows 功能
– 勾选「远程访问自动连接管理器」和「路由和远程访问」
6.3 macOS 客户端配置
- 系统设置 → 网络 → 添加 VPN 接口
- 接口类型:
VPN - VPN 类型:
PPTP - 服务名称:
Linux-VPN - 服务器地址:
47.x.x.x - 用户名:
vpn_user - 认证设置 → 密码:输入密码
- 连接
注意:macOS High Sierra (10.13) 之后移除了内置 PPTP 支持,需要使用第三方客户端如 Shimo 或手动启用。如果在较旧版本上,直接使用内置客户端即可。
七、实现内网互联互通
这是本文的核心目标。当多个分支同时连接到 VPN 服务器后,它们各自在虚拟网段 10.0.0.0/24 内拥有独立的 IP。默认情况下,分支 A 和分支 B 只能与服务器通信,但不能互访。 需要配置路由来实现互通。
7.1 方案一:通过 VPN 服务器做路由转发(推荐)
在 VPN 服务端添加 iptables 规则,允许 10.0.0.0/24 网段内的流量互相转发:
# 允许分支 A 访问分支 B
iptables -A FORWARD -s 10.0.0.101 -d 10.0.0.102 -j ACCEPT
iptables -A FORWARD -s 10.0.0.102 -d 10.0.0.101 -j ACCEPT
# 如果要所有分支都能互通(更通用的规则)
iptables -A FORWARD -s 10.0.0.0/24 -d 10.0.0.0/24 -j ACCEPT
此时分支 A 和分支 B 已经能通过对方的 VPN IP 互相 ping 通:
# 在分支 A 上 ping 分支 B
ping 10.0.0.102
7.2 方案二:启用客户端路由,实现真实内网互访
如果你的需求不仅是 VPN IP 互通,而是要让分支 A 的 192.168.1.0/24 能直接访问分支 B 的 172.16.0.0/24,需要在服务端和客户端都添加路由。
在服务端添加内网路由转发规则:
# 允许分支 A 的原始内网流量通过 VPN 访问分支 B 的内网
iptables -A FORWARD -s 192.168.1.0/24 -d 172.16.0.0/24 -j ACCEPT
iptables -A FORWARD -s 172.16.0.0/24 -d 192.168.1.0/24 -j ACCEPT
# 添加 SNAT/DNAT 规则将流量正确路由
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o ppp+ -j MASQUERADE
在分支 A 上添加回程路由:
# 分支 A(192.168.1.0/24):通过 VPN 网关 10.0.0.1 访问分支 B 的内网
ip route add 172.16.0.0/24 via 10.0.0.1 dev ppp0
# 永久化(CentOS)
echo '172.16.0.0/24 via 10.0.0.1 dev ppp0' >> /etc/sysconfig/network-scripts/route-ppp0
# 永久化(Ubuntu,写入 /etc/network/interfaces 或 netplan)
在分支 B 上添加回程路由:
# 分支 B(172.16.0.0/24):通过 VPN 网关 10.0.0.1 访问分支 A 的内网
ip route add 192.168.1.0/24 via 10.0.0.1 dev ppp0
7.3 路由自动化(使用 etcd/脚本)
手动添加路由在重启后会丢失,推荐编写一个连接后自动执行的脚本:
cat > /etc/ppp/ip-up.d/add-routes.sh << 'SCRIPT'
#!/bin/bash
# PPTP 连接建立后自动添加路由
# 参数: $1=接口名 $2=tty设备 $3=速度 $4=本地IP $5=对端IP $6=ipparam
if [ "$1" = "ppp0" ]; then
# 分支 A -> 分支 B
ip route add 172.16.0.0/24 via "$5" dev "$1"
# 分支 A -> 其他内网段
ip route add 10.0.0.0/24 via "$5" dev "$1"
fi
SCRIPT
chmod +x /etc/ppp/ip-up.d/add-routes.sh
八、高级配置与优化
8.1 连接数限制与稳定性
为了防止单个用户占用过多连接,可以限制每个用户的最大连接数:
# 在 pptpd.conf 中限制最大连接
connections 50
# 在 chap-secrets 中限制单个用户的并发连接
# 使用 pppd 插件
8.2 断线自动重连
在客户端 /etc/ppp/peers/vpn-to-server 中添加:
persist # 自动重连
holdoff 10 # 断开后 10 秒重试
maxfail 0 # 永不停止重试
8.3 日志与故障排查
# 服务端日志
journalctl -u pptpd -n 50 --no-pager
tail -f /var/log/syslog | grep pppd
# 客户端日志
tail -f /var/log/syslog | grep pptp
tail -f /var/log/messages | grep ppp
# 使用 tcpdump 抓包分析 GRE 协议
tcpdump -i eth0 gre -vv
tcpdump -i eth0 port 1723 -X
九、常见问题
Q1:客户端连接提示 “Error 619: Cannot connect to the VPN server”
原因:GRE 协议(协议号 47)被防火墙拦截。
解决:
# 确保 GRE 放行
iptables -A INPUT -p gre -j ACCEPT
# 如果使用云服务商,还需要在安全组/网络 ACL 中放行 GRE(部分云不支持 GRE)
Q2:连接成功但无法访问互联网
原因:NAT 规则缺失。
解决:
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
sysctl -w net.ipv4.ip_forward=1
Q3:Ping 丢包或延迟高
原因:MTU 过大导致 GRE 封装后分片。
解决:在 pptpd-options 中降低 MTU:
mtu 1400
mru 1400
客户端也需要同步配置 MTU:
ifconfig ppp0 mtu 1400
Q4:Windows 10/11 无法连接 PPTP
原因:微软默认禁用了 PPTP 协议(视为不安全)。
解决:注册表方式启用:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRasManParameters
AllowPPTPForInbound = 1 (DWORD)
或直接使用第三方客户端。
Q5:VPN 已连接,但分支间的内网互访不通
排查步骤:
1. 在服务端验证 IP 转发:sysctl net.ipv4.ip_forward
2. 检查 FORWARD 链规则:iptables -L FORWARD -v
3. 检查 NAT 规则:iptables -t nat -L POSTROUTING -v
4. 在分支 A 上 traceroute 到分支 B 的 VPN IP
5. 确认两端都有正确回程路由
十、总结
本文详细介绍了在 Linux 上搭建 PPTP VPN 服务器的完整流程:
- ✅ 安装 pptpd 并配置 IP 池、DNS、认证
- ✅ 配置防火墙放行 PPTP 和 GRE 协议
- ✅ 配置 NAT 转发让客户端能够上网
- ✅ 多客户端/多分支的内网路由互通配置
- ✅ 断线自动重连、MTU 调优等生产环境必备优化
PPTP 虽然加密强度不如 WireGuard 或 OpenVPN,但其极简配置、零依赖、客户端自带的特性使其在快速组建内部网络、临时互访场景中仍然是最快上手的方案。对于不需要高强度加密的普通内部资源访问,PPTP 完全够用。
如果要搭建更安全的生产级 VPN,推荐在本文基础上进一步结合 iptables + 白名单限制,或迁移到 WireGuard(性能更好、加密更强、配置也相当简洁,将在后续文章中介绍)。


















暂无评论内容