Cài WireGuard trên Fedora: Xong trong 10 phút
Mình dùng Fedora làm máy development chính đã 2 năm. Điều thích nhất là tốc độ cập nhật package — WireGuard đã được tích hợp thẳng vào kernel từ phiên bản 5.6, nên trên Fedora không cần cài module ngoài. Chỉ cần wireguard-tools là đủ.
Setup WireGuard trên Fedora hơi khác Ubuntu ở chỗ phải xử lý cả firewalld lẫn SELinux — hai thứ hầu hết bài hướng dẫn hay bỏ qua. Bài này mình đi thẳng vào phần đó.
Môi trường thực hiện
- Fedora Server 40/41 (VPS hoặc máy chủ vật lý)
- Public IP: ví dụ
203.0.113.10 - WireGuard subnet:
10.8.0.0/24 - Port WireGuard:
51820/udp
Quick Start — Làm ngay trong 10 phút
Bước 1: Cài WireGuard tools
sudo dnf install wireguard-tools -y
Bước 2: Sinh key pair cho server
cd /etc/wireguard
sudo umask 077
sudo wg genkey | sudo tee server_private.key | sudo wg pubkey | sudo tee server_public.key
Ghi lại hai giá trị này. Private key giữ bí mật tuyệt đối, public key dùng khi cấu hình peer.
Bước 3: Tạo file cấu hình server
sudo nano /etc/wireguard/wg0.conf
Nội dung file:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <nội_dung_server_private.key>
# Bật IP forwarding khi interface lên
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = firewall-cmd --zone=public --add-interface=wg0
PostUp = firewall-cmd --zone=public --add-masquerade
PostDown = firewall-cmd --zone=public --remove-interface=wg0
PostDown = firewall-cmd --zone=public --remove-masquerade
# --- Peer 1 (client laptop) ---
[Peer]
PublicKey = <public_key_của_client>
AllowedIPs = 10.8.0.2/32
Bước 4: Mở port firewalld cho WireGuard
# Mở port UDP 51820 vĩnh viễn
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --reload
Bước 5: Bật IP forwarding vĩnh viễn
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf
Bước 6: Khởi động WireGuard và bật autostart
sudo systemctl enable --now wg-quick@wg0
Kiểm tra nhanh:
sudo wg show
Thấy interface wg0 với listening port: 51820 là xong phần server.
Giải thích chi tiết — Vì sao làm vậy?
firewalld và WireGuard: Tại sao cần masquerade?
Fedora dùng firewalld với khái niệm zone, khác hoàn toàn với iptables truyền thống. Khi client kết nối vào WireGuard và muốn ra internet qua server, traffic cần được NAT (masquerade) — tức là server đóng giả là nguồn gửi gói tin thay cho client.
Lệnh PostUp/PostDown trong wg0.conf chạy tự động khi interface lên/xuống. Không cần can thiệp thủ công mỗi lần reboot.
Chỉ dùng WireGuard để SSH vào server mà không cần route toàn bộ traffic? Bỏ phần masquerade đi — config sẽ gọn hơn nhiều.
SELinux và wg-quick: Điều ít ai biết
Đây là chỗ mình từng mất 30 phút debug khi mới setup lần đầu. Trên Fedora với SELinux ở chế độ Enforcing, lệnh sysctl chạy từ PostUp đôi khi bị SELinux chặn vì context không khớp.
Kiểm tra xem có AVC denial không:
sudo ausearch -m avc -ts recent | grep wireguard
Cách xử lý clean nhất: bật IP forwarding vĩnh viễn qua sysctl.d (đã làm ở Bước 5). Sau đó xóa dòng PostUp = sysctl... khỏi wg0.conf:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <server_private.key>
PostUp = firewall-cmd --zone=public --add-interface=wg0
PostUp = firewall-cmd --zone=public --add-masquerade
PostDown = firewall-cmd --zone=public --remove-interface=wg0
PostDown = firewall-cmd --zone=public --remove-masquerade
Sạch hơn, không phụ thuộc vào SELinux context của script.
Cấu hình Client (Laptop/PC)
Sinh key cho client
# Trên máy client (Linux/Mac)
wg genkey | tee client_private.key | wg pubkey | tee client_public.key
Copy client_public.key lên server và thêm vào wg0.conf trong phần [Peer] (đã có ở Bước 3 phía trên).
File cấu hình phía client
[Interface]
Address = 10.8.0.2/32
PrivateKey = <client_private.key>
DNS = 1.1.1.1
[Peer]
PublicKey = <server_public.key>
Endpoint = 203.0.113.10:51820
# Route toàn bộ traffic qua VPN
AllowedIPs = 0.0.0.0/0
# Chỉ route traffic nội bộ (không qua VPN cho internet)
# AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25
Trên Linux client, kết nối bằng:
sudo wg-quick up ./client.conf
Windows/Mac/iOS/Android — dùng app WireGuard chính thức, import file config hoặc quét QR code là xong.
Nâng cao — Thêm nhiều peer và quản lý dễ hơn
Thêm peer mới không cần restart service
WireGuard có một điểm hay mà OpenVPN không làm được: thêm peer giữa chừng mà không restart service, không gián đoạn kết nối đang có.
# Thêm peer mới trực tiếp vào running interface
sudo wg set wg0 peer <public_key_client_mới> allowed-ips 10.8.0.3/32
# Đồng thời lưu vào file config để persist sau reboot
sudo wg-quick save wg0
Script tự động sinh config cho client mới
#!/bin/bash
# gen-client.sh — sinh config client WireGuard nhanh
CLIENT_NAME="$1"
CLIENT_IP="$2" # VD: 10.8.0.3
SERVER_PUBKEY=$(cat /etc/wireguard/server_public.key)
SERVER_ENDPOINT="203.0.113.10:51820"
CLIENT_PRIVKEY=$(wg genkey)
CLIENT_PUBKEY=$(echo "$CLIENT_PRIVKEY" | wg pubkey)
# Thêm vào server config
echo -e "\n[Peer]\nPublicKey = $CLIENT_PUBKEY\nAllowedIPs = $CLIENT_IP/32" \
| sudo tee -a /etc/wireguard/wg0.conf
# Tạo file config cho client
cat > "${CLIENT_NAME}.conf" <<EOF
[Interface]
Address = $CLIENT_IP/32
PrivateKey = $CLIENT_PRIVKEY
DNS = 1.1.1.1
[Peer]
PublicKey = $SERVER_PUBKEY
Endpoint = $SERVER_ENDPOINT
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
echo "Config đã tạo: ${CLIENT_NAME}.conf"
echo "Public key client: $CLIENT_PUBKEY"
sudo bash gen-client.sh macbook 10.8.0.3
Mấy tips từ kinh nghiệm dùng WireGuard thực chiến
1. Debug kết nối nhanh
# Xem traffic real-time qua interface wg0
sudo tcpdump -i wg0
# Xem packet count từng peer
watch -n 1 sudo wg show
# Test kết nối từ client
ping 10.8.0.1 # ping server qua VPN
2. Đừng route 0.0.0.0/0 trừ khi thực sự cần
Nhiều người copy config mẫu với AllowedIPs = 0.0.0.0/0 (full tunnel) trong khi chỉ cần truy cập server nội bộ. Split tunnel (AllowedIPs = 10.8.0.0/24) nhanh hơn rõ rệt — mình test trên mạng cà phê, latency giảm từ ~80ms xuống ~25ms khi switch sang split tunnel. Traffic internet của client vẫn đi thẳng, không đi vòng qua server VPN.
3. PersistentKeepalive — khi nào cần?
Set PersistentKeepalive = 25 ở phía client khi client đứng sau NAT — hầu hết trường hợp dùng laptop ở nhà hoặc cà phê. Server không cần set. Giá trị 25 giây ổn với hầu hết router, nhưng nếu kết nối vẫn bị drop thì thử giảm xuống 15.
4. Backup private key ngay bây giờ
# Backup key ra chỗ khác (ngoài server)
sudo cat /etc/wireguard/server_private.key
Mất private key là phải cấu hình lại từ đầu cho toàn bộ peer. Mình đã từng rơi vào tình huống này khi snapshot VPS bị lỗi — mất 2 tiếng update lại config cho tất cả thiết bị. Không vui tí nào.
5. Firewalld zone — chú ý khi có nhiều interface
Server nhiều NIC thì cẩn thận với firewalld zone. Kiểm tra interface đang thuộc zone nào trước khi thêm masquerade:
sudo firewall-cmd --get-active-zones
Interface public của server (eth0 hoặc ens3) phải ở zone public thì masquerade mới hoạt động đúng.

