Skip to content

使用 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-server

2.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 -d

2.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_psk

3. 客户端配置

3.1 使用 IKEv2 协议连接(推荐)

IKEv2 是更现代、更安全的协议,推荐优先使用。

3.1.1 Windows 客户端

下载服务器上的证书文件和导入脚本:

  1. 下载 ./conf/vpnclient.p12 文件(客户端证书)
  2. 下载 ikev2_config_import.cmd(配置导入脚本)
  3. 将两个文件放到同一个文件夹
  4. 以管理员权限运行 ikev2_config_import.cmd

脚本会自动导入证书并创建 VPN 连接。

3.1.2 macOS 客户端

  1. 双击 vpnclient.p12 导入证书到钥匙串
  2. 打开系统偏好设置 → 网络
  3. 点击 "+" 添加新连接
  4. 接口选择 "VPN",VPN 类型选择 "IKEv2"
  5. 输入服务器地址和远程 ID(通常是服务器 IP)
  6. 认证设置选择 "证书",选择导入的证书

3.1.3 Android 客户端

Android 11+ 系统自带客户端:

  1. vpnclient.p12 传输到手机
  2. 设置 → 网络和互联网 → VPN
  3. 添加 VPN 配置文件
  4. 类型选择 "IKEv2/IPsec RSA"
  5. 导入证书并配置服务器地址

Android 10 及以下推荐使用 strongSwan:

  1. 安装 strongSwan VPN 客户端
  2. 导入 vpnclient.p12 证书
  3. 添加新的 VPN 配置

3.1.4 iOS 客户端

  1. vpnclient.p12 通过 AirDrop 或邮件发送到 iOS 设备
  2. 打开文件,按提示导入配置描述文件
  3. 设置 → 通用 → VPN → 添加 VPN 配置
  4. 类型选择 "IKEv2"
  5. 填写服务器地址,认证方式选择证书

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 连接:

  1. 设置 → 网络和 Internet → VPN
  2. 添加 VPN 连接
  3. VPN 类型选择 "L2TP/IPsec with pre-shared key"
  4. 输入服务器地址、用户名、密码和 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 restart

4.2 性能优化

对于高并发场景,可以调整以下参数:

yaml
environment:
  - VPN_DNS_SRV1=8.8.8.8
  - VPN_DNS_SRV2=8.8.4.4

4.3 查看连接状态

查看当前连接的用户:

bash
docker exec -it ipsec-vpn-server ipsec status

5. 故障排查

5.1 常见问题

连接失败怎么办?

  1. 检查防火墙端口是否开放
  2. 确认服务器公网 IP 是否正确
  3. 查看容器日志:docker logs ipsec-vpn-server
  4. 验证时间同步(时间偏差可能导致证书验证失败)

速度慢怎么办?

  1. 更换 DNS 服务器
  2. 选择地理位置更近的服务器
  3. 检查服务器带宽限制

5.2 日志查看

实时查看日志:

bash
docker logs -f ipsec-vpn-server

6. 安全建议

  1. 定期更新:及时更新 Docker 镜像到最新版本
  2. 强密码:使用强密码和复杂的 PSK
  3. 限制访问:使用防火墙限制 VPN 访问源
  4. 监控日志:定期检查日志,发现异常及时处理
  5. 证书管理:妥善保管证书文件,不要公开分享

7. 替代方案

如果这个方案不满足需求,可以考虑以下替代方案:

8. 参考资源