ตั้ง WireGuard VPN Server บน VPS Ubuntu ทีละขั้นตอน

การมี VPN Server เป็นของตัวเองบน VPS ช่วยให้คุณเข้าถึงอินเทอร์เน็ตได้อย่างปลอดภัย เข้าถึงเครือข่ายภายในองค์กรจากที่ใดก็ได้ และหลีกเลี่ยงการเชื่อมต่อที่ไม่น่าเชื่อถือในที่สาธารณะ WireGuard เป็น VPN Protocol รุ่นใหม่ที่ตั้งค่าง่าย เร็ว และปลอดภัยกว่า OpenVPN บทความนี้จะพาคุณตั้งค่า WireGuard VPN Server บน VPS Ubuntu ตั้งแต่ต้นจนใช้งานได้จริง

WireGuard คืออะไร ดีกว่า OpenVPN อย่างไร

WireGuard เป็น VPN Protocol ที่ออกแบบมาให้ทันสมัย เรียบง่าย และมีประสิทธิภาพสูง โดยมีโค้ดเพียงราว 4,000 บรรทัด (เทียบกับ OpenVPN ที่มีเกิน 600,000 บรรทัด) ทำให้ตรวจสอบความปลอดภัยได้ง่ายกว่ามาก

ข้อดีของ WireGuard เมื่อเทียบกับ OpenVPN:

ข้อกำหนดเบื้องต้น

ก่อนเริ่ม ตรวจสอบว่าคุณมีสิ่งเหล่านี้พร้อมแล้ว:

ขั้นตอนที่ 1: ติดตั้ง WireGuard

เข้า SSH ไปยัง VPS แล้วรันคำสั่งต่อไปนี้:

sudo apt update
sudo apt install wireguard -y

ตรวจสอบว่าติดตั้งสำเร็จ:

wg --version

ขั้นตอนที่ 2: สร้าง Key Pair สำหรับ Server

WireGuard ใช้ Elliptic Curve Cryptography (Curve25519) สำหรับ Key Exchange เราต้องสร้าง Key Pair สำหรับ Server ก่อน:

cd /etc/wireguard
wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key
sudo chmod 600 /etc/wireguard/server_private.key

บันทึกค่า private key ด้วยคำสั่ง:

sudo cat /etc/wireguard/server_private.key

จดค่าที่ได้ไว้ เพราะจะต้องใช้ในไฟล์ config ถัดไป

ขั้นตอนที่ 3: ตั้งค่า Server Interface (wg0.conf)

สร้างไฟล์ config สำหรับ interface wg0:

sudo nano /etc/wireguard/wg0.conf

ใส่เนื้อหาดังนี้ (แทน YOUR_SERVER_PRIVATE_KEY ด้วย private key ที่ได้จากขั้นตอนก่อน):

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = YOUR_SERVER_PRIVATE_KEY

# IP Forwarding and NAT rules
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

หมายเหตุ: หาก network interface ของ VPS ไม่ใช่ eth0 ให้ตรวจสอบด้วย ip route show default แล้วแทนชื่อ interface ที่ถูกต้อง

ขั้นตอนที่ 4: เปิด IP Forwarding และ UFW Rules

เปิด IP Forwarding เพื่อให้ VPS ส่งต่อ traffic ของ client ออกอินเทอร์เน็ตได้:

echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

จากนั้นเปิด Port UDP 51820 ผ่าน UFW Firewall:

sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status

ขั้นตอนที่ 5: สร้าง Key Pair สำหรับ Client

สร้าง key pair สำหรับ client แต่ละอุปกรณ์ (ทำซ้ำสำหรับทุก client ที่ต้องการเพิ่ม):

wg genkey | sudo tee /etc/wireguard/client1_private.key | wg pubkey | sudo tee /etc/wireguard/client1_public.key

บันทึก private key ของ client:

sudo cat /etc/wireguard/client1_private.key

บันทึก public key ของ client:

sudo cat /etc/wireguard/client1_public.key

ขั้นตอนที่ 6: เพิ่ม Peer (Client) ใน Server Config

เปิดไฟล์ /etc/wireguard/wg0.conf แล้วเพิ่ม Peer block ต่อท้าย:

[Peer]
# Client 1 - My Laptop
PublicKey = CLIENT1_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32

แทน CLIENT1_PUBLIC_KEY ด้วย public key ของ client ที่สร้างในขั้นตอนก่อน

ขั้นตอนที่ 7: Config ฝั่ง Client

สร้างไฟล์ config สำหรับ client (บนอุปกรณ์ client หรือ import เข้า WireGuard App บนมือถือด้วย QR Code):

[Interface]
PrivateKey = CLIENT1_PRIVATE_KEY
Address = 10.0.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = YOUR_VPS_PUBLIC_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

แทนค่าต่างๆ ด้วยข้อมูลจริง: CLIENT1_PRIVATE_KEY = private key ของ client, SERVER_PUBLIC_KEY = public key ของ server, YOUR_VPS_PUBLIC_IP = IP จริงของ VPS

ค่า AllowedIPs = 0.0.0.0/0 หมายความว่า traffic ทั้งหมดจาก client จะถูกส่งผ่าน VPN (Full Tunnel) หากต้องการ Split Tunnel ให้ระบุ IP range เฉพาะที่ต้องการ

ขั้นตอนที่ 8: รัน WireGuard และทดสอบ

เริ่มต้น WireGuard บน Server:

sudo wg-quick up wg0

ตรวจสอบสถานะ:

sudo wg show

จากนั้น connect จาก client แล้วทดสอบด้วยการ ping Server:

ping 10.0.0.1

หรือตรวจสอบว่า IP สาธารณะเปลี่ยนเป็น IP ของ VPS แล้วหรือยัง:

curl ifconfig.me

เปิดใช้งานอัตโนมัติหลัง Server Reboot
รันคำสั่งต่อไปนี้เพื่อให้ WireGuard เริ่มต้นอัตโนมัติทุกครั้งที่ VPS reboot:

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

ตรวจสอบสถานะ: sudo systemctl status wg-quick@wg0

การจัดการ Key และ Peer หลายอุปกรณ์

ในสภาพแวดล้อมจริง มักต้องเพิ่ม Client หลายอุปกรณ์พร้อมกัน เช่น แล็ปท็อป มือถือ และแท็บเล็ต WireGuard จัดการได้ง่ายเพราะแต่ละ Peer มี IP ใน VPN Network ของตัวเอง

สร้าง Key Pair ให้แต่ละอุปกรณ์แยกกัน:

wg genkey | sudo tee /etc/wireguard/client2_private.key | wg pubkey | sudo tee /etc/wireguard/client2_public.key
wg genkey | sudo tee /etc/wireguard/client3_private.key | wg pubkey | sudo tee /etc/wireguard/client3_public.key

จากนั้นเพิ่ม Peer หลายรายการใน wg0.conf ต่อท้ายกัน:

[Peer]
# Client 2 - Mobile Phone
PublicKey = CLIENT2_PUBLIC_KEY
AllowedIPs = 10.0.0.3/32

[Peer]
# Client 3 - Tablet
PublicKey = CLIENT3_PUBLIC_KEY
AllowedIPs = 10.0.0.4/32

โดยไม่ต้อง Restart WireGuard สามารถเพิ่ม Peer ได้ทันทีด้วย:

sudo wg set wg0 peer CLIENT2_PUBLIC_KEY allowed-ips 10.0.0.3/32

หรือถ้าต้องการให้การเปลี่ยนแปลงถาวร ให้แก้ไข wg0.conf แล้วรัน sudo wg-quick down wg0 && sudo wg-quick up wg0

เปรียบเทียบประสิทธิภาพ WireGuard กับ OpenVPN และ IPsec

คุณสมบัติ WireGuard OpenVPN IPsec
ขนาดโค้ด ~4,000 บรรทัด >600,000 บรรทัด ซับซ้อนมาก
Throughput สูงมาก (Kernel) ปานกลาง (Userspace) สูง (Kernel)
ตั้งค่า ง่ายมาก ซับซ้อน (CA, certs) ซับซ้อนมาก
Handshake เวลา <100ms 1-3 วินาที 0.5-1 วินาที
Built-in Linux ใช่ (Kernel 5.6+) ไม่ (ต้องติดตั้ง) บางส่วน

Split Tunneling และ DNS Leak Prevention

ค่า AllowedIPs = 0.0.0.0/0 ส่ง Traffic ทั้งหมดผ่าน VPN (Full Tunnel) แต่หลายกรณีต้องการ Split Tunneling คือส่งเฉพาะ Traffic บางส่วนผ่าน VPN และส่วนที่เหลือออกอินเทอร์เน็ตตรง

ตัวอย่าง Split Tunneling — ให้เฉพาะ Traffic ภายใน Network ผ่าน VPN:

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = YOUR_VPS_IP:51820
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25

สำหรับการป้องกัน DNS Leak ใน Full Tunnel Mode ต้องตรวจสอบว่า DNS ของ Client ชี้ไปยัง Server ที่เชื่อถือได้ ในไฟล์ client config ให้ระบุ:

[Interface]
DNS = 1.1.1.1, 8.8.8.8

ทดสอบ DNS Leak ได้ที่เว็บ dnsleaktest.com หลังเชื่อมต่อ VPN แล้ว ควรเห็น DNS Server เป็น IP ของ 1.1.1.1 หรือ 8.8.8.8 ไม่ใช่ DNS ของ ISP เดิม

การ Monitor และ Debug WireGuard

WireGuard มีคำสั่ง wg show ที่ให้ข้อมูลสถานะ Peer ทั้งหมดแบบ Real-time:

sudo wg show

ตัวอย่าง Output ที่ควรเห็นเมื่อ Client เชื่อมต่ออยู่:

interface: wg0
  public key: [server_public_key]
  private key: (hidden)
  listening port: 51820

peer: [client1_public_key]
  endpoint: [client_ip]:PORT
  allowed ips: 10.0.0.2/32
  latest handshake: 30 seconds ago
  transfer: 1.23 MiB received, 456 KiB sent

ถ้า latest handshake ไม่แสดงหรือแสดงเป็นเวลานานมาก แปลว่า Client ไม่ได้เชื่อมต่ออยู่ ให้ตรวจสอบ Firewall และ Endpoint IP ของ VPS ด้วย:

# ตรวจสอบ UFW Status
sudo ufw status verbose

# ตรวจสอบ IP ปัจจุบันของ VPS
curl ifconfig.me

# ดู Log ของ WireGuard
sudo journalctl -u wg-quick@wg0 -f

เพิ่ม Client บนมือถือ (iOS / Android)

WireGuard มี App ทางการสำหรับทั้ง iOS และ Android สามารถ import config ได้ 2 วิธี:

  1. Import ไฟล์ .conf — สร้างไฟล์ config ตามตัวอย่างด้านบน แล้ว import เข้า WireGuard App
  2. QR Code — รันคำสั่ง qrencode -t ansiutf8 < client1.conf บน server แล้วสแกนจาก App (ต้องติดตั้ง sudo apt install qrencode ก่อน)

หลัง import เสร็จ กด Toggle เพื่อ connect และทดสอบว่า internet ทำงานได้ปกติ

การหมุนเวียน Key (Key Rotation) และการยกเลิกสิทธิ์ Client

ในสภาพแวดล้อมจริงที่มี Client หลายเครื่อง การบริหารจัดการ Key อย่างเป็นระบบเป็นสิ่งสำคัญ เมื่อต้องการยกเลิกสิทธิ์ Client ให้ลบ [Peer] block ของ Client นั้นออกจาก wg0.conf แล้ว reload interface ทันที Client จะไม่สามารถเชื่อมต่อได้อีก โดยไม่กระทบ Client อื่นๆ เลย เพราะแต่ละ Peer มี Key แยกกันอิสระ

สำหรับการหมุนเวียน Key ในช่วงเวลาที่กำหนด ให้ทำตามขั้นตอนนี้:

  1. สร้าง Key Pair ใหม่สำหรับ Client ที่ต้องการ
  2. ส่ง Config ใหม่ให้ Client ก่อน (ทำก่อนลบ Key เก่า เพื่อไม่ให้ขาดการเชื่อมต่อ)
  3. ลบ Peer Block เก่าและเพิ่ม Peer Block ใหม่พร้อมกันใน wg0.conf
  4. รัน sudo wg syncconf wg0 <(wg-quick strip wg0) เพื่อ apply การเปลี่ยนแปลงโดยไม่ต้อง Restart

WireGuard ยังรองรับ Pre-shared Key (PSK) ซึ่งเป็น Symmetric Key เพิ่มเติมระหว่าง Server และ Client แต่ละคู่ ช่วยเพิ่ม Layer ของความปลอดภัยในกรณีที่ Elliptic Curve Cryptography ถูก Compromise ในอนาคต สามารถเพิ่มได้ด้วย:

wg genpsk | sudo tee /etc/wireguard/client1.psk
sudo chmod 600 /etc/wireguard/client1.psk

จากนั้นเพิ่ม PresharedKey = [ค่า PSK] ใน [Peer] block ทั้งฝั่ง Server และ Client Config

ตั้งค่า WireGuard บน VPS ที่อยู่หลัง NAT หรือ Firewall

VPS บางผู้ให้บริการอาจมี Firewall ที่ระดับ Network (ไม่ใช่แค่ UFW ใน OS) ซึ่งต้องเปิด Port UDP 51820 จากหน้า Dashboard ของ Provider ด้วย นอกจากนี้หาก VPS อยู่หลัง NAT เช่น Private IP ที่ Map ไปยัง Public IP ต้องตรวจสอบว่า NAT Rules อนุญาต UDP Traffic ผ่านได้

การตรวจสอบว่า Port 51820 UDP เปิดและรับ Traffic ได้จากภายนอก:

# จาก Client หรือเครื่องอื่นนอก VPS ใช้คำสั่ง (ต้องติดตั้ง nmap)
nmap -sU -p 51820 YOUR_VPS_IP

# หรือใช้ nc (netcat) ทดสอบ UDP
nc -vuz YOUR_VPS_IP 51820

ถ้าใช้ Cloud Provider ที่มี Security Group เช่น AWS, GCP, Azure หรือ DigitalOcean ต้องเพิ่ม Inbound Rule สำหรับ UDP 51820 ใน Console ของ Provider นั้นด้วย ก่อนที่ UFW จะมีผลใดๆ เพราะ Security Group ทำงานก่อน UFW ในชั้น Network

สถานการณ์ สิ่งที่ต้องทำ ตรวจสอบ
VPS มี Public IP โดยตรง เปิด UFW port 51820/udp sudo ufw status
Cloud Security Group (AWS/DO) เพิ่ม Inbound UDP 51820 ใน Console nmap -sU -p 51820 IP
VPS อยู่หลัง NAT เพิ่ม Port Forwarding บน Router/Gateway curl ifconfig.me เทียบ IP จริง

แนวปฏิบัติด้านความปลอดภัยสำหรับ WireGuard Server

การตั้งค่า WireGuard ให้ทำงานได้เป็นแค่จุดเริ่มต้น ในสภาพแวดล้อม Production ควรทำสิ่งเพิ่มเติมเพื่อลดความเสี่ยง:

สำหรับ VPS ที่ใช้ WireGuard เป็น Production VPN Server การเปิด Port เดียวที่จำเป็น (UDP 51820 และ TCP 22 สำหรับ SSH) และปิด Port อื่นทั้งหมดผ่าน UFW เป็นแนวปฏิบัติที่ดีที่สุด เพราะลด Attack Surface ได้มากที่สุด

เช่า VPS รองรับ WireGuard Kernel Module

VPS Ubuntu ที่ AsiaGB รองรับ WireGuard kernel module โดยไม่ต้องตั้งค่าเพิ่มเติม พร้อม Public IP, Root Access และ Bandwidth ไม่จำกัด เริ่มต้น 500 บาท/เดือน Uptime 99%

ดูแพ็กเกจ VPS