Docker 搭建 IPsec VPN 服务器

一、准备工作

1.1 获取服务器

本文使用阿里云 ECS 服务器(香港节点,CentOS 7.9 64位)进行演示。学生用户可通过阿里云学生计划免费领取服务器。

重要信息记录

  • 公网 IP 地址:在服务器控制台查看并记录(后续配置需要)
  • 操作系统:CentOS 7.9 64位

1.2 安装 Docker(如未安装)

1.2.1 更新系统并安装依赖

1
2
sudo yum update -y
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

1.2.2 添加 Docker 官方仓库

1
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

1.2.3 安装 Docker

1
sudo yum install -y docker-ce docker-ce-cli containerd.io

1.2.4 启动并设置开机自启

1
2
sudo systemctl start docker
sudo systemctl enable docker

1.2.5 验证安装

1
2
3
4
5
# 查看 Docker 版本
docker --version

# 测试 Docker 运行
sudo docker run hello-world

验证成功标志:能看到 hello-world 镜像拉取成功并运行。


二、配置 VPN 服务器

2.1 创建配置目录

1
2
mkdir -p /vpn
cd /vpn

2.2 创建环境配置文件

创建并编辑 .env 文件:

1
2
3
nano /vpn/.env
# 或使用 vim
# vim /vpn/.env

2.3 配置文件内容

将以下配置粘贴到 .env 文件中,根据实际情况修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# IPsec 预共享密钥(重要!)
VPN_IPSEC_PSK=AKIDkQD7!

# 主 VPN 账号和密码
VPN_USER=test
VPN_PASSWORD=vpn1234

# 服务器公网 IP(必须修改为你的服务器 IP)
VPN_PUBLIC_IP=36.111.xxx.xxx

# 额外 VPN 用户(用户名用空格分隔)
VPN_ADDL_USERS=vpn1 vpn2

# 对应额外用户的密码(顺序与用户名对应)
VPN_ADDL_PASSWORDS=vpn11234 pass21234

# DNS 服务器配置
VPN_DNS_SRV1=8.8.8.8
VPN_DNS_SRV2=114.114.114.114

配置说明

  • VPN_PUBLIC_IP:必须替换为你的服务器公网 IP
  • VPN_IPSEC_PSK:建议使用强密码,包含大小写字母、数字和特殊字符
  • 多个用户配置:确保用户名和密码顺序对应

三、部署 VPN 容器

3.1 首次运行容器

1
2
3
4
5
6
7
8
docker run \
--name ipsec-vpn-server \
--env-file /vpn/.env \
--restart=always \
-p 500:500/udp \
-p 4500:4500/udp \
-v /lib/modules:/lib/modules:ro \
-d hwdsl2/ipsec-vpn-server

3.2 处理特权模式错误

如果出现错误提示需要特权模式,按以下步骤操作:

停止并删除现有容器

1
2
docker stop ipsec-vpn-server
docker rm ipsec-vpn-server

重新以特权模式运行

1
2
3
4
5
6
7
8
9
docker run \
--name ipsec-vpn-server \
--env-file /vpn/.env \
--restart=always \
--privileged \
-p 500:500/udp \
-p 4500:4500/udp \
-v /lib/modules:/lib/modules:ro \
-d hwdsl2/ipsec-vpn-server

3.3 检查容器状态

1
2
3
4
5
# 查看容器运行状态
docker ps

# 查看容器日志
docker logs ipsec-vpn-server

成功标志:日志中显示 IPsec VPN server started 或类似信息。


四、配置服务器防火墙

4.1 开放必要端口

VPN 服务需要以下 UDP 端口:

  • 500:ISAKMP(IKE 协商)
  • 4500:NAT-T(NAT 穿越)
  • 1701:L2TP(可选)

方法一:使用 iptables(命令行)

1
2
3
4
5
6
7
8
9
10
11
# 开放 UDP 500 端口
sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT

# 开放 UDP 4500 端口
sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT

# 开放 UDP 1701 端口(L2TP)
sudo iptables -A INPUT -p udp --dport 1701 -j ACCEPT

# 保存规则(CentOS 7)
sudo service iptables save

方法二:使用云控制台(推荐)

以阿里云为例:

  1. 登录阿里云控制台
  2. 进入 ECS 实例详情页
  3. 找到「安全组」配置
  4. 点击「配置规则」
  5. 手动添加以下入方向规则:
授权策略 协议类型 端口范围 授权对象 描述
允许 UDP 500/500 0.0.0.0/0 IPsec ISAKMP
允许 UDP 4500/4500 0.0.0.0/0 IPsec NAT-T
允许 UDP 1701/1701 0.0.0.0/0 L2TP(可选)

4.2 重启容器使配置生效

1
docker restart ipsec-vpn-server

五、Windows 客户端连接配置

5.1 创建 VPN 连接

  1. 打开「设置」→「网络和 Internet」→「VPN」
  2. 点击「添加 VPN 连接」
  3. 填写以下信息:
    • VPN 提供商:Windows(内置)
    • 连接名称:自定义(如 MyVPN)
    • 服务器名称或地址:你的服务器公网 IP
    • VPN 类型:使用预共享密钥的 L2TP/IPsec
    • 预共享密钥.env 文件中的 VPN_IPSEC_PSK
    • 登录信息的类型:用户名和密码
    • 用户名.env 文件中的 VPN_USER
    • 密码.env 文件中的 VPN_PASSWORD

5.2 修改注册表(解决连接问题)

以管理员身份打开 PowerShell 或命令提示符,执行:

1
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f

5.3 连接 VPN

  1. 执行上述命令后重启计算机
  2. 在系统托盘点击网络图标
  3. 选择创建的 VPN 连接
  4. 点击「连接」
  5. 输入用户名和密码(如已保存则自动连接)

六、Android 客户端连接配置

6.1 创建 VPN 连接

  1. 打开「设置」→「更多连接」→「VPN」
  2. 点击「添加 VPN」或「+」
  3. 填写以下信息:
    • 名称:自定义(如 MyVPN)
    • 类型:L2TP/IPSec PSK
    • 服务器地址:你的服务器公网 IP
    • L2TP 密钥:留空
    • IPSec 标识符:留空
    • IPSec 预共享密钥.env 文件中的 VPN_IPSEC_PSK
    • 用户名.env 文件中的 VPN_USER
    • 密码.env 文件中的 VPN_PASSWORD

6.2 保存并连接

  1. 点击「保存」
  2. 在 VPN 列表中选择刚创建的连接
  3. 点击「连接」

七、故障排除

7.1 常见问题及解决

问题1:容器启动失败,提示特权模式错误

解决:使用 --privileged 参数重新运行容器(见3.2节)

问题2:客户端连接超时

检查步骤

  1. 确认服务器公网 IP 正确
  2. 检查防火墙端口是否开放
  3. 验证容器是否正常运行
    1
    docker logs ipsec-vpn-server

问题3:Windows 连接错误 789

解决

  1. 确保已执行注册表修改命令(5.2节)
  2. 重启计算机
  3. 检查预共享密钥是否正确

问题4:能连接但无法上网

检查

  1. 确认 DNS 配置正确
  2. 检查服务器是否开启 IP 转发
    1
    echo 1 > /proc/sys/net/ipv4/ip_forward

7.2 查看连接状态

1
2
3
4
5
# 查看容器实时日志
docker logs -f ipsec-vpn-server

# 查看当前连接用户
docker exec ipsec-vpn-server ipsec status

八、安全建议

8.1 密码安全

  1. 使用强密码:预共享密钥和用户密码应包含大小写字母、数字和特殊字符
  2. 定期更换:建议每月更换一次密码
  3. 最小权限:只为必要用户创建 VPN 账号

8.2 服务器安全

  1. 限制访问:在安全组中限制源 IP(如只允许特定国家或 IP 段)
  2. 监控日志:定期检查 VPN 连接日志
  3. 更新维护:定期更新 Docker 镜像和系统

8.3 备份配置

1
2
3
4
5
# 备份 .env 配置文件
cp /vpn/.env /vpn/.env.backup.$(date +%Y%m%d)

# 导出容器配置
docker export ipsec-vpn-server > /vpn/vpn-backup.tar

九、总结

通过以上步骤,你已成功在 CentOS 7 服务器上使用 Docker 搭建了 IPsec VPN 服务器。关键要点:

  1. 环境准备:确保 Docker 正确安装
  2. 配置正确.env 文件中的公网 IP 必须准确
  3. 端口开放:确保 UDP 500 和 4500 端口对外开放
  4. 客户端配置:注意 Windows 需要修改注册表

优势

  • 使用 Docker 部署,简单快速
  • 支持多用户同时连接
  • 跨平台客户端支持(Windows、Android、iOS、macOS)
  • 配置易于备份和迁移

后续维护

  • 定期检查容器日志
  • 关注安全更新
  • 监控服务器资源使用情况

现在你可以安全地通过 VPN 访问你的服务器资源,或用于保护公共 Wi-Fi 下的网络通信。