Linux 下安装配置 pptpd 搭建 VPN 服务器,组建局域网实现内网互连互通

引言

在企业网络和远程办公场景中,经常需要将多台分布在异地的服务器或办公网络连接起来,实现内网级别的互访。虽然 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-v2require-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-optionsname 字段一致
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 客户端配置

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

注意:Windows 10/11 默认禁用了 PPTP,需要手动启用:
– 控制面板 → 程序和功能 → 启用或关闭 Windows 功能
– 勾选「远程访问自动连接管理器」和「路由和远程访问」

6.3 macOS 客户端配置

  1. 系统设置 → 网络 → 添加 VPN 接口
  2. 接口类型:VPN
  3. VPN 类型:PPTP
  4. 服务名称:Linux-VPN
  5. 服务器地址:47.x.x.x
  6. 用户名:vpn_user
  7. 认证设置 → 密码:输入密码
  8. 连接

注意: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(性能更好、加密更强、配置也相当简洁,将在后续文章中介绍)。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容