คู่มือสร้าง VPN ส่วนตัวด้วย WireGuard บน DigitalOcean 2026
A hands-on guide to deploying a self-hosted WireGuard VPN on a DigitalOcean Droplet, from key generation to firewall rules and security testing.
WireGuard เป็นโปรโตคอล VPN รุ่นใหม่ที่รวมอยู่ใน Linux kernel ทำให้เร็วและตั้งค่าได้ง่ายกว่า OpenVPN แบบเดิม บทความนี้พาไล่ทีละขั้นตอนตั้งแต่เข้าใจหลักการทำงาน ติดตั้งบน Droplet ของ DigitalOcean สร้างคีย์และคอนฟิก client เปิด Firewall พอร์ตที่จำเป็น ไปจนถึงทดสอบการเชื่อมต่อและข้อควรระวังด้านความปลอดภัยสำหรับใช้งานจริง
สารบัญ
WireGuard คืออะไร ต่างจาก OpenVPN ยังไง
WireGuard เป็นโปรโตคอล VPN แบบ open source ที่ออกแบบขึ้นใหม่ทั้งหมดโดยเน้นความเรียบง่ายและประสิทธิภาพ ตัวโค้ดหลักมีขนาดเพียงประมาณ 4,000 บรรทัด เทียบกับ OpenVPN ที่มีโค้ดหลักแสนบรรทัดขึ้นไป ทำให้ตรวจสอบความปลอดภัย (security audit) ได้ง่ายกว่าและมีพื้นที่โจมตี (attack surface) น้อยกว่ามาก WireGuard ถูกรวมเข้าไปใน Linux kernel อย่างเป็นทางการตั้งแต่เวอร์ชัน 5.6 เป็นต้นมา จึงทำงานอยู่ในระดับ kernel space ไม่ใช่ user space แบบ OpenVPN ส่งผลให้ throughput สูงกว่าและ latency ต่ำกว่าอย่างชัดเจนในการใช้งานจริง ด้านการเข้ารหัส WireGuard ใช้ชุด cryptographic primitives ที่ทันสมัยและตายตัว (ไม่ให้เลือก cipher suite เอง) ได้แก่ Curve25519 สำหรับ key exchange, ChaCha20 สำหรับการเข้ารหัสข้อมูล, Poly1305 สำหรับ authentication และ BLAKE2s สำหรับ hashing การไม่ให้ผู้ใช้เลือก algorithm เองช่วยลดโอกาสตั้งค่าผิดพลาดที่นำไปสู่ช่องโหว่ ต่างจาก OpenVPN ที่รองรับหลาย cipher และต้องอาศัย OpenSSL ซึ่งมีประวัติช่องโหว่มาหลายครั้ง ในแง่การเชื่อมต่อ WireGuard ทำงานบน UDP เพียงอย่างเดียวและใช้กลไก handshake แบบ Noise Protocol Framework ที่เร็วมาก การ roaming ระหว่างเครือข่าย เช่น สลับจาก Wi-Fi ไปใช้ 4G/5G ทำได้แบบไร้รอยต่อ เพราะ WireGuard ผูก session กับ public key ของอุปกรณ์ไม่ใช่ IP address ทำให้เหมาะกับอุปกรณ์มือถือมากกว่า OpenVPN ที่บางครั้งต้อง reconnect ใหม่เมื่อเปลี่ยนเครือข่าย OpenVPN ยังมีข้อได้เปรียบบางอย่าง เช่น รองรับทั้ง TCP และ UDP (TCP ช่วยในกรณีเครือข่ายบล็อก UDP หรือต้องพรางผ่าน port 443) และมี ecosystem ปลั๊กอิน/ตัวเลือก config ที่หลากหลายกว่าเนื่องจากอยู่ในตลาดมานานตั้งแต่ปี 2001 สำหรับผู้ใช้ทั่วไปที่ต้องการตั้ง VPN ส่วนตัวไว้ใช้เองบน Droplet เพื่อความเร็วในการเชื่อมต่อและความง่ายในการดูแลรักษา WireGuard เป็นตัวเลือกที่เหมาะสมกว่าในเกือบทุกกรณี ยกเว้นกรณีที่เครือข่ายปลายทางบล็อก UDP ทั้งหมดซึ่ง OpenVPN over TCP จะได้เปรียบกว่า
WireGuard is an open-source VPN protocol redesigned from the ground up with emphasis on simplicity and performance. The core codebase is approximately 4,000 lines of code compared to OpenVPN's over 100,000 lines, making security audits easier and reducing the attack surface significantly. WireGuard was officially integrated into the Linux kernel starting with version 5.6 and runs at the kernel space level rather than user space like OpenVPN, resulting in noticeably higher throughput and lower latency in real-world usage. For encryption, WireGuard uses a fixed set of modern cryptographic primitives (users cannot choose their own cipher suite), including Curve25519 for key exchange, ChaCha20 for data encryption, Poly1305 for authentication, and BLAKE2s for hashing. Not allowing users to select algorithms reduces misconfiguration risks that could lead to vulnerabilities, unlike OpenVPN which supports multiple ciphers and relies on OpenSSL which has a history of vulnerabilities. In terms of connectivity, WireGuard operates exclusively over UDP and uses the Noise Protocol Framework for rapid handshakes. Roaming between networks—for example, switching from Wi-Fi to 4G/5G—is seamless because WireGuard ties sessions to a device's public key rather than its IP address, making it better suited for mobile devices than OpenVPN, which sometimes requires reconnection when the network changes. OpenVPN does have some advantages, such as supporting both TCP and UDP (TCP helps when networks block UDP or require traffic to appear as port 443) and a more diverse plugin ecosystem and configuration options due to its longer market presence since 2001. For users wanting to set up a private VPN on a Droplet for personal use, wanting fast connection speeds and easy maintenance, WireGuard is the more suitable choice in almost every case, except when the endpoint network blocks UDP entirely, where OpenVPN over TCP would have the advantage.
- WireGuard มีโค้ดหลักราว 4,000 บรรทัด เทียบ OpenVPN ที่มีมากกว่าแสนบรรทัด ตรวจสอบความปลอดภัยได้ง่ายกว่า
- รวมอยู่ใน Linux kernel ตั้งแต่เวอร์ชัน 5.6 ทำงานที่ระดับ kernel space จึงเร็วกว่า
- เข้ารหัสด้วย Curve25519 + ChaCha20 + Poly1305 แบบตายตัว ไม่ต้องเลือก cipher เอง
ติดตั้ง WireGuard บน Droplet
ในประสบการณ์ของเรา การติดตั้ง WireGuard บน DigitalOcean เริ่มจากสร้าง Droplet ใหม่ สำหรับใช้งาน VPN ส่วนตัวคนเดียวหรือไม่กี่คน ไม่จำเป็นต้องใช้สเปกสูง เพราะ WireGuard กินทรัพยากรน้อยมาก แผน Basic ระดับเริ่มต้นที่ 512 MiB RAM/1 vCPU/10 GB SSD/500 GiB transfer ราคา $4/เดือน ก็เพียงพอสำหรับใช้งานส่วนตัว แต่ถ้าต้องการพื้นที่กันชนไว้รองรับ client หลายเครื่องหรือ traffic มากขึ้น แผน 1 GiB RAM/1 vCPU/25 GB SSD/1,000 GiB transfer ที่ $6/เดือน เป็นตัวเลือกที่สมดุลกว่า (ข้อมูลราคา ณ กรกฎาคม 2026 ควรตรวจสอบราคาล่าสุดที่เว็บ DigitalOcean อีกครั้งก่อนสมัคร) เลือก region ให้ใกล้ตำแหน่งผู้ใช้งานจริงที่สุด สำหรับผู้ใช้ในไทย sgp1 (Singapore) ให้ latency ต่ำที่สุด รองลงมาคือ blr1 (Bangalore) ระบบปฏิบัติการแนะนำ Ubuntu 24.04 LTS เพราะมี package WireGuard อยู่ใน repository หลักอยู่แล้ว
หลังจาก Droplet พร้อมใช้งานและ SSH เข้าไปได้แล้ว ให้อัปเดตระบบก่อนเสมอด้วย apt update && apt upgrade -y จากนั้นติดตั้งแพ็กเกจ WireGuard ด้วยคำสั่งเดียว apt install wireguard ซึ่งจะติดตั้งทั้งเครื่องมือ wg สำหรับจัดการคีย์และสถานะ และ wg-quick สำหรับ start/stop interface แบบอัตโนมัติ
ขั้นตอนสำคัญที่มักถูกลืมคือการเปิด IP forwarding บนเคอร์เนล เพราะ Droplet ต้องทำหน้าที่เป็น router ส่ง traffic จาก client ออกไปยังอินเทอร์เน็ต แก้ไขไฟล์ /etc/sysctl.conf เพิ่มบรรทัด net.ipv4.ip_forward=1 (และ net.ipv6.ip_forward=1 ถ้าต้องการรองรับ IPv6) แล้วสั่งให้มีผลทันทีด้วย sysctl -p หากข้ามขั้นตอนนี้ client จะเชื่อมต่อ handshake สำเร็จแต่ไม่มี traffic ไหลออกไปอินเทอร์เน็ตได้เลย ซึ่งเป็นปัญหาที่พบบ่อยที่สุดของผู้เริ่มต้นตั้งค่า WireGuard เอง
- แผน Basic $4/เดือน (512 MiB RAM/1 vCPU/10 GB SSD) เพียงพอสำหรับ VPN ส่วนตัว, $6/เดือน (1 GiB RAM) เผื่อ client หลายเครื่อง
- เลือก region sgp1 (Singapore) สำหรับ latency ต่ำสุดจากไทย รองลงมา blr1 (Bangalore)
- ใช้ Ubuntu 24.04 LTS ติดตั้งง่ายด้วยคำสั่งเดียว
apt install wireguard - ต้องเปิด
net.ipv4.ip_forward=1ใน sysctl.conf ไม่งั้น traffic จะไม่ route ออกอินเทอร์เน็ต
สร้าง Key และตั้งค่า Client
WireGuard ใช้ระบบ public-key cryptography แทน username/password หรือ certificate authority แบบ OpenVPN ทำให้การตั้งค่าเร็วกว่ามาก ทั้งฝั่ง server (Droplet) และฝั่ง client ต้องสร้างคู่คีย์ของตัวเอง คำสั่งสร้างคีย์ทำได้ในบรรทัดเดียว wg genkey | tee privatekey | wg pubkey > publickey คำสั่งนี้จะสุ่ม private key เก็บลงไฟล์ privatekey พร้อมส่งต่อเข้า wg pubkey เพื่อคำนวณ public key คู่กันเก็บไว้ในไฟล์ publickey ควรตั้งสิทธิ์ไฟล์ private key ด้วย chmod 600 privatekey เพื่อไม่ให้ผู้ใช้อื่นในเครื่องอ่านได้
บนฝั่ง Droplet ให้สร้างไฟล์คอนฟิก /etc/wireguard/wg0.conf โดยมีโครงสร้างประมาณนี้: [Interface]\nPrivateKey = <server-private-key>\nAddress = 10.0.0.1/24\nListenPort = 51820\nPostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\nPostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE\n\n[Peer]\nPublicKey = <client-public-key>\nAllowedIPs = 10.0.0.2/32 ส่วน PostUp/PostDown คือกฎ NAT ที่ทำให้ traffic จาก client ถูก masquerade ผ่าน public IP ของ Droplet ก่อนออกอินเทอร์เน็ต ต้องเปลี่ยน eth0 ให้ตรงกับชื่อ network interface จริงของ Droplet (ตรวจสอบด้วย ip addr)
ฝั่ง client (เช่นโน้ตบุ๊กหรือมือถือ) ก็สร้างคู่คีย์ของตัวเองเช่นกัน แล้วตั้งค่าคอนฟิกคล้ายกัน โดยระบุ Endpoint เป็น public IP ของ Droplet ต่อด้วยพอร์ต เช่น Endpoint = 203.0.113.10:51820 และกำหนด AllowedIPs = 0.0.0.0/0 หากต้องการส่ง traffic ทั้งหมดผ่าน VPN (full-tunnel) หรือระบุเฉพาะ subnet ที่ต้องการถ้าต้องการ split-tunnel เท่านั้น
หลังตั้งค่าไฟล์ทั้งสองฝั่งเรียบร้อย เปิดใช้งานบน Droplet ด้วย wg-quick up wg0 และตั้งให้ทำงานอัตโนมัติทุกครั้งที่ boot ด้วย systemctl enable wg-quick@wg0 ตรวจสอบสถานะได้ด้วยคำสั่ง wg show ซึ่งจะแสดง peer, latest handshake และปริมาณข้อมูลที่รับส่ง
wg genkey | tee privatekey | wg pubkey > publickey ทั้งฝั่ง server และ client- สร้างคีย์ด้วยคำสั่งเดียว
wg genkey | tee privatekey | wg pubkey > publickeyทั้งฝั่ง server และ client - ตั้งสิทธิ์ private key เป็น
chmod 600เสมอ - wg0.conf ฝั่ง server ต้องมี PostUp/PostDown สำหรับกฎ NAT (iptables MASQUERADE)
- Client เลือก AllowedIPs = 0.0.0.0/0 สำหรับ full-tunnel หรือระบุ subnet เฉพาะสำหรับ split-tunnel
- เปิดใช้งานถาวรด้วย
systemctl enable wg-quick@wg0
เปิด Firewall Port UDP ที่จำเป็น
WireGuard ใช้พอร์ตเดียวสำหรับรับ-ส่งข้อมูลทั้งหมดคือ UDP โดยค่าเริ่มต้นคือพอร์ต 51820 (กำหนดเองได้ผ่าน ListenPort ใน wg0.conf) การเปิดพอร์ตนี้ต้องทำสองชั้นคือที่ระดับ Cloud Firewall ของ DigitalOcean และที่ระดับ firewall ภายในตัว Droplet เอง (เช่น ufw) ถ้าเปิดแค่ชั้นเดียวการเชื่อมต่อจะยังไม่สำเร็จ
DigitalOcean Cloud Firewall เป็นฟีเจอร์ที่ใช้งานฟรีไม่มีค่าใช้จ่ายเพิ่ม ทำงานอยู่นอกตัว Droplet จึงกรอง traffic ก่อนถึงเครื่องจริง ลดภาระของเคอร์เนล เข้าไปที่เมนู Networking > Firewalls ในหน้า control panel สร้างกฎ Inbound ใหม่เลือก protocol UDP พอร์ต 51820 และกำหนด source เป็น All IPv4/All IPv6 หรือจำกัดเฉพาะ IP ที่ทราบล่วงหน้าถ้าต้องการความปลอดภัยสูงขึ้น อย่าลืมเปิดกฎ TCP พอร์ต 22 สำหรับ SSH ไว้ด้วย ไม่เช่นนั้นจะเข้าถึงเครื่องไม่ได้เลย จากนั้นผูก (attach) firewall เข้ากับ Droplet ผ่าน Tags หรือเลือก Droplet โดยตรงก็ได้
ในระดับ Droplet เอง ถ้าเปิดใช้ ufw อยู่ ต้องเพิ่มกฎอนุญาต UDP ด้วย ufw allow 51820/udp และถ้ายังไม่ได้เปิด SSH ไว้ก่อนหน้าให้เพิ่ม ufw allow OpenSSH ด้วยเช่นกันก่อนจะสั่ง ufw enable เพื่อป้องกันตัวเองถูกล็อกออกจากเครื่อง ตรวจสอบสถานะกฎที่ตั้งไว้ทั้งหมดด้วย ufw status verbose
ข้อควรระวังอีกจุดคือ NAT/masquerade ที่ตั้งไว้ใน wg0.conf ต้องอนุญาตให้ traffic ผ่าน FORWARD chain ของ iptables ด้วย หากใช้ ufw ที่ปิดการ forward ไว้เป็นค่าเริ่มต้น (DEFAULT_FORWARD_POLICY="DROP" ในไฟล์ /etc/default/ufw) ต้องเปลี่ยนเป็น ACCEPT ก่อน มิฉะนั้น traffic จาก client จะ handshake สำเร็จแต่ยังออกอินเทอร์เน็ตไม่ได้เหมือนเดิม นอกจากนี้ควรพิจารณาว่าจะเปิด SSH ให้เข้าถึงได้จากทุก IP หรือจำกัดเฉพาะ IP ที่ใช้งานประจำ เพื่อลดพื้นที่การถูกโจมตีแบบ brute-force
- WireGuard ใช้พอร์ต UDP 51820 เป็นค่าเริ่มต้น (เปลี่ยนได้ผ่าน ListenPort)
- DigitalOcean Cloud Firewall ใช้ฟรี ไม่มีค่าใช้จ่ายเพิ่ม — เปิด Inbound UDP 51820 + TCP 22 สำหรับ SSH
- ต้องเปิดทั้ง Cloud Firewall และ ufw บน Droplet พร้อมกัน ไม่ใช่แค่อย่างใดอย่างหนึ่ง
ทดสอบการเชื่อมต่อและความปลอดภัย
จากการรีวิวหลายรอบ หลังตั้งค่าทั้งฝั่ง server และ client เสร็จแล้ว ขั้นตอนถัดไปคือทดสอบว่าการเชื่อมต่อทำงานจริงและปลอดภัยเพียงพอ เริ่มจากรันคำสั่ง wg show บน Droplet เพื่อดูสถานะของแต่ละ peer หากเห็นค่า latest handshake อัปเดตเป็นเวลาไม่กี่วินาทีที่ผ่านมา แสดงว่า client เชื่อมต่อสำเร็จ ถ้าไม่มี handshake เลยหรือ handshake เก่ามาก ให้ตรวจสอบพอร์ต Firewall และคีย์ที่ตรงกันทั้งสองฝั่งอีกครั้ง
จากนั้นทดสอบว่า traffic route ผ่าน tunnel จริงหรือไม่ ping ไปยัง internal IP ของ Droplet ที่กำหนดไว้ เช่น ping 10.0.0.1 จากฝั่ง client ถ้า ping ผ่านแปลว่า tunnel ทำงานถูกต้อง ต่อมาทดสอบว่า traffic ออกอินเทอร์เน็ตผ่าน public IP ของ Droplet จริงหรือไม่ ด้วยการรัน curl ifconfig.me จากเครื่อง client ระหว่างเปิด VPN อยู่ ค่าที่ได้ควรตรงกับ IP ของ Droplet ไม่ใช่ IP บ้าน/ที่ทำงานเดิม หากยังเห็น IP เดิมแสดงว่า AllowedIPs หรือ routing table ของ client ตั้งค่าไม่ถูกต้อง
ควรตรวจสอบ DNS leak ด้วย เพราะบางระบบยังคงใช้ DNS resolver เดิมของเครือข่ายท้องถิ่นแม้ traffic อื่นจะผ่าน VPN แล้ว วิธีแก้คือกำหนดค่า DNS ในไฟล์คอนฟิกฝั่ง client ชี้ไปยัง resolver ที่เชื่อถือได้ เช่น DNS = 1.1.1.1, 8.8.8.8 เพื่อบังคับให้ query ทั้งหมดผ่าน tunnel เช่นกัน
ด้านความปลอดภัยเชิงปฏิบัติ ควรตั้งให้แต่ละ client มีคู่คีย์ของตัวเองแยกกัน ไม่ใช้คีย์ร่วมกันหลายเครื่อง เพื่อให้สามารถเพิกถอน (revoke) เครื่องใดเครื่องหนึ่งได้โดยไม่กระทบเครื่องอื่น เพียงลบ [Peer] block ที่เกี่ยวข้องออกจาก wg0.conf แล้ว reload ด้วย wg syncconf wg0 <(wg-quick strip wg0) นอกจากนี้ควรปิดการ login ด้วย password บน SSH ให้ใช้ SSH key เท่านั้น อัปเดตแพ็กเกจระบบสม่ำเสมอโดยเฉพาะ kernel เพราะ WireGuard ผูกกับความปลอดภัยของ kernel โดยตรง และพิจารณาเปิด automatic security updates ด้วย unattended-upgrades เพื่อปิดช่องโหว่ที่พบใหม่โดยไม่ต้องรอทำเองทุกครั้ง
- ตรวจสถานะด้วย
wg showดูค่า latest handshake ว่าอัปเดตล่าสุดหรือไม่ - ทดสอบ public IP เปลี่ยนจริงด้วย
curl ifconfig.meระหว่างเปิด VPN - ป้องกัน DNS leak ด้วยการกำหนด
DNS = 1.1.1.1, 8.8.8.8ในคอนฟิก client - แยกคู่คีย์ต่อ client หนึ่งเครื่อง เพื่อ revoke ได้โดยไม่กระทบเครื่องอื่น
เมื่อไหร่ควรใช้ฟีเจอร์นี้ (Use Case จริง)
การรัน WireGuard VPN เองบน Droplet เหมาะกับหลายสถานการณ์ที่แตกต่างจากการซื้อบริการ VPN สำเร็จรูป ประการแรกคือการทำงานระยะไกล (remote work) ที่ต้องเข้าถึงทรัพยากรภายในองค์กร เช่น ฐานข้อมูลหรือระบบภายในที่ไม่ต้องการเปิดสู่อินเทอร์เน็ตสาธารณะ การตั้ง WireGuard เป็นประตูเดียวที่เชื่อมต่อกับ VPC ภายในของ DigitalOcean ช่วยให้ทีมเข้าถึงเครื่อง Droplet อื่น ๆ ที่อยู่ในเครือข่ายส่วนตัวเดียวกันได้อย่างปลอดภัย โดยไม่ต้องเปิดพอร์ตของแต่ละเครื่องออกสู่สาธารณะเลย ประการที่สองคือการใช้งานส่วนตัวเพื่อความปลอดภัยเวลาเชื่อมต่อ Wi-Fi สาธารณะ เช่น ที่คาเฟ่หรือสนามบิน ซึ่งมีความเสี่ยงถูกดักข้อมูล (man-in-the-middle) การส่ง traffic ทั้งหมดผ่าน tunnel ที่เข้ารหัสไปยัง Droplet ของตัวเองช่วยลดความเสี่ยงนี้ได้ และยังทำให้ traffic ดูเหมือนออกจาก IP ของ Droplet แทนที่จะเป็น IP เครือข่ายสาธารณะที่ไม่รู้จัก ประการที่สามคือการทดสอบหรือเข้าถึงบริการที่จำกัดตาม region เช่น ทดสอบว่าเว็บไซต์แสดงผลอย่างไรเมื่อเข้าถึงจาก IP ในภูมิภาคต่างประเทศ ซึ่งการเลือก region ของ Droplet ให้ตรงกับที่ต้องการทดสอบ (เช่น sgp1, ams3, nyc1) ทำได้ง่ายกว่าบริการ VPN เชิงพาณิชย์ที่จำกัด server location ตามแพ็กเกจที่ซื้อ อีกกรณีที่พบบ่อยคือทีมพัฒนาที่ต้องการเชื่อมต่อระบบ CI/CD หรือ webhook เข้ากับเครื่อง Droplet ที่อยู่หลัง VPC โดยไม่ต้อง expose service ออกสู่อินเทอร์เน็ตสาธารณะ WireGuard ทำหน้าที่เป็น secure tunnel แบบ site-to-site ระหว่างสภาพแวดล้อมต่าง ๆ ได้เช่นกัน อย่างไรก็ตาม หากต้องการ VPN สำหรับผู้ใช้จำนวนมาก (หลักสิบ-ร้อยคน) มีทีมดูแลระบบจำกัด หรือไม่ต้องการรับผิดชอบเรื่อง patch ความปลอดภัยและ uptime ด้วยตัวเอง การใช้บริการ VPN เชิงพาณิชย์ที่มี SLA และทีมซัพพอร์ตอาจเหมาะสมกว่าการดูแล WireGuard เองในระยะยาว
- Remote work: เข้าถึงทรัพยากรภายใน VPC ของ DigitalOcean อย่างปลอดภัยโดยไม่เปิดพอร์ตสู่สาธารณะ
- ป้องกันความเสี่ยงเมื่อใช้ Wi-Fi สาธารณะที่คาเฟ่/สนามบิน
- ทดสอบเว็บไซต์/บริการตาม region ได้ตรงจุดกว่า VPN เชิงพาณิชย์
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
ปัญหาที่พบบ่อยที่สุดของผู้เริ่มตั้ง WireGuard คือ handshake สำเร็จแต่ไม่มี traffic ไหลออกอินเทอร์เน็ต สาเหตุหลักมักมาจากการลืมเปิด IP forwarding บนเคอร์เนล ตรวจสอบด้วยคำสั่ง sysctl net.ipv4.ip_forward ถ้าค่าที่ได้เป็น 0 ให้แก้ไขตามขั้นตอนในหัวข้อการติดตั้งข้างต้น อีกสาเหตุที่ใกล้เคียงกันคือกฎ NAT ใน PostUp/PostDown อ้างอิงชื่อ interface ผิด ควรตรวจสอบชื่อ interface จริงด้วย ip addr ก่อนแก้ไฟล์คอนฟิก
ปัญหาที่พบรองลงมาคือ handshake ไม่เกิดขึ้นเลย ซึ่งมักเกิดจาก Firewall บล็อกพอร์ต UDP 51820 ไม่ว่าจะเป็นชั้น Cloud Firewall ของ DigitalOcean หรือ ufw ภายในเครื่อง หรืออาจเกิดจากคีย์ public/private ไม่ตรงกันระหว่างสองฝั่ง ควรตรวจทานว่า public key ที่ใส่ในฝั่ง server ตรงกับ private key ที่ client ถืออยู่จริง เพราะการ copy-paste ผิดบรรทัดเป็นเรื่องเกิดขึ้นบ่อย
ปัญหาเรื่อง MTU ก็พบได้บ่อยเช่นกัน โดยเฉพาะเมื่อใช้งานผ่านเครือข่ายที่มี overhead เพิ่ม เช่น เชื่อมต่อผ่าน mobile data หรือ double-NAT อาการที่พบคือเว็บไซต์บางหน้าโหลดไม่ครบหรือค้าง ทั้งที่ ping ผ่านปกติ วิธีแก้คือลดค่า MTU ในคอนฟิก client ลงจากค่าเริ่มต้น เช่นตั้งเป็น MTU = 1420 แล้วทดสอบใหม่
อีกปัญหาที่เจอบ่อยในบางกรณีคือนาฬิกาของ Droplet หรือ client ไม่ตรงกัน (clock skew) เนื่องจากกลไก handshake ของ WireGuard มีความอ่อนไหวต่อเวลาระดับหนึ่ง ควรตรวจสอบว่า time sync (NTP) ทำงานปกติทั้งสองฝั่งด้วยคำสั่ง timedatectl
สุดท้ายคือปัญหาเรื่องสิทธิ์ไฟล์ private key ที่เปิดกว้างเกินไป ซึ่งบางระบบ (เช่น distro บางตัว) จะปฏิเสธไม่ให้ wg-quick โหลดคอนฟิกถ้า private key มีสิทธิ์อ่านเขียนสำหรับผู้ใช้อื่น แก้ไขง่าย ๆ ด้วยการ chmod 600 ไฟล์คอนฟิกและไฟล์คีย์ทั้งหมดให้เจ้าของเท่านั้นที่เข้าถึงได้
- Handshake สำเร็จแต่เน็ตไม่ออก: เช็ค ip_forward และชื่อ interface ใน PostUp/PostDown
- Handshake ไม่เกิดเลย: เช็ค Firewall ทั้งสองชั้น (Cloud Firewall + ufw) และคีย์ตรงกันหรือไม่
- หน้าเว็บโหลดค้างทั้งที่ ping ผ่าน: ลด MTU เหลือ 1420
แนวทางปฏิบัติที่ดีที่สุด (Best Practices)
เมื่อ WireGuard ทำงานได้เสถียรแล้ว มีแนวทางเพิ่มเติมที่ช่วยให้ระบบปลอดภัยและดูแลรักษาง่ายขึ้นในระยะยาว ข้อแรกคือการผูก Reserved IP เข้ากับ Droplet ที่รัน VPN แทนการใช้ public IP เริ่มต้น เพราะถ้าวันหนึ่งต้อง resize หรือย้าย Droplet ไปเครื่องใหม่ (เช่น เปลี่ยนสเปกหรือ region) จะสามารถย้าย Reserved IP ตามไปได้โดยไม่ต้องแก้ Endpoint ในคอนฟิกทุก client ใหม่ Reserved IP ไม่มีค่าใช้จ่ายเพิ่มตราบใดที่ผูกกับ Droplet ที่ใช้งานอยู่ (ถ้าปล่อยไว้ไม่ผูกกับเครื่องใดจะมีค่าใช้จ่าย $5/เดือน) ข้อสองคือการจำกัด source IP ของกฎ Cloud Firewall ให้แคบที่สุดเท่าที่ทำได้ ถ้าทราบ IP บ้านหรือที่ทำงานที่ใช้เชื่อมต่อประจำ ควรระบุเฉพาะ IP เหล่านั้นแทนการเปิดรับจากทุกที่ (0.0.0.0/0) ทั้งพอร์ต SSH และพอร์ต WireGuard เอง จะช่วยลดพื้นที่การถูกโจมตีได้มาก ข้อสามคือการสำรองไฟล์คอนฟิกและคีย์ไว้นอก Droplet เสมอ เพราะถ้าเครื่องมีปัญหาโดยไม่มี Snapshot จะต้องสร้างคีย์และคอนฟิกใหม่ทั้งหมด รวมถึงแก้คอนฟิกทุก client ใหม่ทั้งหมดเช่นกัน การสร้าง Droplet Snapshot ก่อนแก้ไขคอนฟิกสำคัญ (ราคา $0.06/GiB ต่อเดือน) เป็นวิธีที่คุ้มค่าและกู้คืนได้เร็วเมื่อเกิดปัญหา ข้อสี่คือการเปิดใช้ DigitalOcean Monitoring ซึ่งใช้งานฟรี เพื่อติดตาม bandwidth และ CPU ของ Droplet ที่รัน VPN โดยเฉพาะถ้า Droplet ทำหน้าที่อื่นร่วมด้วย เช่นเป็น web server ในเครื่องเดียวกัน การเห็นกราฟ traffic ผิดปกติช่วยจับสัญญาณการถูกใช้งานในทางที่ไม่ได้ตั้งใจได้เร็วขึ้น ข้อสุดท้ายคือการหมุนเวียน (rotate) คีย์เป็นระยะสำหรับ client ที่ใช้งานมานาน โดยเฉพาะอุปกรณ์ที่เคยแชร์ให้ผู้อื่นยืมใช้ชั่วคราว การสร้างคู่คีย์ใหม่และลบคีย์เก่าออกจาก [Peer] ทำได้รวดเร็วและไม่กระทบ client เครื่องอื่น ควรจดบันทึกว่าคีย์ไหนผูกกับอุปกรณ์ใดไว้เป็นเอกสารภายในทีม เพื่อให้จัดการและเพิกถอนสิทธิ์ได้ง่ายเมื่อจำเป็น
- ผูก Reserved IP เข้า Droplet VPN กัน Endpoint เปลี่ยนเวลาย้ายเครื่อง (ฟรีเมื่อผูกกับ Droplet ที่ใช้งานอยู่)
- จำกัด source IP ของกฎ Firewall ให้แคบที่สุดทั้ง SSH และ WireGuard
- สร้าง Snapshot ก่อนแก้คอนฟิกสำคัญ ($0.06/GiB/เดือน)