参考:
https://yq.aliyun.com/articles/504348?spm=a2c4e.11153940.blogcont434405.27.300e35b1Inhu7M#4
docker VPN 服务器
## 网站:
https://github.com/hwdsl2/docker-ipsec-vpn-server
安装docker
1 |
|
docker 镜像
systemctl start docker
## 预构建的可信任镜像
docker pull hwdsl2/ipsec-vpn-server
运行 IPsec VPN 服务器
## 环境变量,可选
1 |
|
加载 IPsec af_key 内核模块
## 重要: 首先需要在 Docker 主机上加载 IPsec af_key 内核模块:
modprobe af_key
## 为保证系统启动加载,systemd-modules-load.service会自动加载配置文件
cat > /etc/modules-load.d/af_key.conf <<EOF
# Load af_key.ko at boot
af_key
EOF
使用镜像创建一个新的 Docker 容器
(将 ./vpn.env 替换为你自己的 env 文件):
docker run \
--name ipsec-vpn-server \
--env-file /etc/vpn.env \
--restart=always \
-p 500:500/udp \
-p 4500:4500/udp \
-v /lib/modules:/lib/modules:ro \
-d --privileged \
hwdsl2/ipsec-vpn-server
获取 VPN 登录信息
docker logs ipsec-vpn-server
## 在命令输出中查找这些行:
Connect to your new VPN with these details:
Server IP: 你的VPN服务器IP
IPsec PSK: 你的IPsec预共享密钥
Username: 你的VPN用户名
Password: 你的VPN密码
(可选步骤) 备份自动生成的 VPN 登录信息(如果有)到当前目录:
docker cp ipsec-vpn-server:/opt/src/vpn-gen.env ./
查看服务器状态
## 如需查看你的 IPsec VPN 服务器状态,可以在容器中运行 ipsec status 命令:
docker exec -it ipsec-vpn-server ipsec status
## 或者查看当前已建立的 VPN 连接:
docker exec -it ipsec-vpn-server ipsec whack --trafficstatus
提示:
Windows 用户 在首次连接之前需要修改注册表,以解决 VPN 服务器 和/或 客户端与 NAT(比如家用路由器)的兼容问题。
同一个 VPN 账户可以在你的多个设备上使用。但是由于 IPsec/L2TP 的局限性,如果需要同时连接在同一个 NAT (比如家用路由器)后面的多个设备到 VPN 服务器,你必须仅使用 IPsec/XAuth 模式。
对于有外部防火墙的服务器(比如 EC2/GCE),请为 VPN 打开 UDP 端口 500 和 4500。
在编辑任何 VPN 配置文件之前,你必须首先在正在运行的 Docker 容器中 开始一个 Bash 会话。
如果需要添加,修改或者删除 VPN 用户账户,请参见 管理 VPN 用户。重要: 在编辑完 VPN 配置文件之后,你还必须注释掉脚本 /opt/src/run.sh 中的相应部分,以避免你的更改在容器重启后丢失。
在 VPN 已连接时,客户端配置为使用 Google Public DNS。如果偏好其它的域名解析服务,请编辑 /opt/src/run.sh 并将 8.8.8.8 和 8.8.4.4 替换为你的新服务器。然后重启 Docker 容器。
高级用法
1. 从源代码构建
高级用户可以从 GitHub 下载并自行编译源代码:
git clone https://github.com/hwdsl2/docker-ipsec-vpn-server.git
cd docker-ipsec-vpn-server
docker build -t hwdsl2/ipsec-vpn-server .
若不需要改动源码,也可以这样:
docker build -t hwdsl2/ipsec-vpn-server github.com/hwdsl2/docker-ipsec-vpn-server.git
2. 在容器中运行 Bash shell
在正在运行的 Docker 容器中开始一个 Bash 会话:
docker exec -it ipsec-vpn-server env TERM=xterm bash -l
(可选步骤) 安装 vim 编辑器:
apt-get update && apt-get -y install vim
然后在容器中运行你的命令。完成后退出并重启 Docker 容器 (如果需要):
exit
docker restart ipsec-vpn-server
3. 启用 Libreswan 日志
为了保持较小的 Docker 镜像,Libreswan (IPsec) 日志默认未开启。如果你是高级用户,并且需要启用它以便进行故障排除,首先在正在运行的 Docker 容器中开始一个 Bash 会话:
docker exec -it ipsec-vpn-server env TERM=xterm bash -l
然后运行以下命令:
apt-get update && apt-get -y install rsyslog
service rsyslog restart
service ipsec restart
sed -i '/modprobe/a service rsyslog restart' /opt/src/run.sh
exit
完成后你可以这样查看 Libreswan 日志:
docker exec -it ipsec-vpn-server grep pluto /var/log/auth.log
技术细节
需要运行以下两个服务: Libreswan (pluto) 提供 IPsec VPN, xl2tpd 提供 L2TP 支持。
默认的 IPsec 配置支持以下协议:
IKEv1 with PSK and XAuth ("Cisco IPsec")
IPsec/L2TP with PSK
为使 VPN 服务器正常工作,将会打开以下端口:
4500/udp and 500/udp for IPsec
配置 IPsec/XAuth (“Cisco IPsec”) VPN 客户端
https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md#windows-%E9%94%99%E8%AF%AF-809
Windows
注: 你也可以使用 IPsec/L2TP 模式 连接,无需安装额外的软件。
下载并安装免费的 Shrew Soft VPN 客户端。
https://www.shrew.net/download/vpn
注: 该 VPN 客户端支持 Windows 2K/XP/Vista/7/8 系统。
单击开始菜单 -> 所有程序 -> ShrewSoft VPN Client -> VPN Access Manager
单击工具栏中的 Add (+) 按钮。
在 Host Name or IP Address 字段中输入你的 VPN 服务器 IP。
单击 Authentication 选项卡,从 Authentication Method 下拉菜单中选择 Mutual PSK + XAuth。
在 Local Identity 子选项卡中,从 Identification Type 下拉菜单中选择 IP Address。
单击 Credentials 子选项卡,并在 Pre Shared Key 字段中输入你的 VPN IPsec PSK。
单击 Phase 1 选项卡,从 Exchange Type 下拉菜单中选择 main。
单击 Phase 2 选项卡,从 HMAC Algorithm 下拉菜单中选择 sha1。
单击 Save 保存 VPN 连接的详细信息。
选择新添加的 VPN 连接。单击工具栏中的 Connect 按钮。
在 Username 字段中输入你的 VPN 用户名。
在 Password 字段中输入你的 VPN 密码。
单击 Connect。
VPN 连接成功后,你会在 VPN Connect 状态窗口中看到 tunnel enabled 字样。单击 "Network" 选项卡,并确认 Established - 1 显示在 "Security Associations" 下面。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。
如果在连接过程中遇到错误,请参见 故障排除。
OS X
打开系统偏好设置并转到网络部分。
在窗口左下角单击 + 按钮。
从 接口 下拉菜单选择 VPN。
从 VPN类型 下拉菜单选择 Cisco IPSec。
在 服务名称 字段中输入任意内容。
单击 创建。
在 服务器地址 字段中输入你的 VPN 服务器 IP。
在 帐户名称 字段中输入你的 VPN 用户名。
在 密码 字段中输入你的 VPN 密码。
单击 鉴定设置 按钮。
在 机器鉴定 部分,选择 共享的密钥 单选按钮,然后输入你的 VPN IPsec PSK。
保持 群组名称 字段空白。
单击 好。
选中 在菜单栏中显示 VPN 状态 复选框。
单击 应用 保存VPN连接信息。
要连接到 VPN: 使用菜单栏中的图标,或者打开系统偏好设置的网络部分,选择 VPN 并单击 连接。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。
Android
启动 设置 应用程序。
在 无线和网络 部分单击 更多...。
单击 VPN。
单击 添加VPN配置文件 或窗口右上角的 +。
在 名称 字段中输入任意内容。
在 类型 下拉菜单选择 IPSec Xauth PSK。
在 服务器地址 字段中输入你的 VPN 服务器 IP。
保持 IPSec 标识符 字段空白。
在 IPSec 预共享密钥 字段中输入你的 VPN IPsec PSK。
单击 保存。
单击新的VPN连接。
在 用户名 字段中输入你的 VPN 用户名。
在 密码 字段中输入你的 VPN 密码。
选中 保存帐户信息 复选框。
单击 连接。
VPN 连接成功后,会在通知栏显示图标。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。
如果在连接过程中遇到错误,请参见 故障排除。
iOS
进入设置 -> 通用 -> VPN。
单击 添加VPN配置...。
单击 类型 。选择 IPSec 并返回。
在 描述 字段中输入任意内容。
在 服务器 字段中输入你的 VPN 服务器 IP。
在 帐户 字段中输入你的 VPN 用户名。
在 密码 字段中输入你的 VPN 密码。
保持 群组名称 字段空白。
在 密钥 字段中输入你的 VPN IPsec PSK。
单击右上角的 存储。
启用 VPN 连接。
VPN 连接成功后,会在通知栏显示图标。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。
故障排除
Windows 错误 809
无法建立计算机与 VPN 服务器之间的网络连接,因为远程服务器未响应。
要解决此错误,在首次连接之前需要修改一次注册表,以解决 VPN 服务器 和/或 客户端与 NAT (比如家用路由器)的兼容问题。请下载并导入下面的 .reg 文件,或者打开 提升权限命令提示符 并运行以下命令。完成后必须重启计算机。
适用于 Windows Vista, 7, 8.x 和 10 (下载 .reg 文件)
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f
仅适用于 Windows XP (下载 .reg 文件)
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\IPSec /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f
另外,某些个别的 Windows 系统配置禁用了 IPsec 加密,此时也会导致连接失败。要重新启用它,可以运行以下命令并重启。
适用于 Windows XP, Vista, 7, 8.x 和 10 (下载 .reg 文件)
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\RasMan\Parameters /v ProhibitIpSec /t REG_DWORD /d 0x0 /f