Debian Linux 設置 WireGuard L3 路由+NAT 連線

前言

公司目前的 DrayTek 路由器型號 不支援 WireGuard。我改在一台 Debian VM 上自建 WireGuard,帶來幾個好處:

  • 效能不再受限於 DrayTek 硬體:VM 可自行調整資源(CPU/RAM/網卡),加密吞吐量更彈性。
  • 路由規則更好控:只把特定內網(例:192.168.0.0/24192.168.10.0/24)走 VPN,不用額外在客戶端打一堆指令。
  • 維持個人上網體驗:一般上網不走公司出口,避免外部網站看到公司 IP,也不讓自己網速被公司端拖慢。
  • 相容性佳:Windows/macOS/Linux/手機端都容易配置。

目標:外部 Win11 透過 WireGuard 連入公司,能存取 192.168.0.0/24192.168.10.0/24(DrayTek 兩個 VLAN 可互通)。
做法:Layer-3 路由 + NAT;實際出口介面為 ens18


0) 伺服器環境

  • Debian 12
  • KDE Plasma

    設置 GUI 方便同事操作,會影響到網路連線的管理指令。

1) 拓樸與參數

  • WG 伺服器(Debian VM)

    • 介面:ens18
    • LAN IP:192.168.0.70/24
    • Gateway:192.168.0.251(DrayTek)
    • WG 隧道 IP:10.10.0.1/24
  • Win11 用戶端10.10.0.2/32
  • DrayTek:需 Port Forward UDP 51820 → 192.168.0.70:51820;VLAN 0/10 可路由。

1.5) 路由器/連接埠轉發(DrayTek 或你的實際路由器)

你的路由器必須把從網際網路進來的 WireGuard UDP 流量轉發到 Debian WG 伺服器。

以 DrayTek 為例(如果你用別款路由器,請做等效設定):

  • 類型: Port Forward / NAT
  • 協定: UDP
  • 外部連接埠: 51820
  • 內部主機(伺服器): 192.168.0.70
  • 內部連接埠: 51820
  • 備註: WireGuard
  • 若有 WAN 防火牆 規則,請同時允許 UDP/51820

使用其他廠牌/型號?
請做等效的動作:

  1. 建立一條 UDP 51820埠轉發,從 WAN 指向 WG 伺服器的 LAN IP(192.168.0.70)。
  2. 若路由器有獨立的防火牆頁面,新增一條允許 UDP/51820 的入站規則。
  3. 若處於 雙重 NAT(ISP 數據機 + 你的路由器),需在兩層都設定轉發,或把上游設備改成 橋接/DMZ 模式。
  4. 若 ISP 使用 CGNAT (日本常見),通常無法做入站轉發—請改用公共 IP、VPS 中繼,或請能接收入站連線的一端當 WG 伺服器。

可選(純路由、不做 NAT):
若你在 Debian 伺服器上移除 NAT,請在路由器新增靜態路由
目的: 10.10.0.0/24下一跳: 192.168.0.70


2) NetworkManager:建立 ens18(一次完成)

nmcli connection add type ethernet ifname ens18 con-name ens18 \
  ipv4.addresses 192.168.0.70/24 ipv4.gateway 192.168.0.251 \
  ipv4.dns "1.1.1.1 8.8.8.8" ipv4.method manual \
  ipv6.method ignore autoconnect yes

nmcli connection up ens18
# 驗證
ip addr show ens18
ip route get 192.168.0.251   # 應為 dev ens18 src 192.168.0.70

你已刪除 br0;不需要 bridge


3) 伺服器安裝與金鑰

apt update && apt install -y wireguard iptables tcpdump
( umask 077; wg genkey | tee /etc/wireguard/server.key | wg pubkey > /etc/wireguard/server.pub )
( umask 077; wg genpsk > /etc/wireguard/psk )   # 可選(建議)
chmod 600 /etc/wireguard/server.key /etc/wireguard/psk

4) /etc/wireguard/wg0.conf(NAT 出口 = ens18)

[Interface]
Address    = 10.10.0.1/24
ListenPort = 51820
PrivateKey = <server.key>

# 將 10.10.0.0/24 經 ens18 做 NAT
PostUp   = iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o ens18 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.10.0.0/24 -o ens18 -j MASQUERADE

# 第一台用戶端
[Peer]
PublicKey    = <client1.pub>
PresharedKey = <psk>                  # 若有
AllowedIPs   = 10.10.0.2/32

5) IP 轉送與 rp_filter

cat >/etc/sysctl.d/99-wg.conf <<'EOF'
net.ipv4.ip_forward=1
# 避免回路徑檢查丟棄 wg0→ens18 的轉送封包
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.wg0.rp_filter=0
net.ipv4.conf.ens18.rp_filter=0
EOF
sysctl --system

6) 防火牆(若有)

iptables -A INPUT -p udp --dport 51820 -j ACCEPT
iptables -A FORWARD -i wg0  -o ens18 -j ACCEPT
iptables -A FORWARD -i ens18 -o wg0  -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

7) 啟動與開機自動

wg-quick up wg0
systemctl enable wg-quick@wg0
wg show

8) Win11 用戶端 client.conf

[Interface]
PrivateKey = <client.key>
Address    = 10.10.0.2/32
DNS        = 192.168.0.251

[Peer]
PublicKey    = <server.pub>
PresharedKey = <psk>                           # 若伺服器啟用 PSK
Endpoint     = <你的公網IP或DDNS>:51820
AllowedIPs   = 10.10.0.1/32, 192.168.0.0/24, 192.168.10.0/24
PersistentKeepalive = 25

若用戶端所在網路也是 192.168.0.0/24,可先改為精確主機 /32(例如只加目標 IP),或暫用 0.0.0.0/0 驗證。


9) 驗證

Win11:

ping 10.10.0.1
ping 192.168.0.70
ping 192.168.0.251
ping 192.168.0.203
ping 192.168.10.20

伺服器(同時):

iptables -t nat -v -n -L POSTROUTING   # 應見 -o ens18 的 MASQUERADE 計數 > 0
wg show                                # 該 peer 的 rx/tx 會跳動
tcpdump -ni wg0 icmp
tcpdump -ni ens18 host 192.168.0.203 and icmp
ip route get 192.168.0.203             # 應為 dev ens18 src 192.168.0.70

10) 常見問題速解

  • 只能 ping 10.10.0.1 / 192.168.0.70 → 檢查:
    ip_forward=1rp_filter=0iptables -t nat 是否有
    -A POSTROUTING -s 10.10.0.0/24 -o ens18 -j MASQUERADE
  • Win11 沒有 192.168.0.0/24 路由AllowedIPs 未包含或本地段衝突。先用 /320.0.0.0/0 驗證。
  • 需要連 VLAN10 → 用戶端 AllowedIPs192.168.10.0/24 即可(DrayTek 會在 VLAN 間路由)。
  • 想改純路由(不 NAT) → 在 DrayTek 加:目的 10.10.0.0/24 → 下一跳 192.168.0.70,並移除 wg0 的 NAT。