[English](README.md) | [简体中文](README-zh.md) | [繁體中文](README-zh-Hant.md) | [Русский](README-ru.md)
# Docker 上的 IPsec VPN 伺服器
[](https://github.com/hwdsl2/docker-ipsec-vpn-server/actions/workflows/main-alpine.yml) [](https://github.com/hwdsl2/docker-ipsec-vpn-server/stargazers) [](https://hub.docker.com/r/hwdsl2/ipsec-vpn-server/) [](https://hub.docker.com/r/hwdsl2/ipsec-vpn-server/)
使用此 Docker 映像快速架設 IPsec VPN 伺服器。支援 IPsec/L2TP、Cisco IPsec 和 IKEv2 協議。
本映像以 Alpine 3.23 或 Debian 12 為基礎,並使用 [Libreswan](https://libreswan.org)(IPsec VPN 軟體)和 [xl2tpd](https://github.com/xelerance/xl2tpd)(L2TP 服務程序)。
IPsec VPN 可以加密你的網路流量,以防止在透過網際網路傳送時,你與 VPN 伺服器之間的任何人未經授權存取你的資料。在使用不安全的網路時,這一點特別有用,例如在咖啡廳、機場或旅館房間。
**功能特性:**
- 首次啟動時自動產生 VPN 憑證和 IKEv2 設定
- 支援具有強大且快速加密演算法(例如 AES-GCM)的 IKEv2 模式
- 生成 VPN 設定檔以自動設定 iOS、macOS 和 Android 裝置
- 支援 Windows、macOS、iOS、Android、Chrome OS 和 Linux 客戶端
- 包含輔助腳本以管理 IKEv2 使用者與憑證
- 透過 [GitHub Actions](https://github.com/hwdsl2/docker-ipsec-vpn-server/actions/workflows/main-alpine.yml) 自動建置和發布
- 使用 Docker 卷實現資料持久化
- 多架構支援:`linux/amd64`、`linux/arm64`、`linux/arm/v7`
**另提供:**
- VPN:[IPsec 無 Docker 版](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/README-zh-Hant.md)、[WireGuard](https://github.com/hwdsl2/docker-wireguard/blob/main/README-zh-Hant.md)、[OpenVPN](https://github.com/hwdsl2/docker-openvpn/blob/main/README-zh-Hant.md)、[Headscale](https://github.com/hwdsl2/docker-headscale/blob/main/README-zh-Hant.md)
- AI:[自架 AI 套件](https://github.com/hwdsl2/self-hosted-ai-stack/blob/main/README-zh-Hant.md),用於本機 LLM、聊天、RAG、語音和 AI 工具
- 書籍:[Privacy Tools in the Age of AI](docs/vpn-book-zh-Hant.md#新privacy-tools-in-the-age-of-ai)、[架設自己的 VPN 伺服器](docs/vpn-book-zh-Hant.md#架設自己的-vpn-伺服器ipsec-vpnopenvpn-與-wireguard-實作指南)
## 快速開始
使用以下命令在 Docker 上快速架設 IPsec VPN 伺服器:
```bash
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 登入資訊](#取得-vpn-登入資訊)。
另外,你也可以在不使用 Docker 的情況下[安裝 IPsec VPN](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/README-zh-Hant.md)。若要了解更多關於如何使用本映像的資訊,請繼續閱讀以下部分。
## 社群
- 📬 [訂閱專案更新](https://selfhostedstack.beehiiv.com/subscribe?utm_campaign=vpn-zh-hant)(每月 1–2 封郵件)——獲取免費的 VPN 和 AI 部署指南(PDF,英文)
- 💬 加入 [r/selfhostedstack](https://www.reddit.com/r/selfhostedstack/) 社群,參與討論與專案展示
- ⭐ 如果你覺得本專案有用,請為儲存庫加星——這能幫助更多人發現它。
## 系統需求
- 具有公用 IP 位址或 DNS 名稱的 Linux 伺服器
- 已安裝 Docker
- 在防火牆中開啟 VPN 連接埠(UDP 500 和 4500)
- 你也可以使用 [Podman](https://docs.podman.io) 執行本映像,需要先為 `docker` 命令建立一個別名
**注:** 進階使用者可以在 macOS 上透過安裝 [Docker for Mac](https://docs.docker.com/desktop/setup/install/mac-install/) 使用本映像。在使用 IPsec/L2TP 模式之前,你可能需要執行 `docker restart ipsec-vpn-server` 重新啟動一次容器。本映像不支援 Docker for Windows。
## 下載
預先建構的可信任映像可在 [Docker Hub registry](https://hub.docker.com/r/hwdsl2/ipsec-vpn-server/) 下載:
```bash
docker pull hwdsl2/ipsec-vpn-server
```
或者,你也可以從 [Quay.io](https://quay.io/repository/hwdsl2/ipsec-vpn-server) 下載:
```bash
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 [編譯原始碼](docs/advanced-usage-zh.md#从源代码构建)。
### 映像對照表
有兩個預先建構的映像可用。預設的基於 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.2 | 5.3.2 |
| IPsec/L2TP | ✅ | ✅ |
| Cisco IPsec | ✅ | ✅ |
| IKEv2 | ✅ | ✅ |
**註:** 若要使用基於 Debian 的映像,請將本自述文件中所有的 `hwdsl2/ipsec-vpn-server` 替換為 `hwdsl2/ipsec-vpn-server:debian`。這些映像目前與 Synology NAS 系統不相容。
我需要使用較舊版本的 Libreswan 版本 4。
一般建議使用最新的 [Libreswan](https://libreswan.org/) 版本 5,它是本專案的預設版本。不過,如果你想要使用較舊版本的 Libreswan 版本 4,你可以從原始碼建構 Docker 映像:
```bash
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.env.example)):
```
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](#設定並使用-ikev2-vpn)。
**註:** 在你的 `env` 檔案中,**不要**為變數值加入 `""` 或 `''`,或在 `=` 兩側加入空格。**不要**在值中使用這些字元: `\ " '`。一個安全的 IPsec PSK 應至少包含 20 個隨機字元。
**註:** 如果在建立 Docker 容器後修改 `env` 檔案,則必須刪除並重新建立容器才能讓變更生效。請參見[更新 Docker 映像](#更新-docker-映像)。
### 其他環境變數
進階使用者可以指定一個網域名稱、客戶端名稱和/或其他 DNS 伺服器。這是可選的。
了解如何指定一個網域名稱、客戶端名稱和/或其他 DNS 伺服器。
進階使用者可以指定一個網域名稱作為 IKEv2 伺服器位址。這是可選的。該網域名稱必須是完整網域名稱 (FQDN)。示例如下:
```
VPN_DNS_NAME=vpn.example.com
```
你可以指定第一個 IKEv2 客戶端的名稱。該名稱不能包含空格或除 `-` `_` 之外的任何特殊字元。如果未指定,則使用預設值 `vpnclient`。
```
VPN_CLIENT_NAME=your_client_name
```
在 VPN 已連線時,客戶端預設設定為使用 [Google Public DNS](https://developers.google.com/speed/public-dns/)。你可以為所有 VPN 模式指定其他 DNS 伺服器。示例如下:
```
VPN_DNS_SRV1=1.1.1.1
VPN_DNS_SRV2=1.0.0.1
```
有關詳細資訊以及一些常見的公共 DNS 提供商列表,請參見[使用其他 DNS 伺服器](docs/advanced-usage-zh.md)。
預設情況下,匯入 IKEv2 客戶端設定時不需要密碼。你可以選擇使用隨機密碼保護客戶端設定檔。
```
VPN_PROTECT_CONFIG=yes
```
**註:** 如果在 Docker 容器中已經設定 IKEv2,則以上變數對 IKEv2 模式無效。在這種情況下,你可以移除 IKEv2 並使用自訂選項重新設定它。請參見[設定並使用 IKEv2 VPN](#設定並使用-ikev2-vpn)。
### 執行 IPsec VPN 伺服器
使用本映像建立一個新的 Docker 容器(將 `./vpn.env` 替換為你自己的 `env` 檔案):
```bash
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 卷](https://docs.docker.com/storage/volumes/),並將它掛載到容器內的 `/etc/ipsec.d` 目錄下。IKEv2 的相關資料(例如憑證與金鑰)會保存在該卷中,之後當你需要重新建立 Docker 容器時,只需指定同一個卷。
建議在使用本映像時啟用 IKEv2。如果你不想啟用 IKEv2,而只使用 IPsec/L2TP 和 IPsec/XAuth("Cisco IPsec")模式連線到 VPN,可以移除上面 `docker run` 命令中的第一個 `-v` 選項。
**註:** 進階使用者也可以[在不啟用 privileged 模式下執行](docs/advanced-usage-zh.md#不启用-privileged-模式运行)。
### 取得 VPN 登入資訊
如果你在上述 `docker run` 命令中沒有指定 `env` 檔案,`VPN_USER` 會預設為 `vpnuser`,並且 `VPN_IPSEC_PSK` 和 `VPN_PASSWORD` 會自動隨機生成。要取得這些登入資訊,可以查看容器的日誌:
```bash
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 登入資訊(如果有)備份到目前目錄:
```bash
docker cp ipsec-vpn-server:/etc/ipsec.d/vpn-gen.env ./
```
## 使用 docker-compose
```bash
cp vpn.env.example vpn.env
# 如果需要,編輯 vpn.env,然後:
docker compose up -d
docker logs ipsec-vpn-server
```
範例 `docker-compose.yml`(已包含在內):
```yaml
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
```
## 下一步
*其他語言版本: [English](README.md#next-steps), [简体中文](README-zh.md#下一步), [繁體中文](README-zh-Hant.md#下一步), [Русский](README-ru.md#следующие-шаги)。*
設定你的電腦或其他裝置使用 VPN。請參見以下連結(簡體中文):
**[設定並使用 IKEv2 VPN(推薦)](#設定並使用-ikev2-vpn)**
**[設定 IPsec/L2TP VPN 客戶端](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md)**
**[設定 IPsec/XAuth ("Cisco IPsec") VPN 客戶端](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-xauth-zh.md)**
**閱讀 [:book: VPN book](docs/vpn-book-zh-Hant.md) 以存取[額外內容](https://ko-fi.com/post/Support-this-project-and-get-access-to-supporter-o-X8X5FVFZC)。**
開始使用自己的專屬 VPN! :sparkles::tada::rocket::sparkles:
## 重要提示
**Windows 使用者** 對於 IPsec/L2TP 模式,在首次連線之前需要[修改登錄檔](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md#windows-错误-809),以解決 VPN 伺服器或客戶端與 NAT(例如家用路由器)的相容問題。
同一個 VPN 帳戶可以在你的多個裝置上使用。但由於 IPsec/L2TP 的限制,如果需要連線到同一個 NAT(例如家用路由器)後面的多個裝置,你必須使用 [IKEv2](#設定並使用-ikev2-vpn) 或 [IPsec/XAuth](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-xauth-zh.md) 模式。
如需新增、修改或刪除 VPN 使用者帳戶,請先更新你的 `env` 檔案,然後必須依照[下一節](#更新-docker-映像)的說明刪除並重新建立 Docker 容器。進階使用者可以[綁定掛載](docs/advanced-usage-zh.md#绑定挂载-env-文件) `env` 檔案。
對於有外部防火牆的伺服器(例如 [EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html)/[GCE](https://cloud.google.com/vpc/docs/firewalls)),請為 VPN 開啟 UDP 連接埠 500 和 4500。阿里雲使用者請參見 [#433](https://github.com/hwdsl2/setup-ipsec-vpn/issues/433)。
在 VPN 已連線時,客戶端設定為使用 [Google Public DNS](https://developers.google.com/speed/public-dns/)。如果偏好其他的網域解析服務,請參見[這裡](docs/advanced-usage-zh.md#使用其他的-dns-服务器)。
## 更新 Docker 映像
要更新 Docker 映像與容器,請先[下載](#下載)最新版本:
```bash
docker pull hwdsl2/ipsec-vpn-server
```
如果 Docker 映像已經是最新版本,你會看到提示:
```
Status: Image is up to date for hwdsl2/ipsec-vpn-server:latest
```
否則將會下載最新版本。要更新你的 Docker 容器,請先記下所有的 [VPN 登入資訊](#取得-vpn-登入資訊)。然後刪除 Docker 容器:`docker rm -f ipsec-vpn-server`。最後依照[如何使用本映像](#如何使用本映像)的說明重新建立它。
## 設定並使用 IKEv2 VPN
IKEv2 模式是比 IPsec/L2TP 和 IPsec/XAuth("Cisco IPsec")更好的連線模式,該模式不需要 IPsec PSK、使用者名稱或密碼。更多資訊請參見[這裡](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto-zh.md)。
首先,查看容器的日誌以取得 IKEv2 設定資訊:
```bash
docker logs ipsec-vpn-server
```
**註:** 如果你找不到 IKEv2 設定資訊,IKEv2 可能未在容器中啟用。請嘗試依照[更新 Docker 映像](#更新-docker-映像)一節的說明更新 Docker 映像與容器。
在 IKEv2 安裝過程中會建立一個 IKEv2 客戶端(預設名稱為 `vpnclient`),並將其設定匯出到 **容器內** 的 `/etc/ipsec.d` 目錄下。你可以將設定檔複製到 Docker 主機:
```bash
# 查看容器內的 /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 ./
```
**下一步:** [設定你的裝置](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto-zh.md)以使用 IKEv2 VPN。
了解如何管理 IKEv2 客戶端。
你可以使用輔助腳本管理 IKEv2 客戶端。示例如下。如需自訂客戶端選項,可以在不加入參數的情況下執行腳本。
```bash
# 新增一個客戶端(使用預設選項)
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](docs/advanced-usage-zh.md#在容器中运行-bash-shell),然後[依照這裡的說明操作](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto-zh.md#更改-ikev2-服务器地址)。請注意,在你重新啟動 Docker 容器之前,容器日誌不會顯示新的 IKEv2 伺服器位址。
移除 IKEv2 並使用自訂選項重新設定。
在某些情況下,你可能需要移除 IKEv2 並使用自訂選項重新設定它。
**警告:** 這將**永久刪除**所有 IKEv2 設定(包括憑證與金鑰),並且**無法復原**!
**選項 1:** 使用輔助腳本移除 IKEv2 並重新設定。
請注意,這將覆蓋你在 `env` 檔案中指定的變數,例如 `VPN_DNS_NAME` 和 `VPN_CLIENT_NAME`,而且容器日誌將不再顯示 IKEv2 的最新資訊。
```bash
# 移除 IKEv2 並刪除所有 IKEv2 設定
docker exec -it ipsec-vpn-server ikev2.sh --removeikev2
# 使用自訂選項重新設定 IKEv2
docker exec -it ipsec-vpn-server ikev2.sh
```
**選項 2:** 移除 `ikev2-vpn-data` 並重新建立容器。
1. 在紙上記下所有的 [VPN 登入資訊](#取得-vpn-登入資訊)。
1. 刪除 Docker 容器:`docker rm -f ipsec-vpn-server`。
1. 刪除 `ikev2-vpn-data` 卷:`docker volume rm ikev2-vpn-data`。
1. 更新你的 `env` 檔案並加入自訂 IKEv2 選項,例如 `VPN_DNS_NAME` 和 `VPN_CLIENT_NAME`,然後重新建立容器。請參見[如何使用本映像](#如何使用本映像)。
## 進階用法
請參見[進階用法(簡體中文)](docs/advanced-usage-zh.md)。
- [使用其他 DNS 伺服器](docs/advanced-usage-zh.md#使用其他的-dns-服务器)
- [不啟用 privileged 模式執行](docs/advanced-usage-zh.md#不启用-privileged-模式运行)
- [選擇 VPN 模式](docs/advanced-usage-zh.md#选择-vpn-模式)
- [啟用 IKEv2 前向保密](docs/advanced-usage-zh.md#启用-ikev2-前向保密)
- [存取 Docker 主機上的其他容器](docs/advanced-usage-zh.md#访问-docker-主机上的其它容器)
- [指定 VPN 伺服器的公有 IP](docs/advanced-usage-zh.md#指定-vpn-服务器的公有-ip)
- [為 VPN 客戶端指定靜態 IP](docs/advanced-usage-zh.md#为-vpn-客户端指定静态-ip)
- [自訂 VPN 子網](docs/advanced-usage-zh.md#自定义-vpn-子网)
- [IPv6 支援](docs/advanced-usage-zh.md#ipv6-支持)
- [VPN 分流](docs/advanced-usage-zh.md#vpn-分流)
- [關於 host network 模式](docs/advanced-usage-zh.md#关于-host-network-模式)
- [啟用 Libreswan 日誌](docs/advanced-usage-zh.md#启用-libreswan-日志)
- [查看伺服器狀態](docs/advanced-usage-zh.md#查看服务器状态)
- [從原始碼建構](docs/advanced-usage-zh.md#从源代码构建)
- [在容器中執行 Bash shell](docs/advanced-usage-zh.md#在容器中运行-bash-shell)
- [綁定掛載 env 檔案](docs/advanced-usage-zh.md#绑定挂载-env-文件)
- [部署 Google BBR 壅塞控制](docs/advanced-usage-zh.md#部署-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](https://github.com/hwdsl2) [](https://www.linkedin.com/in/linsongui)
基於 [Thomas Sarlandie 的工作](https://github.com/sarfata/voodooprivacy)(版權所有 2012)
[](http://creativecommons.org/licenses/by-sa/3.0/)
本專案採用 [Creative Commons 姓名標示-相同方式分享 3.0](http://creativecommons.org/licenses/by-sa/3.0/) 授權條款。
必須署名:請在任何衍生作品中包含我的名字,並讓我知道你是如何改進它的!