如何在 Ubuntu 上安裝 WireGuard VPN 及網頁介面
揭露:本文包含聯盟連結。當您透過這些連結購買時,我可能會獲得佣金,但您不需支付額外費用。
當你連接到咖啡店的WiFi或從任何公共網路上網時,你的數據會通過你無法控制的基礎設施傳輸。任何位於你與所訪問網站之間的人都可能攔截你的數據,即使在你的家庭網路上,你的網際網路服務提供商也能看到你瀏覽的每個網站。
VPN 通過在你的裝置和你信任的伺服器之間建立加密隧道來解決這個問題。你的流量不會直接連接到互聯網,而是先通過這個安全隧道到達你的 VPN 伺服器,然後再轉發到最終目的地,因此任何監視網路的人,只會看到傳送到你 VPN 伺服器的加密數據,別無其他。
WireGuard 是一種現代的 VPN 協議,它在這方面表現得非常出色。與需要數十萬行程式碼的舊 VPN 技術不同,WireGuard 只需大約 4,000 行程式碼就能完成相同的工作,這意味著錯誤更少、性能更好,且安全審核更容易。
但重點是:雖然 WireGuard 本身很簡單,但僅透過指令列管理多個 VPN 用戶端、生成設定檔以及追蹤誰有存取權限可能會變得繁瑣,因此擁有網頁介面就很方便。
在本指南中,我們將設置一個完整的WireGuard VPN伺服器,並配備一個友好的網頁介面,讓您可以透過瀏覽器管理所有事項,例如新增設備、為行動裝置生成 QR 碼以及監控連線,而無需手動修改任何配置檔。
你需要準備的物品
在開始之前,請確認你已經擁有:
- 一台具有公共 IP 位址的 Linux 伺服器(來自 DigitalOcean、Linode 或 AWS 等供應商的 VPS 都非常適合)。
- 此伺服器上的根存取權或 sudo 權限。
- 對 SSH 的基本了解(你應該知道如何連接到你的伺服器)。
本指南假設你正在使用 Ubuntu 22.04 或 Ubuntu 24.04,但這些步驟對 Debian 及其他發行版也適用,只需做少量調整。
理解架構
在開始輸入指令之前,讓我們先花點時間了解我們正在建立的內容。
一個 WireGuard 設定由多個對等端組成——這些設備可以通過加密隧道互相通信。
在我們的情況下,我們將會有:
- 伺服器:您的 Linux 機器,擁有公共 IP 地址,作為所有設備連接的中央樞紐。
- 客戶端:您的筆電、手機、平板或任何其他想要保護的設備,每個客戶端都會有自己的加密金鑰對和設定。
- 網頁介面:一個輕量級的網頁應用程式(我們將使用 WireGuard-UI),它運行在你的伺服器上,並提供一個儀表板來管理所有事務。
當客戶端想要連接時,它會建立一個直接加密的通道到伺服器,然後伺服器會根據你的設定,將客戶端的網路流量導向互聯網,或者僅允許訪問伺服器本地網路的資源。
步驟 1:在 Ubuntu 伺服器上安裝 WireGuard
首先,讓我們確保您的系統是最新的,並使用以下指令安裝所需工具,該指令將更新您的套件列表並升級任何過時的軟體。
sudo apt update && sudo apt upgrade -y
接下來,安裝 WireGuard 本身:
sudo apt install wireguard -y
由於 WireGuard 已內建於 Linux 核心(核心 5.6 及以上版本),此指令主要用於安裝設定與管理 WireGuard 介面所需的使用者空間工具。
步驟 2:在 Ubuntu 上啟用 IP 轉發
預設情況下,Ubuntu 不會在網路介面之間轉發封包,這是一個安全功能,您的伺服器不會充當路由器,除非您明確告訴它這麼做,但對於 VPN 伺服器,我們需要這個功能。
當你的手機連接到 VPN 並嘗試訪問網站時,伺服器需要將該請求從 WireGuard 介面轉發到其公共網路介面,然後再將回應轉回來。
要永久啟用 IP 轉發,我們需要編輯一個系統配置文件:
sudo nano /etc/sysctl.conf
尋找這一行(它可能在開頭用 # 註解掉):
#net.ipv4.ip_forward=1
移除 # 來取消註解,或如果該行不存在則新增它:
net.ipv4.ip_forward=1
保存檔案,然後在不重新啟動的情況下應用更改:
sudo sysctl -p
步驟 3:為 WireGuard 配置防火牆和路由
您的 VPN 伺服器需要接受來自 WireGuard 所使用的埠的傳入連線(預設為 UDP 埠 51820)。它還需要正確地在 VPN 介面與您的公共網路介面之間路由流量。
首先,讓我們確認您的公共網路介面:
ip route | grep default
你會看到類似的輸出:
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.100 metric 100
這裡的介面名稱是 `eth0`,但在你的系統上可能不同,可能是 `ens3`、`enp0s3` 或其他類似名稱。
現在讓我們配置 ufw 防火牆(Ubuntu 的預設防火牆):
# Allow SSH (if you haven't already)
sudo ufw allow 22/tcp
# Allow WireGuard
sudo ufw allow 51820/udp
# Allow the web interface (we'll use port 5000)
sudo ufw allow 5000/tcp
接下來,我們需要新增一個 NAT(網路地址轉換)規則,告訴您的伺服器在將 VPN 流量轉發到互聯網時,將其偽裝成來源自伺服器本身。
sudo nano /etc/ufw/before.rules
將這些行添加到文件的頂部,就在標頭註釋之後,但在 *filter 行之前,並將 eth0 替換為您的實際介面名稱:
# NAT table rules for WireGuard
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
COMMIT
這意味著以下內容:
*nat:我們正在操作 NAT 表。-s 10.0.0.0/24:針對來自我們 VPN 網路的封包(10.0.0.0/24 是我們將分配給 VPN 客戶端的子網)。-o eth0:透過 eth0 介面外送。-j MASQUERADE:將來源 IP 改寫為伺服器的公共 IP。
儲存並退出,然後啟用並重新載入 UFW:
sudo ufw enable
sudo ufw reload
步驟 4:在 Ubuntu 伺服器上安裝 WireGuard-UI
現在進入有趣的部分,使用 WireGuard-UI 設置網頁介面,這是一個用 Go 語言編寫的乾淨且簡單的網頁應用程式。
首先,為 WireGuard-UI 建立一個目錄:
sudo mkdir -p /opt/wireguard-ui
cd /opt/wireguard-ui
接下來,從 GitHub 的發行頁面下載最新版本的 WireGuard-UI,但在撰寫本文時,wget 命令會獲取一個近期的穩定版本:
sudo wget https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.6.2/wireguard-ui-v0.6.2-linux-amd64.tar.gz
下載後,解壓並設置為可執行檔:
sudo tar -xzf wireguard-ui-v0.6.2-linux-amd64.tar.gz
sudo chmod +x wireguard-ui
在我們啟動介面之前,先建立一個 systemd 服務,讓它能在開機時自動運行。
sudo nano /etc/systemd/system/wireguard-ui.service
貼上這個設定:
[Unit]
Description=WireGuard UI
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/wireguard-ui
ExecStart=/opt/wireguard-ui/wireguard-ui
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
保存並退出,然後啟用並啟動服務:
sudo systemctl daemon-reload
sudo systemctl enable wireguard-ui
sudo systemctl start wireguard-ui
檢查它是否正在運行:
sudo systemctl status wireguard-ui
步驟5:存取 Wireguard-UI
打開您的網頁瀏覽器,並前往以下網址,請確保將 YOUR_SERVER_IP 替換為您伺服器的實際公共 IP 位址。
http://YOUR_SERVER_IP:5000
您會看到一個登入頁面,您可以使用以下預設憑證:
Username: admin
Password: admin
重要:登入後請立即更改這些。點擊右上角的使用者名稱,然後選擇「設定」,並更新您的密碼。
步驟 6:配置您的 WireGuard 伺服器
一旦你登入後,你將會被導向 WireGuard-UI 控制面板。要開始配置你的伺服器,點擊左側邊欄的「WireGuard 伺服器」,將介面名稱設為 10.0.0.1/24(WireGuard 預設介面),並將監聽埠設為 51820。
在 Post Up Script 欄位中,輸入:
iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
並在 Post Down Script 欄位中輸入:
iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
請務必將 eth0 替換為您實際的網路介面名稱(如果不同的話),並將 Address 設為 10.0.0.1/24,這將是伺服器的內部 VPN IP 位址。
當你點擊 套用設定 時,WireGuard 將會建立 wg0 介面、監聽 51820 埠的 VPN 連線、為你的伺服器分配 VPN IP,並設定防火牆規則以正確轉發 VPN 流量。
介面也會自動生成你的伺服器私鑰和公鑰。應用設定後,介面應顯示為 啟用,表示你的 WireGuard 伺服器已經啟動並運行中。
步驟 7:新增您的第一個 WireGuard 客戶端
現在讓我們將一個設備添加到您的 VPN,這個設備可以是您的筆記型電腦、手機或任何其他客戶端設備。在左側邊欄中,點擊「客戶端」,然後點擊「新增客戶端」。
給客戶端一個描述性的名稱,例如「我的筆記型電腦」或「iPhone」,並可以選擇性地輸入電子郵件以便將來識別該設備。點擊「自動」以自動分配下一個可用的 IP 位址(可能是 10.0.0.2)。
對於允許的 IP,輸入 0.0.0.0/0, ::/0,這可確保所有客戶端的流量都通過 VPN 路由;如果您只想訪問伺服器的內部網路,則可以改為指定該子網(例如,10.0.0.0/24)。
一切設定完成後,點擊「提交」,網頁介面將自動為此用戶端生成完整的 WireGuard 配置,包括其自己的加密金鑰對。
第 8 步:連接您的客戶端設備
現在你需要把設定檔放到你的裝置上,而 WireGuard-UI 透過提供行動裝置用的 QR 碼和電腦用的可下載設定檔,讓這個過程變得很簡單。
適用於行動裝置(手機/平板):
- 從你的應用商店安裝 WireGuard 應用程式(它適用於 iOS 和 Android)。
- 在 WireGuard-UI 網頁介面中,找到你新建立的客戶端,然後點擊 QR 碼圖示。
- 在手機上開啟 WireGuard 應用程式,點擊
「+」按鈕,選擇「從 QR 碼建立」。 - 掃描瀏覽器上顯示的 QR 碼。
- 為您的連線命名,然後點擊「建立通道」。
就這樣!切換開關以連接,您的行動裝置現在會透過您的 VPN 伺服器傳送所有流量。
桌上型電腦/筆記型電腦適用:
- 從 wireguard.com/install 安裝 WireGuard。
- 在 WireGuard-UI 介面中,點擊客戶端旁的下載圖示以下載
.conf檔案。 - 在你的電腦上打開 WireGuard 應用程式,點擊「從檔案匯入通道」,然後選擇已下載的配置檔案。
- 點擊「啟用」以連接。
第九步:測試您的 VPN
讓我們確保一切運作正常。首先,在你的 VPN 未連接的情況下,訪問 whatismyipaddress.com 並記下顯示的 IP 位址。
然後,連接到您的 WireGuard VPN 並重新整理頁面,您的 IP 位址現在應該會顯示伺服器的公共 IP,而不是您原本的 IP,以確認流量已經通過 VPN 路由。
要進一步驗證 DNS 是否正常運作,您可以在已連接的裝置上執行以下指令:
ping google.com
如果你看到回應,表示你的 VPN 正確地轉送流量。
要查看伺服器上的活動連線,請使用 SSH 登入並執行:
sudo wg show
你會看到類似的輸出:
interface: wg0
public key: [your server's public key]
private key: (hidden)
listening port: 51820
peer: [client's public key]
endpoint: [client's IP]:random_port
allowed ips: 10.0.0.2/32
latest handshake: 45 seconds ago
transfer: 2.50 MiB received, 15.23 MiB sent
這顯示您的客戶端是否已連接、最近一次與伺服器通訊的時間,以及已傳輸的資料量。
步驟 10:為 WireGuard-UI 使用 HTTPS
目前,當你透過 http://YOUR_SERVER_IP:5000 存取你的 WireGuard 網頁介面時,你的登入憑證和所有配置資料都會以純文字方式在網際網路上傳輸,任何攔截你瀏覽器與伺服器之間流量的人都可能看到你的管理員密碼,甚至可能劫持你的會話。
解決方案是將您的網頁介面放在啟用了 HTTPS 的反向代理後面。反向代理位於您的應用程式前方,處理來自客戶端的所有加密 HTTPS 連線,然後通過本地網路將請求轉發給您的應用程式,在本地網路上攔截不成問題。
我們將使用 Nginx(高效能網頁伺服器)作為反向代理,並使用 Let's Encrypt 來取得免費的 SSL 憑證,這樣你就可以透過 https://vpn.yourdomain.com 訪問你的 WireGuard 介面,而不是使用帶有 HTTP 的 IP 位址。
安裝 Nginx 網頁伺服器
首先,你需要為你的網域(https://vpn.yourdomain.com)建立一個 DNS 紀錄,將其指向你的伺服器 IP 位址,然後安裝 Nginx 網頁伺服器。
sudo apt update
sudo apt install nginx -y
安裝完成後,您可以在瀏覽器中訪問 http://vpn.yourdomain.com,您將看到預設的 Nginx 歡迎頁面,這表示 Nginx 運作正常且可以從互聯網訪問。
安裝 Certbot 以使用 Let’s Encrypt
接下來,安裝 Let’s Encrypt,這是一個提供 SSL 憑證的免費憑證頒發機構,而 certbot 是一個自動化獲取和更新這些憑證的工具。
sudo apt install certbot python3-certbot-nginx -y
python3-certbot-nginx 套件包含一個插件,可以自動為你配置 Nginx,使過程變得更加簡單。
將 Nginx 配置為反向代理
現在,讓我們建立一個 Nginx 配置,將來自 https://vpn.yourdomain.com 的請求轉發到運行在 localhost:5000 的 WireGuard-UI 應用程式。
建立一個新的設定檔案。
sudo nano /etc/nginx/sites-available/wireguard-ui
貼上此設定(將 vpn.yourdomain.com 替換為您的實際網域):
server {
listen 80;
listen [::]:80;
server_name vpn.yourdomain.com;
# This will be used by Certbot for the SSL certificate challenge
location /.well-known/acme-challenge/ {
root /var/www/html;
}
# Redirect all other HTTP traffic to HTTPS
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name vpn.yourdomain.com;
# SSL certificate paths (Certbot will fill these in)
ssl_certificate /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vpn.yourdomain.com/privkey.pem;
# Modern SSL configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Security headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
# Proxy settings
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
# WebSocket support (if WireGuard-UI uses it)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Forward real client information
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
現在透過建立符號連結來啟用此設定:
sudo ln -s /etc/nginx/sites-available/wireguard-ui /etc/nginx/sites-enabled/
測試您的 Nginx 配置是否有語法錯誤:
sudo nginx -t
你應該看看:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
如果你看到任何錯誤,請回去檢查你的配置檔是否有打字錯誤。
取得 SSL 憑證
一旦所有設定正確完成,就可以執行 certbot 指令,該指令將自動從 Let’s Encrypt 取得 SSL 憑證,並配置 Nginx 使用它。
sudo certbot --nginx -d vpn.yourdomain.com
整個過程大約需要30秒,完成後,你會看到成功訊息:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/vpn.yourdomain.com/privkey.pem
現在重新加載 Nginx 以應用所有更改:
sudo systemctl reload nginx
憑證自動續期
Let’s Encrypt 證書的有效期僅為 90 天,這是有意的設計,旨在鼓勵定期更新,並在私鑰被洩露時限制潛在的損害。
幸運的是,Certbot 在安裝時會自動設置更新計時器,您可以透過執行以下命令來確認更新服務是否已啟用:
sudo systemctl status certbot.timer
你應該會看到它顯示為活動中(運行中),這個計時器每天檢查兩次,並會自動更新任何即將在 30 天內到期的證書。
為了在不進行實際續期的情況下驗證一切是否正常運作,請執行:
sudo certbot renew –dry-run
如果測試成功完成,您的自動憑證續期將完全設定好,您不需要擔心憑證過期。
更新您的防火牆
由於我們現在是通過標準 HTTPS 端口(443)在 Nginx 上訪問 WireGuard-UI,因此我們需要在防火牆中允許這個訪問,並且可以選擇關閉對端口 5000 的直接訪問。
sudo ufw allow 443/tcp
如果你希望阻止直接訪問 5000 端口上的 WireGuard-UI(強制所有人使用 HTTPS 介面),你可以選擇刪除該規則:
sudo ufw delete allow 5000/tcp
重新加載防火牆:
sudo ufw reload
步驟 11:配置 WireGuard-UI 僅在本地主機上監聽
由於 Nginx 現在處理所有外部連線,我們應該將 WireGuard-UI 設定為僅接受來自本機的連線,這可以防止任何人直接透過 5000 端口訪問它,即使他們發現該端口已開放。
停止 WireGuard-UI 服務:
sudo systemctl stop wireguard-ui
編輯服務檔案:
sudo nano /etc/systemd/system/wireguard-ui.service
修改 ExecStart 行,使其僅綁定到本地主機:
[Unit]
Description=WireGuard UI
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/wireguard-ui
Environment="BIND_ADDRESS=127.0.0.1:5000"
ExecStart=/opt/wireguard-ui/wireguard-ui
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
保存並退出,然後重新載入 systemd 並重新啟動服務:
sudo systemctl daemon-reload
sudo systemctl start wireguard-ui
sudo systemctl status wireguard-ui
最後,打開你的瀏覽器並前往:
https://vpn.yourdomain.com
你應該能在瀏覽器的地址欄看到一個鎖頭圖示,你可以點擊鎖頭圖示來查看證書詳細資訊。你會看到它是由 Let’s Encrypt 簽發的,有效期為 90 天。
摘要
到現在為止,你已成功部署了一個功能完善的WireGuard VPN伺服器,並配備了安全的網頁管理介面。與其手動處理金鑰、配置文件和路由規則,WireGuard-UI 提供了一個簡單的儀表板來新增設備、生成二維碼以及監控活動連線。






