使用这个 Docker 镜像快速搭建 IPsec VPN 服务器。支持 IPsec/L2TP
和 Cisco IPsec
协议。
本镜像以 Debian 10 (Buster) 为基础,并使用 Libreswan (IPsec VPN 软件) 和 xl2tpd (L2TP 服务进程)。
首先,在你的 Linux 服务器上 安装并运行 Docker。
注: 本镜像不支持 Docker for Mac 或者 Windows。
预构建的可信任镜像可在 Docker Hub registry 下载:
docker pull hwdsl2/ipsec-vpn-server
支持以下架构系统:linux/amd64
, linux/arm64
和 linux/arm/v7
。
或者,你也可以自己从 GitHub 编译源代码。
这个 Docker 镜像使用以下几个变量,可以在一个 env
文件中定义 (示例):
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password
这将创建一个用于 VPN 登录的用户账户,它可以在你的多个设备上使用*。 IPsec PSK (预共享密钥) 由 VPN_IPSEC_PSK
环境变量指定。 VPN 用户名和密码分别在 VPN_USER
和 VPN_PASSWORD
中定义。
支持创建额外的 VPN 用户,如果需要,可以像下面这样在你的 env
文件中定义。用户名和密码必须分别使用空格进行分隔,并且用户名不能有重复。所有的 VPN 用户将共享同一个 IPsec PSK。
VPN_ADDL_USERS=additional_username_1 additional_username_2
VPN_ADDL_PASSWORDS=additional_password_1 additional_password_2
注: 在你的 env
文件中,不要为变量值添加 ""
或者 ''
,或在 =
两边添加空格。不要在值中使用这些字符: \ " '
。一个安全的 IPsec PSK 应该至少包含 20 个随机字符。
所有这些环境变量对于本镜像都是可选的,也就是说无需定义它们就可以搭建 IPsec VPN 服务器。详情请参见以下部分。
使用本镜像创建一个新的 Docker 容器 (将 ./vpn.env
替换为你自己的 env
文件):
docker run \
--name ipsec-vpn-server \
--env-file ./vpn.env \
--restart=always \
-p 500:500/udp \
-p 4500:4500/udp \
-d --privileged \
hwdsl2/ipsec-vpn-server
如果你在上述 docker run
命令中没有指定 env
文件,VPN_USER
会默认为 vpnuser
,并且 VPN_IPSEC_PSK
和 VPN_PASSWORD
会被自动随机生成。要获取这些登录信息,可以查看容器的日志:
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
配置你的计算机或其它设备使用 VPN 。请参见:
配置 IPsec/XAuth ("Cisco IPsec") VPN 客户端
如果在连接过程中遇到错误,请参见 故障排除。
开始使用自己的专属 VPN !
Windows 用户 在首次连接之前需要修改注册表,以解决 VPN 服务器和/或客户端与 NAT(比如家用路由器)的兼容问题。
Android 用户 如果遇到连接问题,请尝试 这些步骤。
同一个 VPN 账户可以在你的多个设备上使用。但是由于 IPsec/L2TP 的局限性,如果需要同时连接在同一个 NAT (比如家用路由器)后面的多个设备到 VPN 服务器,你必须仅使用 IPsec/XAuth 模式。
对于有外部防火墙的服务器(比如 EC2/GCE),请为 VPN 打开 UDP 端口 500 和 4500。阿里云用户请参见 #433。
如果需要编辑 VPN 配置文件,你必须首先在正在运行的 Docker 容器中 开始一个 Bash 会话。
如需添加,修改或者删除 VPN 用户账户,首先更新你的 env
文件,然后你必须按照 下一节 的说明来删除并重新创建 Docker 容器。高级用户可以 绑定挂载 env
文件。
在 VPN 已连接时,客户端配置为使用 Google Public DNS。如果偏好其它的域名解析服务,请看这里。
如需更新你的 Docker 镜像和容器,请按以下步骤进行:
docker pull hwdsl2/ipsec-vpn-server
如果 Docker 镜像已经是最新的,你会看到提示:
Status: Image is up to date for hwdsl2/ipsec-vpn-server:latest
否则,将会下载最新版本。要更新你的 Docker 容器,首先在纸上记下你所有的 VPN 登录信息。然后删除 Docker 容器: docker rm -f ipsec-vpn-server
。最后按照 这一小节 的说明来重新创建它。
在 VPN 已连接时,客户端配置为使用 Google Public DNS。如果偏好其它的域名解析服务,你可以在 env
文件中定义 VPN_DNS_SRV1
和 VPN_DNS_SRV2
(可选),然后按照上面的说明重新创建 Docker 容器。比如你想使用 Cloudflare 的 DNS 服务:
VPN_DNS_SRV1=1.1.1.1
VPN_DNS_SRV2=1.0.0.1
使用这个 Docker 镜像,高级用户可以配置并使用 IKEv2。它是比 IPsec/L2TP 和 IPsec/XAuth ("Cisco IPsec") 更佳的连接模式,该模式无需 IPsec PSK, 用户名或密码。更多信息请看这里。在配置之后,你将可以选择三种模式中的任意一种连接。
请按照以下步骤操作:
-
下载最新版本的 Docker 镜像。在纸上记下你所有的 VPN 登录信息,然后删除 Docker 容器。
# 下载最新版本的 Docker 镜像 docker pull hwdsl2/ipsec-vpn-server # 首先在纸上记下你所有的 VPN 登录信息 # 然后删除 Docker 容器 docker rm -f ipsec-vpn-server
-
创建一个新的 Docker 容器(将
./vpn.env
替换为你自己的 env 文件)。docker run \ --name ipsec-vpn-server \ --env-file ./vpn.env \ --restart=always \ -v ikev2-vpn-data:/etc/ipsec.d \ -p 500:500/udp \ -p 4500:4500/udp \ -d --privileged \ hwdsl2/ipsec-vpn-server
在该命令中,我们使用
docker run
的-v
选项来创建一个名为ikev2-vpn-data
的新 Docker 卷,并且将它挂载到容器内的/etc/ipsec.d/
目录下。数据在该卷中保存,之后当你需要重新创建 Docker 容器的时候,只需指定同一个卷。 -
检查 Docker 日志 以确认 VPN 容器已成功启动。
docker logs ipsec-vpn-server
-
在正在运行的 Docker 容器中 开始一个 Bash 会话。
docker exec -it ipsec-vpn-server env TERM=xterm bash -l
-
下载并运行 IKEv2 配置辅助脚本,并按提示操作。
wget https://git.io/ikev2setup -O ikev2.sh && bash ikev2.sh
注: 如果要为更多的客户端生成证书,只需重新运行辅助脚本。要吊销一个客户端证书,参见这里。
-
在完成之后,退出容器
exit
并转到 配置 IKEv2 VPN 客户端。要将生成的.p12
文件复制到 Docker 主机当前目录,你可以使用比如:docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient-日期-时间.p12 ./
高级用户可以从 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
在正在运行的 Docker 容器中开始一个 Bash 会话:
docker exec -it ipsec-vpn-server env TERM=xterm bash -l
(可选步骤) 安装 nano
编辑器:
apt-get update && apt-get -y install nano
然后在容器中运行你的命令。完成后退出并重启 Docker 容器 (如果需要):
exit
docker restart ipsec-vpn-server
作为 --env-file
选项的替代方案,高级用户可以绑定挂载 env
文件。该方法的好处是你在更新 env
文件之后可以重启 Docker 容器以生效,而不需要重新创建它。要使用这个方法,你必须首先编辑你的 env
文件并将所有的变量值用单引号 ''
括起来。然后(重新)创建 Docker 容器(将第一个 vpn.env
替换为你自己的 env
文件):
docker run \
--name ipsec-vpn-server \
--restart=always \
-p 500:500/udp \
-p 4500:4500/udp \
-v "$(pwd)/vpn.env:/opt/src/vpn.env:ro" \
-d --privileged \
hwdsl2/ipsec-vpn-server
为了保持较小的 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 '/pluto\.pid/a service rsyslog restart' /opt/src/run.sh
exit
完成后你可以这样查看 Libreswan 日志:
docker exec -it ipsec-vpn-server grep pluto /var/log/auth.log
如需查看 xl2tpd 日志,请运行 docker logs ipsec-vpn-server
。
需要运行以下两个服务: 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
版权所有 (C) 2016-2020 Lin Song
基于 Thomas Sarlandie 的工作 (Copyright 2012) (版权所有 2012)
这个项目是以 知识共享署名-相同方式共享3.0 许可协议授权。
必须署名: 请包括我的名字在任何衍生产品,并且让我知道你是如何改善它的!