2025年8月8日 星期五

在 ubuntu 架設靜態網站伺服器

在 ubuntu 架設靜態網站伺服器

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


安裝 docker 套件

使用官方懶人包安裝docker

curl -fsSL https://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

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




快速啟動 nginx 容器

自己寫的一個快速部屬函式

source <(curl -sL gist.githubusercontent.com/hunandy14/7dafceef67cb47db38620a3c2479792d/raw)
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

內容如下

FROM debian:bullseye-slim

# 安裝必要工具
RUN apt update && apt install -y wget tar && rm -rf /var/lib/apt/lists/*

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

# 下載並解壓縮 wireproxy 二進位檔
RUN wget https://github.com/whyvl/wireproxy/releases/download/v1.0.9/wireproxy_linux_amd64.tar.gz -O /tmp/wireproxy_linux_amd64.tar.gz && \
    tar -xzf /tmp/wireproxy_linux_amd64.tar.gz -C /opt/wireproxy && \
    chmod +x /opt/wireproxy/wireproxy && \
    ln -s /opt/wireproxy/wireproxy /usr/local/bin/wireproxy && \
    rm /tmp/wireproxy_linux_amd64.tar.gz

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

建立 Docker 映像檔

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

這個映像檔可以重複使用,只需要建立一個就足夠



步驟 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

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





2025年7月30日 星期三

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

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

這裡好像有坑搞了好一陣子,預設的狀態下建立 TAP 連接會錯誤,先說結論需要做的事情

TAP 的好處是可以等校於你把實際把網線差到路由器上一樣


兩項必要的設定

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

使用IPv6連接

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

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

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


從 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 代理伺服器

前幾天自己做了個 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來跑




安裝 WireProxy

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

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

wget -P /tmp github.com/whyvl/wireproxy/releases/download/v1.0.9/wireproxy_linux_amd64.tar.gz

解壓縮並安裝

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





2025年6月29日 星期日

在 Ubuntu 架設 WireGuard Server

在 Ubuntu 架設 WireGuard Server

這東西有一點點像 SSH 伺服器端需要兩組公鑰與私鑰互相配對,彼此握手成功才能連接。



前置任務

1. 必要安裝的套件

sudo apt install wireguard iptables 

這個 resolvconf 視情況安裝,跑WG後有跳錯再說


2. 打開 IPv4 與 IPv6 的轉發

sudo sed -i 's/^#\s*\(net\.ipv4\.ip_forward\s*=\s*1\)/\1/' /etc/sysctl.conf
sudo sed -i 's/^#\s*\(net\.ipv6\.conf\.all\.forwarding\s*=\s*1\)/\1/' /etc/sysctl.conf

看一下有沒有打開

sudo sysctl -p

預期應該要看到以下的結果

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1


3. 再來需要你在路由器中設置虛擬伺服器把這台的 51820 開放 UDP 出去外面,這個依據路由器不同設置方法不同,這裡在自行 google 做法



WireGuard 私鑰

這裡需要生成兩組私鑰來互相配對,一組當作 Sever 的一組當作 Client 端的


1. 生成私鑰

生成 wg0 與 client0 這兩組,結果保存在 /etc/wireguard/keys 裡面

# 創建資料夾
sudo mkdir -p /etc/wireguard/keys
# 伺服器端
sudo wg genkey | sudo tee /etc/wireguard/keys/wg0.key | wg pubkey | sudo tee /etc/wireguard/keys/wg0.pub >/dev/null
# 客戶端
sudo wg genkey | sudo tee /etc/wireguard/keys/client0.key | wg pubkey | sudo tee /etc/wireguard/keys/client0.pub >/dev/null

保存在keys資料夾中的私鑰不是必要的只是方便之後可以來這裡查


2. 檢視私鑰

再來檢視產生的金鑰與當前IP

# 檢視金鑰
echo "🔑 WirGard wg0 Key:"
echo "  Private Key: $(sudo cat /etc/wireguard/keys/wg0.key)"
echo "  Public  Key: $(sudo cat /etc/wireguard/keys/wg0.pub)"
echo "🔑 WirGard client0 Key:"
echo "  Private Key: $(sudo cat /etc/wireguard/keys/client0.key)"
echo "  Public  Key: $(sudo cat /etc/wireguard/keys/client0.pub)"

# 檢視當前的網卡
echo "🌐 Default Network:"
echo "    Interface: $(ip route | awk '/default/ {print $5}')"
echo "    IPv4:$(curl -4 -s ifconfig.me)"

出網的網卡自己看一下是否正確,如果預設網卡不是你出網的網卡的話。



WireGuard 設定檔案

伺服器端與客戶端個別需要一個設定檔案


1. 生成伺服端設定檔

使用下面的命令建立 wg0.conf 檔案

sudo nano /etc/wireguard/wg0.conf

檔案內容

[Interface]
Address = 10.6.0.1/24
Address = fd86:ea04:1115::1/64
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o ${:網卡名稱} -j MASQUERADE
PostUp = ip6tables -A FORWARD -i %i -j ACCEPT
PostUp = ip6tables -t nat -A POSTROUTING -o ${:網卡名稱} -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o ${:網卡名稱} -j MASQUERADE
PostDown = ip6tables -D FORWARD -i %i -j ACCEPT
PostDown = ip6tables -t nat -D POSTROUTING -o ${:網卡名稱} -j MASQUERADE
ListenPort = 51820
PrivateKey = ${:/etc/wireguard/keys/wg0.key}

[Peer]
PublicKey = ${:/etc/wireguard/keys/client0.pub}
AllowedIPs = 10.6.0.2/32, fd86:ea04:1115::2/128

要改的地方已經用 ${:} 標記起來了,照著修改即可

如果有要跑 casaos 的話 [Interface] 裡面多插一條 MTU = 1500 不然會導致凱薩跑不起來



2. 生成客戶端設定檔

使用下面的命令建立檔案 (這個不需要放在etc中這是要給客戶端用的)

nano ~/client0.conf

檔案內容

[Interface]
PrivateKey = ${:/etc/wireguard/keys/client0.key}
Address = 10.6.0.2/32, fd86:ea04:1115::2/128
DNS = 8.8.8.8, 2001:4860:4860::8888

[Peer]
PublicKey = ${:/etc/wireguard/keys/wg0.pub}
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = ${:IPv4}:51820
PersistentKeepalive = 25

要改的地方已經用 ${:} 標記起來了,照著修改即可



啟動 WireGuard 伺服器

再來就可以啟動伺服器了

sudo wg-quick up wg0

然後再把 client0.conf 複製外網機器中,試著連接看看有出現交握就表示成功了,可以從下面的網址測試IP有無成功跳轉

What Is My IP Address - See Your Public Address - IPv4 & IPv6

如果有交握但是無法上網,檢查一下 wg0.conf 中網卡名稱是不是有打錯


另外在預設狀態下 wg0 如果重新啟動前是啟動狀態,重啟之後也會是啟動狀態,但如果是關閉重啟就依然會是關閉

想要不管怎樣都會自動開啟可以打開下面的服務,確保開機自動啟動服務

sudo systemctl enable wg-quick@wg0





其他指令

啟動後要修改 wg0.conf 可以用這個

sudo wg-quick down wg0 && sudo nano /etc/wireguard/wg0.conf && sudo wg-quick up wg0


測試防火牆中的 51820埠 是否有被打通

sudo tcpdump -n -i any udp port 51820


從 pwsh 測試遠端 udp埠

function Send-UdpPacket {
    param (
        [string]$TargetIP,
        [int]$TargetPort,
        [string]$Message = "Hello"
    )
    $udpClient = New-Object System.Net.Sockets.UdpClient
    $remoteEP = New-Object System.Net.IPEndPoint ([System.Net.IPAddress]::Parse($TargetIP), $TargetPort)
    $bytes = [System.Text.Encoding]::UTF8.GetBytes($Message)
    $udpClient.Send($bytes, $bytes.Length, $remoteEP) | Out-Null
    $udpClient.Close()
} Send-UdpPacket -TargetIP "x.x.x.x" -TargetPort 51820