2025年10月1日 星期三

npm 反向代理 http 服務 cockpit (自動更新SSL)

使用 Nginx Proxy Manager(NPM)做反向代理並自動更新 SSL 憑證

這是連續的關於架設網站的系列

  1. 在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器
  2. 使用 duckdns 轉發自建的靜態網頁伺服器
  3. npm 反向代理 nginx 靜態網站 (自動更新SSL)
  4. npm 反向代理 http 服務 portainer (私簽SSL)
  5. npm 反向代理 http 服務 cockpit (自動更新SSL)



這是接續 npm 反向代理 nginx 靜態網站 (自動更新SSL) 的進階篇,前面的東西不再重複,記得先回到這篇做完才接著繼續看這裡

在上一篇已經完成網站的建制,現在要把改成一個實際的別人做的專案做練習
這裡使用 cockpit 當範例,創建一個 duck.dns 對外網域的網站

這篇跟直接反向代理 nginx 的那篇差異在於,範例用的靜態網站完全沒有安全限制所以不需要特別處理,這裡抓一個正常有安全限制的服務 cockpit 來當範例



安裝 cockpit

這個有被內建在 ubuntu 中直接用 apt 就可以安裝了

sudo apt install cockpit
sudo systemctl enable --now cockpit.socket

安裝好之後就可以用 http:\localhost:9090 直接打開了



反向代理設定注意事項

在使用 Nginx Proxy Manager 等反向代理時,需要在 cockpit.conf 中進行以下設定:

  1. AllowUnencrypted = true - 允許後端 HTTP 通訊
    由於反向代理與 Cockpit 之間通常使用未加密的 HTTP 連接,此設定讓 Cockpit 接受來自代理服務器的 HTTP 請求,而 SSL/TLS 加密則由前端代理統一處理。
  2. ProtocolHeader = X-Forwarded-Proto - 識別真實協議類型
    反向代理會通過 X-Forwarded-Proto header 告知 Cockpit 用戶端實際使用的協議(HTTPS),確保 Cockpit 生成正確的重定向 URL 並避免瀏覽器混合內容警告。
  3. Origins = https://your-domain.com - 限制跨域請求來源
    明確指定允許的域名以防止 CSRF 攻擊,切勿使用 Origins = https: 或 Origins = *,否則任何第三方網站都能向您的 Cockpit 發送請求,造成安全風險。


編輯 cockpit.conf

sudo nano /etc/cockpit/cockpit.conf

輸入以下 (第三行記得改成自己的網域)

[WebService]
AllowUnencrypted = true
ProtocolHeader = X-Forwarded-Proto
Origins = https://cockpit.yourdomain.com

然後存檔即可



npm 反向代理

這裡用上一篇已經生成的網域就好,回到 npm 的 proxy 頁面把 Forward Port 從 8081 改成 9090 即可續用。

然後再瀏覽你自己的網域 https://chgsite.duckdns.org 應該就能看見你的網站了







2025年9月28日 星期日

使用 npm 反向代理 自簽SSL 的 https 服務 (portainer)

使用 npm 反向代理 自簽SSL 的 https 服務 (portainer)

這是連續的關於架設網站的系列

  1. 在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器
  2. 使用 duckdns 轉發自建的靜態網頁伺服器
  3. npm 反向代理 nginx 靜態網站 (自動更新SSL)
  4. npm 反向代理 http 服務 portainer (私簽SSL)
  5. npm 反向代理 http 服務 cockpit (自動更新SSL)



繼上一篇 CHG: 使用 duckdns 轉發自建的靜態網頁伺服器

已經介紹了如何使用 duckdns + npm 架設靜態網站,這次實際來跑一個服務測試
這篇跑的是自簽SSL來做,由於是自簽無法公開出去需要自行加入到信任區



安裝 portainer

安裝請參考這篇文章
CHG: 在 docker 中安裝 Portainer 管理介面

非企業環境本地間的通訊就不多架一層 https 直接用 http 當作範例

只需要做到可以使用 http://localhost:9000 能看到管理介面即可


自簽SSL

建立專屬的 CA(Certificate Authority)
CHG: 利用同一個CA自簽SSL憑證

在這一步你必須產出屬於你自己的域名的簽證

例如 portainer.chg


這個只是要在內網跑的私有域名沒有要公開出去,可以完全自定義的


npm載入自簽證書

參考自上一篇
CHG: 使用 npm 反向代理內部 nginx 的靜態網站為 https


架設好 npm 之後,再來進入它的SSL管理介面


載入剛剛創建的金鑰後存檔



再來新增一個反向代理


填上剛剛創建的域名與 portainer 的連接埠 9000


在SSL分頁頁選擇剛剛建造的憑證


然後存檔就設定完畢了


瀏覽自簽網址的 portainer

再來還需要搞定兩件事情就是 dns 與 信任自簽憑證

使用管理員打開 powershell 輸入以下命令編輯 host 檔案

notepad C:\Windows\System32\drivers\etc\hosts

在最底下新增一行

127.0.0.1   portainer.chg

這裡網址改成你自己的區網IP,如果是同一臺基器用 127.0.0.1 即可

存檔之後再來找到你的憑證,對他按右鍵安裝憑證


然後選擇本機


然後選擇 “授信任的憑證授權單位”


下一步即可安裝好了

然後需要你重啟一下瀏覽器,這樣才能重新載入剛剛安裝好的憑證

再來使用 https://portainer.chg 就可以打開 portainer 管理介面了



打不開的話檢查清單看一下

  • npm 是否設置正確
    • proxy設置
    • ssl設置
  • SSL憑證是否安裝到指定位置
  • 安裝後是否重啟瀏覽器
  • 系統 Host 網域是否設置正確



在 docker 中安裝 Portainer 管理介面

在 docker 中安裝 Portainer 管理介面



要安裝有幾種方式,其中直接啟動是最快的一個指令即可啟動,缺點就是自己得筆記這個啟動命令,否則到時候忘記了更新版本時要重新部署會很麻煩。

容器要是多了每個都必須筆記每次的啟動命令就會相對的有點麻煩,這個解法有兩個

  • docker compose
  • portainer stack

兩者其實是同一種方式,都是通過 yml 來管理容器的起動。區別在於前者要自己管理 yml 位置,後者可以直接在網頁介面輸入,由 portainer 幫你管理。

由於我們安裝的是 portainer 這個變成雞生蛋的問題了,只能用 docker compose 或是直接啟動的方式部署服務。



方式1 直接啟動

第二種方式,是最簡單的直接啟動只需要貼上這一個指令集即可

docker run -d \
  -p 8000:8000 \
  -p 9000:9000 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:lts

啟動之後使用 http://localhost:9000 即可瀏覽管理介面

之後如果更新版本需要重新啟動容器的話,執行底下的命令更新映像檔

docker stop portainer
docker rm portainer
docker pull portainer/portainer-ce:lts

然後再次執行相同的啟動的命令即可




方式2 使用 docker compose

這個方式可以通過 yml 文件創建,就不用筆記啟動令命了,只需要好好管理 yml 即可。

這裡提供的管理結構如下,結構自己依照自己的需求調整即可。

# 系統級目錄結構
/srv/docker/
└── portainer/
       ├── docker-compose.yml
       ├── .env
       └── data/

用這樣方式來儲存,然後創建目錄並指定給 docker 群組

# 將使用者加入 docker 群組
sudo usermod -aG docker $USER

# 創建主目錄
sudo mkdir -p /srv/docker

# 設定目錄權限
sudo chown -R root:docker /srv/docker
sudo chmod -R 775 /srv/docker

# 設定 SGID(重要:確保新文件繼承群組權限)
sudo find /srv/docker -type d -exec chmod g+s {} \;

#  重新登入以套用群組變更
newgrp docker

再來啟動該 docker 容器

cd /srv/docker/portainer
docker compose pull
docker compose up -d

啟動之後使用 http://localhost:9000 即可瀏覽管理介面

如果需要更新版本只需要一樣的三行重新執行一次即可,用 compose 會比較簡單一些




2025年9月14日 星期日

利用 python 獲取 edge 瀏覽器的 cookies

利用 python 獲取 edge 瀏覽器的 cookies

要抓取網站資料的時候如果驗證太麻煩最簡單的做法就是登入之後直接拿瀏覽器的 cookies 來認證最快的

這邊提供一個用 python 抓 cookies 的範例代碼
hunandy14/get_edge_cookies


如果有安裝 git 可以直接同步下來

git clone https://github.com/hunandy14/get_edge_cookies.git
cd get_edge_cookies


第一次的時候先安裝一 下依賴

pip install -r requirements.txt


使用方法

python edge_cookies.py google.com


然後就可以取得該網域的 cookies 了,返回會是一個 json 的文本形式






利用同一個CA自簽SSL憑證

利用同一個CA自簽SSL憑證

為什麼要用同一個CA簽發是因為,這樣你可以在電腦裝只裝該CA的憑證即可使用該憑證簽出的任意SSL了,簡單說就是不用每個子網站都要重新裝憑證,就一個憑證可以適用全部。


創建 CA 憑證

這是我自己寫的函式庫,要看內容自行點網址連結過去

載入函式

iex "function New-RootCA {$(irm 'https://raw.githubusercontent.com/hunandy14/New-SSLCertificate/refs/heads/master/New-RootCA.ps1')}"

創建CA憑證

New-RootCA -CNName "MyCA"

執行後會在工作目錄底下產出 crt 與 key 檔案,crt 就是憑證用於安裝到電腦中



利用該憑證簽發域名

再來是簽發網站

載入函式

iex "function New-SSLCertificate {$(irm 'https://raw.githubusercontent.com/hunandy14/New-SSLCertificate/refs/heads/master/New-SSLCertificate.ps1')}"

簽發網站

New-SSLCertificate "MyCA" -CN "*.mysite.com"

執行完畢憑證就出來了,把他丟到服務中就能使用了








2025年8月20日 星期三

從 PowerShell 下載需要登入帳號的 HTML 內容

從 PowerShell 下載需要登入帳號的 HTML 內容

這邊我是直接偷瀏覽器來 cookies 來用,最快的辦法是下載插件可以直接導出 json 檔案,導出之後再用下面的函式就可以載內容了

餅乾編輯器隨意找一個都行,這邊我用的是 Cookie-Editor - Chrome 線上應用程式商店


代碼

& { param($url, $outputPath = 'site.html', $cookiesPath = 'cookies.json', $encoding = 'utf8') 
    (Invoke-WebRequest -Uri $url -Headers @{ 
        'Cookie' = (Get-Content $cookiesPath | ConvertFrom-Json | ForEach-Object { $_.name+'='+$_.value }) -join '; '
    }).Content | Set-Content $outputPath -Encoding $encoding 
} "YourURL"

這裡我直接用了匿名函式,需要重複執行直接在前面加上 function FuncName 就能用了


導出的餅乾記得儲存在 cookies.json 如果要改位置在自行輸入位置即可,輸出的檔案是 site.html


2025年8月15日 星期五

使用 npm 反向代理內部 nginx 的靜態網站為 https

使用 npm 反向代理內部 nginx 的靜態網站為 https

這是連續的關於架設網站的系列

  1. 在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器
  2. 使用 duckdns 轉發自建的靜態網頁伺服器
  3. npm 反向代理 nginx 靜態網站 (自動更新SSL)
  4. npm 反向代理 http 服務 portainer (私簽SSL)
  5. npm 反向代理 http 服務 cockpit (自動更新SSL)



繼續上一篇 CHG: 使用 duckdns 轉發自建的靜態網頁伺服器 已經有一個網域可以打開了,再來是要處理 https 的安全連接



安裝 Nginx Proxy Manager

這裡用 docker 快速搭一個就可以

記得讓出 80/433 兩個端口,否則申請 Let’s Encrypt 憑證會報錯失敗

# 創建資料夾
sudo mkdir -p /srv/npm/data
sudo mkdir -p /srv/npm/letsencrypt
sudo chown -R 1000:1000 /srv/npm

#  安裝 npm
docker run -d \
  --name npm \
  --restart unless-stopped \
  -p 80:80 \
  -p 443:443 \
  -p 81:81 \
  -v /srv/npm/data:/data \
  -v /srv/npm/letsencrypt:/etc/letsencrypt \
  jc21/nginx-proxy-manager:latest

建好之後從 http://localhost:81 端口進入管理介面,預設的帳帳密碼是

  • 帳號: admin@example.com
  • 密碼: changeme

第一次進入會要求你註冊一個超級管理員帳號,弄好登入可以看到這個頁面


接下來需要你到路由器上把上一篇
CHG: 在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器

原本
真實IP:80 轉發到 192.168.3.92:8081

*這部分改成
真實IP:80 轉發到 192.168.3.92:80

*再來追加一條
真實IP:433 轉發到 192.168.3.92:433


這裡的 80/433 是剛剛建立的 Nginx Proxy Manager 服務
接下來將經由 npm 反向代理到內部的 8081 靜態網站
81是管理介面不要對外開放避免發生安全問題,保持在區網內使用端口接入就好



新增一個反向代理

註冊好之後從 Proxy Hosts 中新增一個反向代理


網域填你剛剛註冊的,我這裡範例是 chgsite.duckdns.org
IP填 172.17.0.1 這是 docker 的網關,因為靜態伺服器設在 docker 中
Scheme 只能填 http 就好,因為我們內部的 nginx 並沒有啟用 https
最後 port 填寫剛剛創建的 8081


然後在瀏覽器打上 http://chgsite.duckdns.org 應該就能看見你的網站了



新增對外的 SSL 憑證

這裡從簡在 NPM 中申請免費的 Let’s Encrypt 憑證就好,編輯剛剛建立的反向代理

在上方的分頁選擇 SSL 進入之後,第一個選擇申請新的 SSL 憑證


然後按下確定就會自動申請了,記得對外要打開 80 與 433,任一沒開都會報錯

申請完畢之後就可以使用 https://chgsite.duckdns.org 就能擺脫瀏覽器的安全性警告了


這樣就處理完成了,如果反向代理的服務沒有強制要求對內的部分也要加密走 https 做到這一步就足夠了



新增對內轉發的 SSL 憑證

這邊假設對內的服務強制要求 SSL ,一樣用 nginx 來做簡單模擬的,如果 nginx 強制要求必須跑在 https 模式的話該如何做






使用 duckdns 轉發自建的靜態網頁伺服器

使用 duckdns 轉發自建的靜態網頁伺服器

這是連續的關於架設網站的系列

  1. 在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器
  2. 使用 duckdns 轉發自建的靜態網頁伺服器
  3. npm 反向代理 nginx 靜態網站 (自動更新SSL)
  4. npm 反向代理 http 服務 portainer (私簽SSL)
  5. npm 反向代理 http 服務 cockpit (自動更新SSL)



接續上一篇 CHG: 在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器
已經架設好靜態網站伺服器,並且可用外部IP瀏覽網站了,這邊要去註冊一個域名來轉發自己的IP,這樣就可以不用記住數字而是記住一個域名

域名這裡用免費的方案 duckdns 服務,如果是華碩的機器內部其實也有ddns可以註冊,這是一樣的意思,只不過這裡用 duckdns 來實現



註冊 duckddns

進入該網站 https://www.duckdns.org/
選一個第三方帳號註冊,然後就可以登錄自己想要的域名了


這邊先不用考慮動態IP的問題,跑起來之後再處理就好,先直接從網站註冊能用就好
註冊好之後用下面的指令,看看剛剛註冊的網域有沒有返回你自己的IP

nslookup chgsite.duckdns.org

確認有返回正確的 IP 就是可以用了

即使 nslookup 可以查到,瀏覽器也有可能要等一段時間才能用,仍然不行的話重啟一下電腦試試看


再來就可以用該網域 http://chgsite.duckdns.org 從公網存取你的靜態網站了

確認的時候記得用手機網路試試看,不然在同一個 wifi 下路由會直接走內網,無法真的測試到外部是否能存取


再來下一篇是將他變成 https 以及處理掉結尾的 8081 直接用域名存取的教學
CHG: 使用 npm 反向代理內部 nginx 的靜態網站為 https




動態更新 duckddns

簡單說就是定期執行指令上傳IP到 duckdns 上,這樣就能處理動態IP的變動了,即使變動後依然能在第一時間更改IP位址

執行下面的指令創建一個 duckdns 這預設每5分鐘會自動更新一次

裡面的 Token 從 http://chgsite.duckdns.org 登入後會看到,網域記得要先註冊才有效

docker run -d \
  --name=duckdns \
  --net=host \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Asia/Taipei \
  -e SUBDOMAINS=<你的子網域名稱>\
  -e TOKEN=<你的Token> \
  -e UPDATE_IP=ipv4 \
  -e LOG_FILE=false \
  -v /srv/duckdns/config:/config \
  --restart unless-stopped \
  lscr.io/linuxserver/duckdns:latestv

詳細指令可以參考這邊 linuxserver/docker-duckdns


完成之後等個10秒再執行下面指令

docker logs duckdnsd


看一下倒數第三行,成功的話會是
DuckDNS request at Fri Aug 15 17:51:15 CST 2025 successful. IP(s) unchanged.

失敗的話會看到 KO





2025年8月8日 星期五

在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器

在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器

這是連續的關於架設網站的系列

  1. 在 ubuntu 使用 docker 架設 nginx 靜態網站伺服器
  2. 使用 duckdns 轉發自建的靜態網頁伺服器
  3. npm 反向代理 nginx 靜態網站 (自動更新SSL)
  4. npm 反向代理 http 服務 portainer (私簽SSL)
  5. npm 反向代理 http 服務 cockpit (自動更新SSL)



第一篇主要是要講 npm (Nginx Proxy Manager) 至於架設的東西就隨意選個最簡單的 Nginx 當範例架設一個簡易網站就好


安裝 docker 套件

使用官方懶人包安裝docker

curl -fsSL get.docker.com|sudo sh; sudo usermod -aG docker $USER


創建範例網站

建立範例網站

# 建立範例 index.html
sudo mkdir -p /srv/www/mysite.com/html
echo '<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>我的網站</title>
</head>
<body>
  <h1>歡迎來到我的 nginx 容器網站!</h1>
  <p>這是來自 /srv/www/mysite.com 的內容。</p>
</body>
</html>' | sudo tee /srv/www/mysite.com/html/index.html > /dev/null


啟動 nginx 容器

使用簡易腳本來自動創建範本

# 安裝
docker run -d \
  --name www.mysite.com \
  -v /srv/www/mysite.com/html:/usr/share/nginx/html:ro \
  -p 8081:80 \
  --restart=always \
  nginx:alpine

安裝好之後測試一下

curl http://localhost:8081

有的看到範例內容的話就完成了


檢視網站內容

網址: http://localhost:8081

直接把貼到瀏覽器上就可以看到網站內容了,如果是谷歌的機器就把 localhost 換成公開的 IP 即可,記得事後加強一下安全就好。

或是使用 Vscode 用 SSH 連入,預設會自動轉發遠端的端口到本地,一樣可以用 localhost:8081 打開遠端沒有開放的網頁。



開放端口給外部IP連接

在內布已經可以用 localhost:8081 看到網站之後再來要把你的IP公開出去,在家用的網路中通常需要再路由器中設定虛擬伺服器轉發

下面以 ASUS 的路由器為範例,這台路由器必須直接輸入 Hinet 連線帳密碼取得對外IP才有效,如果是宿舍環境無權動到最上層路由的話就不適用這個方式了

要是無權動路由器又想自架的話,一個免費的方案是用 cloudflare tunnel 突破NAT的阻擋

 

位置在
左邊::外部網路(WAN) → 頂部分頁::虛擬伺服器


進來之後打開功能並且輸入


成功之後會長這個樣子


這一整條的解讀就是把 真實IP:80 轉發到 192.168.3.92:8081 的意思

來源IP是白名單只轉發特定IP,留空就行不用限制

再來就可以在瀏覽器中輸入 http://真實IP 即可看到剛剛建造的網頁了


要註冊自己的免費域名可以參考下一篇
CHG: 使用 duckdns 轉發自建的靜態網頁伺服器



其他:: 快速啟動 nginx 容器

自己寫的一個快速部屬函式,輸入該指令可以載入函式

source <(curl -sL gist.githubusercontent.com/hunandy14/7dafceef67cb47db38620a3c2479792d/raw)

再來部署docker

run_nginx_site mysite.com 8081

就可以部署好了,預設會部署在 /srv/www/$DOMAIN/html
詳細使用說明自行點進去 gist 裡面看說明


要刪除該容器可以使用下面指令刪掉

docker stop www.mysite.com && docker rm www.mysite.com






2025年8月4日 星期一

在 docker 中創建 WireProxy 代理伺服器

在 docker 中創建 WireProxy 代理伺服器

上一篇手動創建的可以參考這裡的做法
CHG: 在 Ubuntu 中創建 WireProxy 代理伺服器

重複的如何生成設定檔等等這篇不再重複贅述,會集中在如何部署在 docker 上。會需要部署在 docker 上是因為如果有不只一個 WireProxy 通道要在 host 上跑會變得很難管理。

每次更改設定檔得重啟服務,甚至有時候只是想單獨只要關閉其中一個通道也是相當麻煩,上 docker 就很省事以上都同輕鬆管理。

在 Windows 上可以直接安裝 docker 就可以有圖形管理介面了,如果是在 linux 上可以用 portainer 這個管理套件。都不安裝也沒差純指令管理也行。


下面讓我們開始吧,記得先準備好能用的 wireporxy.conf 檔案



步驟 1:建立 Docker 映像檔

建立 Dockerfile

mkdir -p ~/docker/wireproxy
nano ~/docker/wireproxy/Dockerfile


內容如下

# 使用精簡版 Debian 作為基底
FROM debian:bullseye-slim

# 宣告版本號與目標架構
ARG WIREPROXY_VERSION=1.0.9
ARG TARGETARCH

# 安裝必要工具
RUN apt-get update && apt-get install -y --no-install-recommends \
      wget ca-certificates tar && \
    rm -rf /var/lib/apt/lists/*

# 建立工作目錄
WORKDIR /opt/wireproxy

# 根據架構選擇對應 release
RUN set -eux; \
    case "${TARGETARCH}" in \
      amd64)   PKG_ARCH=amd64 ;; \
      arm64)   PKG_ARCH=arm64 ;; \
      arm)     PKG_ARCH=arm ;; \
      386)     PKG_ARCH=386 ;; \
      mips)    PKG_ARCH=mips ;; \
      mipsle)  PKG_ARCH=mipsle ;; \
      riscv64) PKG_ARCH=riscv64 ;; \
      s390x)   PKG_ARCH=s390x ;; \
      *) echo "Unsupported arch: ${TARGETARCH}" >&2; exit 1 ;; \
    esac; \
    URL="https://github.com/whyvl/wireproxy/releases/download/v${WIREPROXY_VERSION}/wireproxy_linux_${PKG_ARCH}.tar.gz"; \
    echo "Downloading $URL"; \
    wget -O /tmp/wireproxy.tgz "$URL"; \
    tar -xzf /tmp/wireproxy.tgz -C /opt/wireproxy && \
    chmod +x /opt/wireproxy/wireproxy && \
    ln -s /opt/wireproxy/wireproxy /usr/local/bin/wireproxy && \
    rm /tmp/wireproxy.tgz

# 設定預設啟動命令
ENTRYPOINT ["wireproxy", "-c", "/etc/wireproxy.conf"]


建立 Docker 映像檔

cd ~/docker/wireproxy
docker build -t wireproxy .

這個映像檔可以重複使用,並且會自動儲存在docker中



步驟 2:執行 container

# 0. 刪除就有的docker
docker stop wireproxy
docker rm -f wireproxy

# 1. 建立 docker
docker run -d \
  --name wireproxy \
  --cap-add=NET_ADMIN \
  -p 1080:1080 \
  -v /etc/wireproxy.conf:/etc/wireproxy.conf \
  wireproxy

# 2. 設置開機自動啟動 (no|always)
docker update --restart=always wireproxy

跑完就已經啟動服務了,用下面的指令確定一下IP有無跳轉

myip() {
    echo -e "🌐 Direct  IPv4 : \033[1;33m$(curl -4 -s ifconfig.me)\033[0m"
    echo -e "🌐 Direct  IPv6 : \033[1;33m$(curl -6 -s ifconfig.me)\033[0m"
    echo -e "🧦 SOCKS5  IPv4 : \033[1;36m$(curl -4 -s --socks5 localhost:1080 ifconfig.me)\033[0m"
    echo -e "🧦 SOCKS5  IPv6 : \033[1;36m$(curl -6 -s --socks5 localhost:1080 ifconfig.me)\033[0m"
}; myip



執行多個不同代理的 container

如果要跑多個服務就是步驟2重複執行就可以,只需要更改 port 與 設定檔 即可

例如要讓 1081 對應到本機 /etc/wireproxy/wp0.conf 的話可以像以下這樣設置

docker run -d \
  --name wp0 \
  --cap-add=NET_ADMIN \
  -p 1081:1080 \
  -v /etc/wireproxy/wp0.conf:/etc/wireproxy.conf \
  wireproxy

如此一來就可以輕鬆建立對應各個伺服器的代理了,要關哪個改哪個都是獨立的,隨意輕鬆來互相不影響。






快速部署多個不同代理的 wp 容器

一個容器對應一個設定檔案,所以這邊寫了兩個快速產出設定檔與執行docker容器的函式

快速產出設定檔案

wp_conf_init() {
    local name="${1:-wp0}"
    local dir="/etc/wireproxy"
    local file="$dir/${name}.conf"
    local msg

    # 建立設定檔目錄
    sudo install -d -m 700 -o root -g root "$dir"

    # 初始化設定檔
    if sudo test -e "$file"; then
        msg="設定檔已存在,使用以下指令檢視或修改:"
    else
        # 建立模板檔案
        sudo tee "$file" > /dev/null <<'EOF'
# WireGuard 客戶端設定
# 取代這行並貼上完整wg設定檔 (包含 [Interface] 與 [Peer] 區塊)

# SOCKS5 代理設定
[Socks5]
BindAddress = 0.0.0.0:1080
EOF
        sudo chown root:root "$file"
        sudo chmod 600 "$file"
        msg="已建立設定檔,使用以下指令編輯:"
    fi

    echo "$msg sudo nano $file"

使用方式

wp_conf_init wp0

會快速幫你產好檔案,只需要再把 wirguard 設定值貼進去就好


再來處理容器的起動,這邊設定好之後執行剛剛的名稱 wp0

run_wireproxy() {
  local NAME="${1:-wireproxy}"
  local PORT="${2:-1080}"
  local CONF

  if [[ -n "$3" ]]; then
    CONF="/etc/wireproxy/$3"
  elif [[ -z "$1" ]]; then
    CONF="/etc/wireproxy.conf"
  else
    CONF="/etc/wireproxy/${NAME}.conf"
  fi

  if [[ ! -f "$CONF" ]]; then
    echo -e "\033[1;31m❌ 找不到設定檔:$CONF\033[0m"
    return 1
  fi

  docker stop "$NAME" >/dev/null 2>&1
  docker rm -f "$NAME" >/dev/null 2>&1

  echo "🚀 啟動容器:$NAME"
  echo "  🌐 主機埠 $PORT 映射至容器 1080"
  echo "  🔗 掛載設定檔 $CONF → /etc/wireproxy.conf"

  CID=$(docker run -d \
    --name "$NAME" \
    --cap-add=NET_ADMIN \
    -p "$PORT":1080 \
    -v "$CONF:/etc/wireproxy.conf" \
    wireproxy)

  if [[ $? -eq 0 && -n "$CID" ]]; then
    echo "  ✅ 成功啟動容器:$NAME"
  else
    echo "  ❌ 容器啟動失敗"
    return 1
  fi

  return 0
}

執行函式

run_wireproxy wp0

就可以把剛剛建立的設定檔跑起來了

需要開機自動啟動再自行設定: docker update --restart=always wp0