Cấu hình WireGuard Site-to-Site Mesh giữa 3 Server Vật Lý
Ý kiến
0
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Trong bài viết này mình sẽ hướng dẫn cấu hình WireGuard dạng mesh giữa 3 server vật lý để các subnet nội bộ có thể giao tiếp với nhau thông qua tunnel VPN riêng.
Mô hình này phù hợp cho:
Kết nối nhiều datacenter
Kết nối nhiều node Proxmox
Cluster Kubernetes
Đồng bộ database/private network
Quản trị nội bộ qua private IP
Node | Public IP | WG IP | LAN subnet |
|---|---|---|---|
node01 | 210.2.86.152 | 10.9.0.1 | 10.10.20.0/24 |
node02 | 210.211.108.105 | 10.9.0.2 | 10.10.200.0/24 |
node03 | 210.2.86.150 | 10.9.0.3 | 10.10.30.0/24 |
Port sử dụng:
UDP 51000
node01 <------> node02
^ ^
| |
v v
node03 <---------->
Đây là mô hình full mesh:
node01 kết nối node02 + node03
node02 kết nối node01 + node03
node03 kết nối node01 + node02
Trên Ubuntu/Debian:
apt update
apt install wireguard -y
Trên mỗi node:
mkdir -p /etc/wireguard
cd /etc/wireguard
wg genkey | tee private | wg pubkey > public
chmod 600 private
Private key:
4CElD1yr3d4yOAMst6Ox21duQiF4pPkzBR0jFnSXZUk=
Public key:
fhUR/a5NYe8FMNWxlqDLok6vA00R/ZOGNOkXfr4bxmU=
Private key:
+B7HdcAukTIX2BILi0/ECqeAhY0L0mdKcbS2CiepMFA=
Public key:
07gH1bpuarZxYyRR4TPjWcBFYxn/J3h0zxLbrRxa0wE=
Private key:
AIW2QVP0KMwU85FUq5zr6LCiCOQA53R1m9Woe5kemEA=
Public key:
JjOrCQZyJ4nsxKsOBFypGjHxigeyGT8M08QeYudnP1k=
File:
/etc/wireguard/wg0.conf
[Interface]
Address = 10.9.0.1/24
ListenPort = 51000
PrivateKey = 4CElD1yr3d4yOAMst6Ox21duQiF4pPkzBR0jFnSXZUk=
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -I FORWARD 1 -i wg0 -j ACCEPT
PostUp = iptables -I FORWARD 1 -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
[Peer]
PublicKey = 07gH1bpuarZxYyRR4TPjWcBFYxn/J3h0zxLbrRxa0wE=
AllowedIPs = 10.9.0.2/32, 10.10.200.0/24
Endpoint = 210.211.108.105:51000
PersistentKeepalive = 25
[Peer]
PublicKey = JjOrCQZyJ4nsxKsOBFypGjHxigeyGT8M08QeYudnP1k=
AllowedIPs = 10.9.0.3/32, 10.10.30.0/24
Endpoint = 210.2.86.150:51000
PersistentKeepalive = 25
[Interface]
Address = 10.9.0.2/24
ListenPort = 51000
PrivateKey = +B7HdcAukTIX2BILi0/ECqeAhY0L0mdKcbS2CiepMFA=
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -I FORWARD 1 -i wg0 -j ACCEPT
PostUp = iptables -I FORWARD 1 -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
[Peer]
PublicKey = fhUR/a5NYe8FMNWxlqDLok6vA00R/ZOGNOkXfr4bxmU=
AllowedIPs = 10.9.0.1/32, 10.10.20.0/24
Endpoint = 210.2.86.152:51000
PersistentKeepalive = 25
[Peer]
PublicKey = JjOrCQZyJ4nsxKsOBFypGjHxigeyGT8M08QeYudnP1k=
AllowedIPs = 10.9.0.3/32, 10.10.30.0/24
Endpoint = 210.2.86.150:51000
PersistentKeepalive = 25
[Interface]
Address = 10.9.0.3/24
ListenPort = 51000
PrivateKey = AIW2QVP0KMwU85FUq5zr6LCiCOQA53R1m9Woe5kemEA=
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -I FORWARD 1 -i wg0 -j ACCEPT
PostUp = iptables -I FORWARD 1 -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
[Peer]
PublicKey = fhUR/a5NYe8FMNWxlqDLok6vA00R/ZOGNOkXfr4bxmU=
AllowedIPs = 10.9.0.1/32, 10.10.20.0/24
Endpoint = 210.2.86.152:51000
PersistentKeepalive = 25
[Peer]
PublicKey = 07gH1bpuarZxYyRR4TPjWcBFYxn/J3h0zxLbrRxa0wE=
AllowedIPs = 10.9.0.2/32, 10.10.200.0/24
Endpoint = 210.211.108.105:51000
PersistentKeepalive = 25
Nếu dùng iptables:
iptables -I INPUT 1 -p udp --dport 51000 -j ACCEPT
Nếu dùng UFW:
ufw allow 51000/udp
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
systemctl enable wg-quick@wg0
systemctl restart wg-quick@wg0
wg show
Nếu thành công sẽ thấy:
latest handshake: 10 seconds ago
transfer: ...
Từ node01:
ping 10.9.0.2
ping 10.9.0.3
Một lỗi phổ biến:
RTNETLINK answers: File exists
Ví dụ:
ip -4 route add 10.10.30.0/24 dev wg0
RTNETLINK answers: File exists
Nguyên nhân:
subnet LAN bị trùng
route đã tồn tại
route local của datacenter/provider
Kiểm tra:
ip route
Nếu cần:
ip route del 10.10.30.0/24
Một lỗi rất phổ biến trên:
Proxmox VE
firewall custom
VPS hardened
Ví dụ:
iptables -S FORWARD
ra:
-P FORWARD DROP
Khi đó packet WireGuard sẽ bị reject.
Không dùng:
iptables -A FORWARD ...
Vì rule ACCEPT sẽ nằm sau reject.
Phải dùng:
iptables -I FORWARD 1 -i wg0 -j ACCEPT
iptables -I FORWARD 1 -o wg0 -j ACCEPT
Ví dụ:
ping 10.9.0.2
OK nhưng:
ping 10.10.200.104
timeout.
Nguyên nhân thường là:
thiếu route ngược
gateway LAN không biết subnet remote
Trên node02:
iptables -t nat -A POSTROUTING \
-s 10.10.20.0/24 \
-d 10.10.200.0/24 \
-j MASQUERADE
Khi đó:
máy LAN sẽ thấy packet tới từ node02
không cần thêm static route
tcpdump -ni any udp port 51000
tcpdump -i wg0 icmp
tcpdump -i vmbr1 icmp
Nguyên nhân:
firewall chặn UDP
provider block UDP
sai public key
sai endpoint
Nguyên nhân:
FORWARD DROP
thiếu route ngược
thiếu NAT
rp_filter
Nguyên nhân:
subnet overlap
route local tồn tại
Thay vì:
10.10.x.x
nên dùng:
Node | LAN |
|---|---|
node01 | 172.20.1.0/24 |
node02 | 172.20.2.0/24 |
node03 | 172.20.3.0/24 |
Sẽ ít conflict hơn với:
Docker
VMware
Proxmox
Cloud provider network
WireGuard là một giải pháp VPN cực kỳ nhẹ và hiệu năng cao để:
kết nối nhiều datacenter
tạo private backbone
route subnet giữa các site
cluster nội bộ
Điểm khó nhất thường không phải WireGuard mà là:
Linux routing
firewall FORWARD
return path
NAT vs static route
Sau khi xử lý đúng các phần này thì WireGuard hoạt động rất ổn định và gần như không cần bảo trì nhiều.
Hướng dẫn đầy đủ ssh port forwarding (-L local, -R remote, -D SOCKS) và autossh để giữ tunnel luôn sống — bao gồm các tham số quan trọng (ServerAliveInterval, ExitOnForwardFailure, GatewayPorts), biến môi trường autossh, và systemd service. Mọi lệnh đã test trong Docker.
Pipeline production Next.js → Docker → K8s với cache image, manual approval. Tổng kết best practices và kỹ thuật debug (CI Lint, visualizer, CI_DEBUG_TRACE).
Khai báo environment để GitLab theo dõi deployments, có lịch sử và nút rollback. Review Apps — tính năng signature: mỗi MR tự deploy lên môi trường tạm.