English | 简体中文 | 繁體中文 | Русский
使用此 Docker 映像快速架設 IPsec VPN 伺服器。支援 IPsec/L2TP、Cisco IPsec 和 IKEv2 協議。
本映像以 Alpine 3.23 或 Debian 12 為基礎,並使用 Libreswan(IPsec VPN 軟體)和 xl2tpd(L2TP 服務程序)。
IPsec VPN 可以加密你的網路流量,以防止在透過網際網路傳送時,你與 VPN 伺服器之間的任何人未經授權存取你的資料。在使用不安全的網路時,這一點特別有用,例如在咖啡廳、機場或旅館房間。
另提供: WireGuard、OpenVPN、Headscale 與 LiteLLM 的 Docker 映像。
» 📖 Book: Privacy Tools in the Age of AI 架設自己的 VPN 伺服器
使用以下命令在 Docker 上快速架設 IPsec VPN 伺服器:
docker run \
--name ipsec-vpn-server \
--restart=always \
-v ikev2-vpn-data:/etc/ipsec.d \
-v /lib/modules:/lib/modules:ro \
-p 500:500/udp \
-p 4500:4500/udp \
-d --privileged \
hwdsl2/ipsec-vpn-server
你的 VPN 登入憑證將會自動隨機生成。請參見取得 VPN 登入資訊。
另外,你也可以在不使用 Docker 的情況下安裝 IPsec VPN。若要了解更多關於如何使用本映像的資訊,請繼續閱讀以下部分。
- 支援具有強大且快速加密演算法(例如 AES-GCM)的 IKEv2 模式
- 生成 VPN 設定檔以自動設定 iOS、macOS 和 Android 裝置
- 支援 Windows、macOS、iOS、Android、Chrome OS 和 Linux 客戶端
- 包含輔助腳本以管理 IKEv2 使用者與憑證
首先在你的 Linux 伺服器上安裝 Docker。另外你也可以使用 Podman 執行本映像,需要先為 docker 命令建立一個別名。
進階使用者可以在 macOS 上透過安裝 Docker for Mac 使用本映像。在使用 IPsec/L2TP 模式之前,你可能需要執行 docker restart ipsec-vpn-server 重新啟動一次 Docker 容器。本映像不支援 Docker for Windows。
預先建構的可信任映像可在 Docker Hub registry 下載:
docker pull hwdsl2/ipsec-vpn-server
或者,你也可以從 Quay.io 下載:
docker pull quay.io/hwdsl2/ipsec-vpn-server
docker image tag quay.io/hwdsl2/ipsec-vpn-server hwdsl2/ipsec-vpn-server
支援以下架構系統:linux/amd64、linux/arm64 和 linux/arm/v7。
進階使用者可以自行從 GitHub 編譯原始碼。
有兩個預先建構的映像可用。預設的基於 Alpine 的映像大小僅約 ~19 MB。
| 基於 Alpine | 基於 Debian | |
|---|---|---|
| 映像名稱 | hwdsl2/ipsec-vpn-server | hwdsl2/ipsec-vpn-server:debian |
| 壓縮後大小 | ~ 19 MB | ~ 62 MB |
| 基礎映像 | Alpine Linux 3.23 | Debian Linux 12 |
| 系統架構 | amd64, arm64, arm/v7 | amd64, arm64, arm/v7 |
| Libreswan 版本 | 5.3 | 5.3 |
| IPsec/L2TP | ✅ | ✅ |
| Cisco IPsec | ✅ | ✅ |
| IKEv2 | ✅ | ✅ |
註: 若要使用基於 Debian 的映像,請將本自述文件中所有的 hwdsl2/ipsec-vpn-server 替換為 hwdsl2/ipsec-vpn-server:debian。這些映像目前與 Synology NAS 系統不相容。
我需要使用較舊版本的 Libreswan 版本 4。
一般建議使用最新的 Libreswan 版本 5,它是本專案的預設版本。不過,如果你想要使用較舊版本的 Libreswan 版本 4,你可以從原始碼建構 Docker 映像:
git clone https://github.com/hwdsl2/docker-ipsec-vpn-server
cd docker-ipsec-vpn-server
# Specify Libreswan version 4
sed -i 's/SWAN_VER=5\..*/SWAN_VER=4.15/' Dockerfile Dockerfile.debian
# To build Alpine-based image
docker build -t hwdsl2/ipsec-vpn-server .
# To build Debian-based image
docker build -f Dockerfile.debian -t hwdsl2/ipsec-vpn-server:debian .
註: 所有這些變數對於本映像都是可選的,也就是說即使不定義它們也可以架設 IPsec VPN 伺服器。你可以執行 touch vpn.env 建立一個空的 env 檔案,然後跳到下一節。
此 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
以上變數僅適用於 IPsec/L2TP 和 IPsec/XAuth("Cisco IPsec")模式。對於 IKEv2,請參見設定並使用 IKEv2 VPN。
註: 在你的 env 檔案中,不要為變數值加入 "" 或 '',或在 = 兩側加入空格。不要在值中使用這些字元: \ " '。一個安全的 IPsec PSK 應至少包含 20 個隨機字元。
註: 如果在建立 Docker 容器後修改 env 檔案,則必須刪除並重新建立容器才能讓變更生效。請參見更新 Docker 映像。
進階使用者可以指定一個網域名稱、客戶端名稱和/或其他 DNS 伺服器。這是可選的。
了解如何指定一個網域名稱、客戶端名稱和/或其他 DNS 伺服器。
進階使用者可以指定一個網域名稱作為 IKEv2 伺服器位址。這是可選的。該網域名稱必須是完整網域名稱 (FQDN)。示例如下:
VPN_DNS_NAME=vpn.example.com
你可以指定第一個 IKEv2 客戶端的名稱。該名稱不能包含空格或除 - _ 之外的任何特殊字元。如果未指定,則使用預設值 vpnclient。
VPN_CLIENT_NAME=your_client_name
在 VPN 已連線時,客戶端預設設定為使用 Google Public DNS。你可以為所有 VPN 模式指定其他 DNS 伺服器。示例如下:
VPN_DNS_SRV1=1.1.1.1
VPN_DNS_SRV2=1.0.0.1
有關詳細資訊以及一些常見的公共 DNS 提供商列表,請參見使用其他 DNS 伺服器。
預設情況下,匯入 IKEv2 客戶端設定時不需要密碼。你可以選擇使用隨機密碼保護客戶端設定檔。
VPN_PROTECT_CONFIG=yes
註: 如果在 Docker 容器中已經設定 IKEv2,則以上變數對 IKEv2 模式無效。在這種情況下,你可以移除 IKEv2 並使用自訂選項重新設定它。請參見設定並使用 IKEv2 VPN。
使用本映像建立一個新的 Docker 容器(將 ./vpn.env 替換為你自己的 env 檔案):
docker run \
--name ipsec-vpn-server \
--env-file ./vpn.env \
--restart=always \
-v ikev2-vpn-data:/etc/ipsec.d \
-v /lib/modules:/lib/modules:ro \
-p 500:500/udp \
-p 4500:4500/udp \
-d --privileged \
hwdsl2/ipsec-vpn-server
在此命令中,我們使用 docker run 的 -v 選項來建立一個名為 ikev2-vpn-data 的新 Docker 卷,並將它掛載到容器內的 /etc/ipsec.d 目錄下。IKEv2 的相關資料(例如憑證與金鑰)會保存在該卷中,之後當你需要重新建立 Docker 容器時,只需指定同一個卷。
建議在使用本映像時啟用 IKEv2。如果你不想啟用 IKEv2,而只使用 IPsec/L2TP 和 IPsec/XAuth("Cisco IPsec")模式連線到 VPN,可以移除上面 docker run 命令中的第一個 -v 選項。
註: 進階使用者也可以在不啟用 privileged 模式下執行。
如果你在上述 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密碼
命令輸出中也會包含 IKEv2 設定資訊(如果已啟用)。
(可選步驟)將自動生成的 VPN 登入資訊(如果有)備份到目前目錄:
docker cp ipsec-vpn-server:/etc/ipsec.d/vpn-gen.env ./
其他語言版本: English, 简体中文, 繁體中文, Русский。
設定你的電腦或其他裝置使用 VPN。請參見以下連結(簡體中文):
設定 IPsec/XAuth ("Cisco IPsec") VPN 客戶端
閱讀 📖 VPN book 以存取額外內容。
開始使用自己的專屬 VPN! ✨🎉🚀✨
Windows 使用者 對於 IPsec/L2TP 模式,在首次連線之前需要修改登錄檔,以解決 VPN 伺服器或客戶端與 NAT(例如家用路由器)的相容問題。
同一個 VPN 帳戶可以在你的多個裝置上使用。但由於 IPsec/L2TP 的限制,如果需要連線到同一個 NAT(例如家用路由器)後面的多個裝置,你必須使用 IKEv2 或 IPsec/XAuth 模式。
如需新增、修改或刪除 VPN 使用者帳戶,請先更新你的 env 檔案,然後必須依照下一節的說明刪除並重新建立 Docker 容器。進階使用者可以綁定掛載 env 檔案。
對於有外部防火牆的伺服器(例如 EC2/GCE),請為 VPN 開啟 UDP 連接埠 500 和 4500。阿里雲使用者請參見 #433。
在 VPN 已連線時,客戶端設定為使用 Google Public DNS。如果偏好其他的網域解析服務,請參見這裡。
cp vpn.env.example vpn.env
# 如果需要,編輯 vpn.env,然後:
docker compose up -d
docker logs ipsec-vpn-server範例 docker-compose.yml(已包含在內):
version: '3'
volumes:
ikev2-vpn-data:
services:
vpn:
image: hwdsl2/ipsec-vpn-server
restart: always
env_file:
- ./vpn.env
ports:
- "500:500/udp"
- "4500:4500/udp"
privileged: true
hostname: ipsec-vpn-server
container_name: ipsec-vpn-server
volumes:
- ikev2-vpn-data:/etc/ipsec.d
- /lib/modules:/lib/modules:ro要更新 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。最後依照如何使用本映像的說明重新建立它。
IKEv2 模式是比 IPsec/L2TP 和 IPsec/XAuth("Cisco IPsec")更好的連線模式,該模式不需要 IPsec PSK、使用者名稱或密碼。更多資訊請參見這裡。
首先,查看容器的日誌以取得 IKEv2 設定資訊:
docker logs ipsec-vpn-server註: 如果你找不到 IKEv2 設定資訊,IKEv2 可能未在容器中啟用。請嘗試依照更新 Docker 映像一節的說明更新 Docker 映像與容器。
在 IKEv2 安裝過程中會建立一個 IKEv2 客戶端(預設名稱為 vpnclient),並將其設定匯出到 容器內 的 /etc/ipsec.d 目錄下。你可以將設定檔複製到 Docker 主機:
# 查看容器內的 /etc/ipsec.d 目錄檔案
docker exec -it ipsec-vpn-server ls -l /etc/ipsec.d
# 範例:將一個客戶端設定檔從容器複製到 Docker 主機目前目錄
docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.p12 ./下一步: 設定你的裝置以使用 IKEv2 VPN。
了解如何管理 IKEv2 客戶端。
你可以使用輔助腳本管理 IKEv2 客戶端。示例如下。如需自訂客戶端選項,可以在不加入參數的情況下執行腳本。
# 新增一個客戶端(使用預設選項)
docker exec -it ipsec-vpn-server ikev2.sh --addclient [client name]
# 匯出一個已有客戶端的設定
docker exec -it ipsec-vpn-server ikev2.sh --exportclient [client name]
# 列出已有的客戶端
docker exec -it ipsec-vpn-server ikev2.sh --listclients
# 顯示使用說明
docker exec -it ipsec-vpn-server ikev2.sh -h註: 如果你遇到錯誤 "executable file not found",將上面的 ikev2.sh 改成 /opt/src/ikev2.sh。
了解如何更改 IKEv2 伺服器位址。
在某些情況下,你可能需要更改 IKEv2 伺服器位址。例如切換為使用網域名稱,或是在伺服器 IP 變更之後。要更改 IKEv2 伺服器位址,請先在容器中執行 Bash shell,然後依照這裡的說明操作。請注意,在你重新啟動 Docker 容器之前,容器日誌不會顯示新的 IKEv2 伺服器位址。
移除 IKEv2 並使用自訂選項重新設定。
在某些情況下,你可能需要移除 IKEv2 並使用自訂選項重新設定它。
警告: 這將永久刪除所有 IKEv2 設定(包括憑證與金鑰),並且無法復原!
選項 1: 使用輔助腳本移除 IKEv2 並重新設定。
請注意,這將覆蓋你在 env 檔案中指定的變數,例如 VPN_DNS_NAME 和 VPN_CLIENT_NAME,而且容器日誌將不再顯示 IKEv2 的最新資訊。
# 移除 IKEv2 並刪除所有 IKEv2 設定
docker exec -it ipsec-vpn-server ikev2.sh --removeikev2
# 使用自訂選項重新設定 IKEv2
docker exec -it ipsec-vpn-server ikev2.sh選項 2: 移除 ikev2-vpn-data 並重新建立容器。
請參見進階用法(簡體中文)。
- 使用其他 DNS 伺服器
- 不啟用 privileged 模式執行
- 選擇 VPN 模式
- 存取 Docker 主機上的其他容器
- 指定 VPN 伺服器的公有 IP
- 為 VPN 客戶端指定靜態 IP
- 自訂 VPN 子網
- IPv6 支援
- VPN 分流
- 關於 host network 模式
- 啟用 Libreswan 日誌
- 查看伺服器狀態
- 從原始碼建構
- 在容器中執行 Bash shell
- 綁定掛載 env 檔案
- 部署 Google BBR 壅塞控制
需要執行以下兩個服務:Libreswan (pluto) 提供 IPsec VPN,xl2tpd 提供 L2TP 支援。
預設的 IPsec 設定支援以下協定:
- IPsec/L2TP with PSK
- IKEv1 with PSK and XAuth ("Cisco IPsec")
- IKEv2
所需連接埠:500/udp 和 4500/udp(IPsec)
註: 預先建構映像中的軟體元件(例如 Libreswan 和 xl2tpd)依其各自版權持有人所選擇的授權條款發布。對於任何預先建構映像的使用,使用者有責任確保其使用方式符合映像中所有軟體的相關授權條款。
版權所有 (C) 2016-2026 Lin Song
基於 Thomas Sarlandie 的工作(版權所有 2012)
本專案採用 Creative Commons 姓名標示-相同方式分享 3.0 授權條款。
必須署名:請在任何衍生作品中包含我的名字,並讓我知道你是如何改進它的!

