2025年8月15日 星期五

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

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

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

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



繼續上一篇 在 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



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

裝好就可以了