使用 Docker 搭建 IPsec VPN 服务 
1. 项目简介 
本文使用 IPsec VPN Server on Docker 项目快速搭建 VPN 服务。该项目基于 Docker 容器化部署,支持 IPsec/L2TP 和 IKEv2 两种协议。
1.1 为什么选择这个方案 
- ✅ 容器化部署:一键启动,环境隔离
- ✅ 多协议支持:同时支持 IKEv2 和 IPsec/L2TP
- ✅ 跨平台兼容:Windows、macOS、Linux、Android、iOS 全平台支持
- ✅ 配置简单:自动生成配置和证书
- ✅ 开源免费:完全开源,社区活跃
2. 服务端安装 
2.1 拉取 Docker 镜像 
bash
docker pull hwdsl2/ipsec-vpn-server2.2 创建配置文件 
在服务器上创建 docker-compose.yml 文件:
yaml
services:
  ipsec-vpn-server:
    image: hwdsl2/ipsec-vpn-server
    container_name: ipsec-vpn-server
    restart: unless-stopped
    volumes:
      - ./conf:/etc/ipsec.d
      - ./modules:/lib/modules:ro
    ports:
      - "500:500/udp"
      - "4500:4500/udp"
      - "1701:1701/udp"
    privileged: true配置说明:
- volumes: - ./conf:存储 VPN 配置和证书
- ./modules:挂载系统内核模块(只读)
 
- ports:开放 UDP 端口 500、4500、1701
- privileged:需要特权模式以访问网络功能
2.3 启动服务 
bash
docker-compose up -d2.4 配置防火墙 
确保在服务器防火墙中开放以下端口:
- 500/udp- IKE 协商
- 4500/udp- NAT-T(NAT 穿透)
- 1701/udp- L2TP
如果使用云服务器,还需要在安全组中开放这些端口。
2.5 获取登录凭证 
首次启动后,通过 Docker 日志查看自动生成的 VPN 用户凭证:
bash
docker logs ipsec-vpn-server日志中会显示:
- VPN 用户名
- VPN 密码
- IPsec PSK(预共享密钥)
自定义凭证
可以通过环境变量自定义用户名和密码,在 docker-compose.yml 中添加:
yaml
environment:
  - VPN_USER=your_username
  - VPN_PASSWORD=your_password
  - VPN_IPSEC_PSK=your_psk3. 客户端配置 
3.1 使用 IKEv2 协议连接(推荐) 
IKEv2 是更现代、更安全的协议,推荐优先使用。
3.1.1 Windows 客户端 
下载服务器上的证书文件和导入脚本:
- 下载 ./conf/vpnclient.p12文件(客户端证书)
- 下载 ikev2_config_import.cmd(配置导入脚本)
- 将两个文件放到同一个文件夹
- 以管理员权限运行 ikev2_config_import.cmd
脚本会自动导入证书并创建 VPN 连接。
3.1.2 macOS 客户端 
- 双击 vpnclient.p12导入证书到钥匙串
- 打开系统偏好设置 → 网络
- 点击 "+" 添加新连接
- 接口选择 "VPN",VPN 类型选择 "IKEv2"
- 输入服务器地址和远程 ID(通常是服务器 IP)
- 认证设置选择 "证书",选择导入的证书
3.1.3 Android 客户端 
Android 11+ 系统自带客户端:
- 将 vpnclient.p12传输到手机
- 设置 → 网络和互联网 → VPN
- 添加 VPN 配置文件
- 类型选择 "IKEv2/IPsec RSA"
- 导入证书并配置服务器地址
Android 10 及以下推荐使用 strongSwan:
- 安装 strongSwan VPN 客户端
- 导入 vpnclient.p12证书
- 添加新的 VPN 配置
3.1.4 iOS 客户端 
- 将 vpnclient.p12通过 AirDrop 或邮件发送到 iOS 设备
- 打开文件,按提示导入配置描述文件
- 设置 → 通用 → VPN → 添加 VPN 配置
- 类型选择 "IKEv2"
- 填写服务器地址,认证方式选择证书
3.2 使用 IPsec/L2TP 协议连接 
如果 IKEv2 无法使用,可以尝试 IPsec/L2TP 协议。
3.2.1 Windows 客户端配置 
首次使用需要修改注册表:
bat
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f修改后 必须重启 计算机。
添加 VPN 连接:
- 设置 → 网络和 Internet → VPN
- 添加 VPN 连接
- VPN 类型选择 "L2TP/IPsec with pre-shared key"
- 输入服务器地址、用户名、密码和 PSK
3.2.2 其他平台 
其他平台的配置方法可参考 官方文档。
4. 高级配置 
4.1 添加多用户 
编辑 ./conf/vpn.env 文件(首次运行后生成),添加更多用户:
bash
VPN_ADDL_USERS=user1 user2 user3
VPN_ADDL_PASSWORDS=password1 password2 password3重启容器使配置生效:
bash
docker-compose restart4.2 性能优化 
对于高并发场景,可以调整以下参数:
yaml
environment:
  - VPN_DNS_SRV1=8.8.8.8
  - VPN_DNS_SRV2=8.8.4.44.3 查看连接状态 
查看当前连接的用户:
bash
docker exec -it ipsec-vpn-server ipsec status5. 故障排查 
5.1 常见问题 
连接失败怎么办?
- 检查防火墙端口是否开放
- 确认服务器公网 IP 是否正确
- 查看容器日志:docker logs ipsec-vpn-server
- 验证时间同步(时间偏差可能导致证书验证失败)
速度慢怎么办?
- 更换 DNS 服务器
- 选择地理位置更近的服务器
- 检查服务器带宽限制
5.2 日志查看 
实时查看日志:
bash
docker logs -f ipsec-vpn-server6. 安全建议 
- 定期更新:及时更新 Docker 镜像到最新版本
- 强密码:使用强密码和复杂的 PSK
- 限制访问:使用防火墙限制 VPN 访问源
- 监控日志:定期检查日志,发现异常及时处理
- 证书管理:妥善保管证书文件,不要公开分享
7. 替代方案 
如果这个方案不满足需求,可以考虑以下替代方案:
- Tailscale:现代化的零配置 VPN 方案,参考:https://blog.d0zingcat.dev/p/tailscale-intro/
- WireGuard:轻量级、高性能的 VPN 协议
- OpenVPN:老牌开源 VPN 解决方案
- Shadowsocks:轻量级代理工具