集群架构 - VPN虚拟专网服务

1. VPN应用场景

1.1 VPN概述

VPN (Virtual Private Network) 虚拟专用网络,是一种通过公共网络(如Internet)建立安全连接的技术。

1.2 VPN应用场景

  1. 远程办公: 员工通过VPN访问公司内网资源
  2. 分支机构互联: 多个分支机构通过VPN连接
  3. 安全访问: 安全访问内部服务器和资源
  4. 跨地域网络: 连接不同地域的网络
  5. 移动办公: 移动设备安全访问企业网络

1.3 VPN类型

VPN类型 说明 特点
PPTP 点对点隧道协议 配置简单,兼容性好
L2TP/IPSec 第二层隧道协议 安全性高
OpenVPN 开源VPN解决方案 功能强大,配置复杂
IPSec IP安全协议 企业级标准

1.4 VPN优势

  1. 安全性: 数据加密传输
  2. 灵活性: 随时随地访问
  3. 成本低: 利用公共网络
  4. 易管理: 集中管理用户和权限

2. VPN服务端配置

2.1 实验环境规划

环境说明:

  • VPN服务器: 192.168.56.11(公网IP)
  • 内网服务器: 100.100.1.50
  • VPN客户端网段: 172.16.56.100-200

2.2 环境准备

1
2
3
4
5
6
7
8
# 停止防火墙
[root@vpn-server ~]# systemctl stop firewalld
[root@vpn-server ~]# systemctl disable firewalld

# 关闭SELinux
[root@vpn-server ~]# setenforce 0
[root@vpn-server ~]# getenforce
Disabled

2.3 配置epel源, 安装pptp VPN相关软件

1
2
3
4
5
# 配置epel源
[root@vpn-server ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 安装pptp VPN相关软件
[root@vpn-server ~]# yum install ppp pptp pptpd -y

2.4 开启内核转发功能

1
2
3
4
5
6
# 开启内核转发功能
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

# 使配置生效
[root@vpn-server ~]# sysctl -p
net.ipv4.ip_forward = 1

2.5 配置客户端上网DNS

如客户端不需要分配DNS可不配置。

1
2
3
4
5
6
# 配置客户端DNS
[root@vpn-server ~]# vim /etc/ppp/options.pptpd

# 在第68行附近添加
ms-dns 223.5.5.5
ms-dns 8.8.8.8

2.6 设置VPN拨号的账号密码

1
2
3
4
5
6
# 设置VPN拨号的账号密码
[root@vpn-server ~]# vim /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client server secret IP addresses
bgx * 123456 *

chap-secrets格式说明:

1
2
3
# 格式: 用户名  服务器  密码  IP地址
# client server secret IP addresses
bgx * 123456 *

字段说明:

  • client: VPN用户名
  • server: 服务器名(*表示任意服务器)
  • secret: 密码
  • IP addresses: 分配的IP(*表示动态分配)

2.7 分配VPN拨号地址段

注意和内网相同地址。

1
2
3
4
5
6
7
8
# 分配VPN拨号地址段
[root@vpn-server ~]# vim /etc/pptpd.conf

# 添加本机公网IP(localip)
localip 192.168.56.11

# 分配VPN用户的内网网段(remoteip)
remoteip 172.16.56.100-200

配置说明:

  • localip: VPN服务器的IP地址
  • remoteip: 分配给VPN客户端的IP地址范围

2.8 启动pptpd服务并加入开机自启动

1
2
3
4
5
6
7
8
9
# 启动pptpd服务
[root@vpn-server ~]# systemctl start pptpd

# 加入开机自启动
[root@vpn-server ~]# systemctl enable pptpd

# 检查tcp1723端口是否开启
[root@vpn-server ~]# ss -lntup | grep 1723
tcp LISTEN 0 3 :1723 *:* users:(("pptpd",pid=3483,fd=6))

2.9 验证VPN服务

1
2
3
4
5
6
7
8
9
10
# 查看pptpd服务状态
systemctl status pptpd

# 查看端口监听
netstat -tunlp | grep 1723
# 或
ss -lntup | grep 1723

# 查看日志
tail -f /var/log/messages

3. Win客户端配置

3.1 连接说明

如果直接使用客户端连接内网地址是无法连接成功的,必须通过VPN服务器连接。

3.2 Windows客户端配置步骤

步骤1: 打开网络共享中心

  1. 打开”控制面板” → “网络和共享中心”
  2. 点击”设置新的连接或网络”

步骤2: 选择连接到工作区域

选择”连接到工作区域”

步骤3: 使用Internet连接到VPN服务

选择”使用我的Internet连接(VPN)”

步骤4: 填写VPN地址以及名称

  • Internet地址: 填写VPN服务器IP(如:192.168.56.11)
  • 目标名称: 填写VPN连接名称(如:公司VPN)
  • 点击”下一步”

步骤5: 填写用户名以及密码

填写在VPN-Server上配置好的用户名以及密码, 然后点击连接。

  • 用户名: bgx
  • 密码: 123456

步骤6: VPN连接成功

连接成功后,会显示”已连接”状态。

步骤7: 测试连接

测试是否能够连接100.100.1.50这台内网服务器。

1
2
# 在命令提示符中测试
ping 100.100.1.50

3.3 配置VPN连接属性

默认连接VPN是会通过VPN的默认网关来进行上网,我们取消默认使用VPN连接上网功能即可。

配置方法:

  1. 右键VPN连接 → “属性”
  2. 选择”网络”选项卡
  3. 选择”Internet协议版本4(TCP/IPv4)” → “属性”
  4. 点击”高级”
  5. 取消勾选”在远程网络上使用默认网关”

4. Linux客户端配置

4.1 安装软件包

1
2
# 以CentOS7.4为客户端,安装软件包
yum install -y ppp pptp pptp-setup

4.2 客户端连接VPN服务端

运行 pptpsetup --create test --server IP --username 用户名 --password 密码 --encrypt --start 连接 VPN 服务端。

您需要填写实际配置 VPN 服务端的 IP 地址、用户名和密码。

1
2
3
4
5
6
7
[root@vpn-client-rhel ~]# pptpsetup --create test --server 192.168.56.11 --username bgx --password 123456 --encrypt --start
Using interface ppp0
Connect: ppp0 <--> /dev/pts/3
CHAP authentication succeeded
MPPE 128-bit stateless compression enabled
local IP address 172.16.56.102
remote IP address 192.168.56.11

命令参数说明:

  • --create test: 创建名为test的VPN连接
  • --server 192.168.56.11: VPN服务器地址
  • --username bgx: VPN用户名
  • --password 123456: VPN密码
  • --encrypt: 启用加密
  • --start: 创建后立即启动

4.3 检查分配地址段

1
2
3
4
5
6
7
8
9
# 检查分配地址段
[root@vpn-client-rhel ~]# ifconfig|grep -A 5 ppp
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1496
inet 172.16.56.102 netmask 255.255.255.255 destination 192.168.69.112
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 6 bytes 60 (60.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6 bytes 66 (66.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

4.4 添加默认路由

1
2
3
4
5
6
7
8
9
10
11
# 测试连接(可能无法访问外网)
[root@vpn-client-rhel ~]# ping www.baidu.com

# 添加默认路由(通过VPN访问外网)
[root@vpn-client-rhel ~]# ip route replace default dev ppp0

# 再次测试
[root@vpn-client-rhel ~]# ping www.baidu.com
PING baidu.com (220.181.57.216) 56(84) bytes of data.
64 bytes from 220.181.57.216: icmp_seq=1 ttl=52 time=23.0 ms
64 bytes from 220.181.57.216: icmp_seq=2 ttl=52 time=22.9 ms

4.5 Linux客户端管理命令

1
2
3
4
5
6
7
8
9
10
11
# 启动VPN连接
pon test

# 停止VPN连接
poff test

# 查看VPN连接状态
ifconfig ppp0

# 查看路由
ip route show

5. VPN连接故障排查

5.1 常见错误

如下这类错误和VPN客户端拨号提示连接691错误类似。

错误日志示例:

1
2
3
4
5
6
7
Nov 15 15:30:07 iZm5ea7wyzv7b8pzmd9vk5Z pppd[11407]: pppd 2.4.5 started by root, uid 0
Nov 15 15:30:07 iZm5ea7wyzv7b8pzmd9vk5Z pppd[11407]: Using interface ppp0
Nov 15 15:30:07 iZm5ea7wyzv7b8pzmd9vk5Z pppd[11407]: Connect: ppp0 <--> /dev/pts/2
Nov 15 15:30:38 iZm5ea7wyzv7b8pzmd9vk5Z pppd[11407]: LCP: timeout sending Config-Requests
Nov 15 15:30:38 iZm5ea7wyzv7b8pzmd9vk5Z pppd[11407]: Connection terminated.
Nov 15 15:30:38 iZm5ea7wyzv7b8pzmd9vk5Z pppd[11407]: Modem hangup
Nov 15 15:30:38 iZm5ea7wyzv7b8pzmd9vk5Z pppd[11407]: Exit.

5.2 故障排查步骤

步骤1: 检查IPtables和Selinux

1
2
3
4
5
6
# 检查防火墙状态
systemctl status firewalld
iptables -L -n

# 检查SELinux状态
getenforce

步骤2: 检查云主机安全组

如果是云主机请检查安全组入口和出口是否运行1723端口访问。

需要开放的端口:

  • TCP 1723: PPTP控制连接
  • GRE协议(47): PPTP数据连接

步骤3: 检查物理主机端口

如果是物理主机需要向IDC了解是否关闭此端口, 或路由不支持此协议。

1
2
3
4
5
# 检查端口监听
ss -lntup | grep 1723

# 检查iptables规则
iptables -L -n | grep 1723

步骤4: 检查服务状态

1
2
3
4
5
6
# 检查pptpd服务状态
systemctl status pptpd

# 查看pptpd日志
journalctl -u pptpd
tail -f /var/log/messages

步骤5: 检查用户名密码

1
2
3
4
# 检查chap-secrets配置
cat /etc/ppp/chap-secrets

# 验证用户名密码是否正确

步骤6: 检查网络连通性

1
2
3
4
5
# 从客户端测试VPN服务器端口
telnet 192.168.56.11 1723

# 或使用nc测试
nc -zv 192.168.56.11 1723

5.3 常见错误代码

错误代码 说明 解决方法
691 用户名或密码错误 检查chap-secrets配置
619 无法连接到服务器 检查防火墙和端口
721 远程计算机无响应 检查网络连通性
800 无法建立VPN连接 检查服务状态和配置

6. VPN服务优化

6.1 性能优化

1
2
3
4
5
6
7
8
9
# 优化内核参数
cat >> /etc/sysctl.conf <<EOF
# VPN优化
net.ipv4.ip_forward=1
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=8192
EOF

sysctl -p

6.2 安全优化

1
2
3
4
5
6
7
# 限制VPN访问IP
vim /etc/pptpd.conf

# 只允许特定IP连接(可选)
# 在iptables中添加规则
iptables -A INPUT -p tcp --dport 1723 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 1723 -j DROP

6.3 日志配置

1
2
3
4
5
6
# 启用详细日志
vim /etc/pptpd.conf

# 添加日志选项
logwtmp
debug

7. VPN管理命令总结

7.1 服务端管理命令

命令 功能 示例
systemctl start pptpd 启动服务 systemctl start pptpd
systemctl stop pptpd 停止服务 systemctl stop pptpd
systemctl status pptpd 查看状态 systemctl status pptpd
systemctl enable pptpd 开机自启 systemctl enable pptpd
ss -lntup | grep 1723 检查端口 ss -lntup | grep 1723

7.2 客户端管理命令

命令 功能 示例
pptpsetup --create 创建连接 pptpsetup --create test ...
pon 启动连接 pon test
poff 停止连接 poff test
ifconfig ppp0 查看连接 ifconfig ppp0

8. VPN最佳实践

8.1 配置建议

  1. 使用强密码: VPN密码要足够复杂
  2. 限制访问: 使用防火墙限制访问来源
  3. 定期更新: 定期更新VPN软件
  4. 监控日志: 定期检查VPN连接日志

8.2 安全建议

  1. 加密传输: 启用MPPE加密
  2. 访问控制: 限制VPN用户访问范围
  3. 日志审计: 记录所有VPN连接日志
  4. 定期审查: 定期审查VPN用户列表

8.3 性能建议

  1. 带宽管理: 合理分配VPN带宽
  2. 连接数限制: 限制同时连接数
  3. 超时设置: 设置合理的超时时间

9. VPN替代方案

9.1 OpenVPN

更安全、更灵活的VPN解决方案。

1
2
3
4
5
# 安装OpenVPN
yum install -y openvpn

# 配置OpenVPN
# 需要生成证书和密钥

9.2 WireGuard

现代、快速的VPN协议。

1
2
# 安装WireGuard
yum install -y wireguard-tools

10. 实战案例

10.1 案例1: 完整VPN服务器配置脚本

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
37
38
39
#!/bin/bash
# VPN服务器完整配置脚本

# 1. 环境准备
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

# 2. 安装软件
yum install -y ppp pptp pptpd

# 3. 开启内核转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

# 4. 配置DNS
cat >> /etc/ppp/options.pptpd <<EOF
ms-dns 223.5.5.5
ms-dns 8.8.8.8
EOF

# 5. 配置用户
cat >> /etc/ppp/chap-secrets <<EOF
user1 * password1 *
user2 * password2 *
EOF

# 6. 配置IP地址
cat >> /etc/pptpd.conf <<EOF
localip 192.168.56.11
remoteip 172.16.56.100-200
EOF

# 7. 启动服务
systemctl enable pptpd
systemctl start pptpd

# 8. 验证
ss -lntup | grep 1723

10.2 案例2: Linux客户端自动连接脚本

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
#!/bin/bash
# Linux客户端自动连接VPN脚本

VPN_SERVER="192.168.56.11"
VPN_USER="bgx"
VPN_PASS="123456"
VPN_NAME="company-vpn"

# 创建VPN连接
pptpsetup --create ${VPN_NAME} \
--server ${VPN_SERVER} \
--username ${VPN_USER} \
--password ${VPN_PASS} \
--encrypt \
--start

# 等待连接建立
sleep 5

# 添加默认路由
ip route replace default dev ppp0

# 验证连接
if ping -c 1 100.100.1.50 &>/dev/null; then
echo "VPN连接成功"
else
echo "VPN连接失败"
fi

实战优化