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



2025年7月30日 星期三

ASUS 路由器如何建立 TAP模式的 OpenVPN Server

ASUS 路由器如何建立 TAP模式的 OpenVPN Server

這裡好像有坑搞了好一陣子,預設的狀態下建立 TAP 連接會錯誤,不知道是bug還是怎樣,這可真的坑人

為什麼堅持 TAP 是因為它可以等校於你把實際把網線差到路由器上一樣


兩項必要的設定

  • 使用IPv4連接
  • 從 Server 端推送 gateway

1. 使用IPv6連接

預設的情況下 OpenVPN 是支援6的,而華碩的路由器也支援6,但是華碩的 OpenVPN Server 疑似不支援用 6 連入,解法有兩個擇1就可以

  1. 手動把輸出的 OpenVPN 設定檔中的 ddns 域名改成 IPv4,因為如果是 domain.asusddns.com 這個是有包含 IPv6 的,然後 6 會優先於 4 導致出問題了

  2. 第二個能下手的地方是 OpenVPN 會建立一個虛擬網卡,就對那個網卡右鍵內容,把 IPv6 關閉,這樣就沒事了

第一個會比較好,至少你用 4 連入但是出網可以用 6 出去,缺點就是失去 ddns 得搞個固定 IP 才行


2. 從 Server 端推送 gateway

我一直吃到一個錯誤是

OpenVPN ROUTE: failed to parse/resolve route for host/network: 192.168.50.1


試了很多辦法最是直接在路由器中有個可以自訂指令的地方推送 gateway

push "route-gateway 192.168.50.1"



設定完成之後會吃到另一個錯誤

ROUTE: route addition failed using service: ʫ¥Ӥw¸g¦s¦b¡C   [status=5010 if_index=17]

但這個比起第一個就不是致命的了,能正常連線只是會跳推送重複路由的警告而已




2025年7月15日 星期二

在 gcp 中設置防火牆僅特定IP能訪問

在 gcp 中設置防火牆僅特定IP能訪問


防火牆的設置在這裡
防火牆政策 – 網路安全性 – Google Cloud 控制台




關閉預設的 rdp 與 ssh 連接埠

進來之後預設有這些東西



其中下面兩個 rdp 與 ssh 預設是套用到所有機器上的,也就是這兩個 port 會是開放的,主要是怕新手不會設置開局即卡關吧

建議這兩個是把他關掉比較好,點擊後進入設定畫面,上面點擊編輯



進入編輯頁面後最下方選擇停用,再來按儲存即可,兩個都要點。





新增管理者的白名單IP

下一步新增我們自己電腦的IP,回到主頁面點擊建立防火牆規則



然後名稱打上 admin-allow 表示管理者用的意思



然後網路優先順序填預設的 1000 就好



目標標記填上 admin-allow 這裡表示規則的 tag 到時候要把這個填到虛擬機中
來源 IPv4 填上 192.168.1.1/32 這裡自己替換成你的 IP



通訊協定和通訊埠設定成全部允許



最後按下儲存,這樣一來根據這個規則你的IP就有完全的權限了



在 vm 中套用該防火牆原則

到執行個體中
Compute Engine – Google Cloud 控制台

點擊你的vm進入該個體畫面,然後點擊上方編輯



找到防火牆的欄位,有個網路標記把剛剛的 tag 打上去,上面的 http/https 分別是 80/443 自己看情況開就好



然後儲存即可,如此一來設定就生效了



順帶一提如果要設架 vpn 在一開始創建 vm 的時候就要打勾 ip 轉發,這個沒勾就沒救了,無法事後更改

最後記得確認一下有沒有綁定該 vm 的 IP 為靜態,不然預設狀態是浮動的關閉機器之後會被釋放掉重新拿一個

設定的網址在這裡 IP 位址 – 虛擬私有雲網路 – Google Cloud 控制台





2025年7月14日 星期一

在 gcp 中安裝監控代理軟體

在 gcp 中安裝監控代理軟體

控制台在這裡可以看你註冊的 gcp 目前系統狀況如何
VM 執行個體 – 監控 – Google Cloud 控制台

不過剛裝好是有缺套件的,必須要手動安裝才能正常監控到所有信息

關的安裝指令
在個別 VM 中安裝作業套件代理程式 | Google Cloud Observability

這邊抄過來是這個指令


curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh sudo bash add-google-cloud-ops-agent-repo.sh --also-install

裝好就可以了


2025年6月30日 星期一

在 Ubuntu 中創建 WireProxy 代理伺服器

在 Ubuntu 中創建 WireProxy 代理伺服器

以下的本篇文章是直接在系統中架設,如果不想影響當前系統可以用 docker 隔離,參考另一篇 CHG: 在 docker 中創建 WireProxy 代理伺服器



前幾天自己做了個 wireguard client + sock5 的伺服器跳轉 IP,雖然是做成了不過就是管理兩個關聯服務麻煩,以及我不希望本機被跳轉

簡單說就是連上 wg1 不跳轉 ip,但是由 sock5 進來的流量經過 wg1 要跳轉 ip 的需求,本來手動搞了一下兩個辦法

一個是用 NameSpace 隔離,另一個是打 tag 在封裝上,研究了一下沒弄成,找而問 AI 有沒有人幹過這事?

結果還真有這事google解了,並且有用go寫成函式庫,然後有人用這個庫把他寫成一個軟體了
whyvl/wireproxy: Wireguard client that exposes itself as a socks5 proxy

那就開始安裝吧,開始前記得注意 sock5 是沒加密的別公開到外網上

順帶一提這個方法可以在 Windwos WSL1 或 WSL2 中運行,手邊沒機器可以先用WSL來跑


如果需要再docker中運行參考這篇 (建議跑docker省事好管理)
CHG: 在 docker 中創建 WireProxy 代理伺服器




安裝 WireProxy

從官方下載編譯好的檔案並複製到指定位置

下載 64位元版本 (Releases · whyvl/wireproxy)

curl https://raw.githubusercontent.com/pufferffish/wireproxy/master/systemd/wireproxy.service | sudo tee /etc/systemd/system/wireproxy.service

解壓縮並安裝

sudo mkdir -p /opt/wireproxy
sudo tar -xzf /tmp/wireproxy_linux_amd64.tar.gz -C /opt/wireproxy
sudo chmod +x /opt/wireproxy/wireproxy
sudo ln -s /opt/wireproxy/wireproxy /usr/local/bin/wireproxy

檢查是否可用

wireproxy --version

有出現版本就可以了



設置檔案

新增設定檔

sudo nano /etc/wireproxy.conf

設定檔內容 (內容其實就是 wg client 的內容加上 sock5)

# WireGuard Interface 設定
[Interface]
Address = 10.6.0.2/32
PrivateKey = ${:YOUR_PRIVATE_KEY_HERE}
DNS = 8.8.8.8

# WireGuard Peer 設定
[Peer]
PublicKey = ${:YOUR_PUBLIC_KEY_HERE}
Endpoint = ${:IPv4}:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

# SOCKS5 代理設定
[Socks5]
BindAddress = 0.0.0.0:1080

更改權限

sudo chmod 600 /etc/wireproxy.conf
sudo chown root:root /etc/wireproxy.conf

測試conf檔案設置是否正確

sudo wireproxy -c /etc/wireproxy.conf -n

前台運行測試

sudo wireproxy -c /etc/wireproxy.conf

能運行應該就沒問題了



設置開機自動啟動

創建 systemd 服務

curl raw.githubusercontent.com/pufferffish/wireproxy/master/systemd/wireproxy.service | sudo tee /etc/systemd/system/wireproxy.service 
這份檔案是原作提供的 wireproxy/systemd at master · whyvl/wireproxy 

發生一個意外這個配置在 pi5 上不能跑,姑且是找到問題了,可以參考這篇文章


啟動服務

# 重新載入 systemd
sudo systemctl daemon-reload

# 啟用服務與設置開機自動啟動
sudo systemctl enable --now wireproxy.service

# 檢查服務狀態
sudo systemctl status wireproxy.service

對於 wsl1 沒有 systemctl 的解法是,在 sudo nano /etc/wsl.conf 檔案中添加,command="wireproxy -c /etc/wireproxy.conf &" 讓他開機自動啟動。如果已經有 ssh 服務掛著用 && 連接兩個命令,或是外置一個 sh 檔案代理。


本機測試一下IP是否跳轉成功

# 測試機器本身 IP
curl ipinfo.io
# 測試 SOCKS5 代理 IP
curl --socks5 localhost:1080 ipinfo.io

上面兩個會顯示出不同的IP,只有 SOCK5 會跳轉到 wg 伺服端的 IP
成功後其他電腦應該就可以利用 IP 連到這台代理了




其他

如果不想用IP連接,裝一下這個東西可以廣播主機名稱給區網電腦

sudo apt install avahi-daemon -y
sudo systemctl enable avahi-daemon
sudo systemctl start avahi-daemon

裝好之後其他主機就可以直接輸入這台電腦的名稱就能連了


如果要改設定的話

sudo nano /etc/wireproxy.conf && sudo systemctl restart wireproxy.service




撤銷該服務

如果要改用 docker 或是移除的話,要撤除可以執行這個命令

# 停止並停用服務
sudo systemctl disable --now wireproxy.service

# 移除 service 檔案
sudo rm /etc/systemd/system/wireproxy.service

# 重新載入 systemd 設定
sudo systemctl daemon-reload

# 確認是否已經移除
systemctl status wireproxy

設定檔案在 /etc/wireproxy.conf 在自己移除即可,也可以放著不用管可能哪天要用