在 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
沒有留言:
張貼留言