2025年6月29日 星期日

在 Ubuntu 架設 WireGuard Server

在 Ubuntu 架設 WireGuard Server

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



前置任務

1. 必要安裝的套件

sudo apt install wireguard resolvconf iptables


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




沒有留言:

張貼留言