ตั้งค่า IPv6 บน VPS Linux — คู่มือฉบับสมบูรณ์
IPv4 address กำลังจะหมดจากทั่วโลก — ISP และ cloud provider ต่างเริ่มกระจาย IPv6 ให้กับลูกค้ามากขึ้น VPS ส่วนใหญ่ในปัจจุบันได้รับ IPv6 subnet มาพร้อมกัน แต่ระบบ Linux ไม่ได้เปิดใช้งานหรือตั้งค่าให้อัตโนมัติเสมอไป บทความนี้จะพาคุณตั้งค่า IPv6 บน VPS Linux ตั้งแต่ต้นจนใช้งานได้จริง ทั้งแบบ SLAAC และ Static address พร้อม firewall rules และ DNS records
ทำไมต้องใช้ IPv6?
IPv4 ให้ address ได้แค่ 4.3 พันล้านตัว — ตอนนี้หมดแล้ว IPv6 ให้ได้ถึง 3.4 × 10³⁸ address ซึ่งมากพอสำหรับทุกอุปกรณ์บนโลก นอกจากนี้ IPv6 ยังมีข้อดีอื่น:
- ไม่ต้องใช้ NAT — ทุก host มี public address จริง
- Routing เร็วกว่าเพราะ header เล็กลง
- Built-in IPsec สำหรับ encryption
- Stateless autoconfiguration (SLAAC) ไม่ต้องการ DHCP server
- SEO และ CDN บางเจ้ารองรับ IPv6 ได้ดีกว่า
ตรวจสอบ IPv6 address จาก Provider
ก่อนตั้งค่า ให้ตรวจสอบว่า VPS ของคุณได้รับ IPv6 มาแล้วหรือยัง — ไปดูที่ control panel ของ provider หรือใช้คำสั่ง:
# ดู network interfaces ทั้งหมด
ip addr show
# ดูเฉพาะ IPv6
ip -6 addr show
# ดู routing table IPv6
ip -6 route show
หากเห็น address ที่ขึ้นต้นด้วย 2xxx: หรือ fd00: แสดงว่า interface มี IPv6 แล้ว แต่ถ้าเห็นแค่ fe80:: (link-local) แสดงว่ายังไม่มี global IPv6
วิธีที่ 1 — SLAAC (Stateless Address Autoconfiguration)
SLAAC เป็นวิธีที่ง่ายที่สุด เหมาะกับ VPS ที่ provider ส่ง Router Advertisement มาให้ ระบบจะสร้าง IPv6 address ให้เองอัตโนมัติ
Ubuntu / Debian — Netplan
# ดูชื่อ interface
ip link show
# แก้ไขไฟล์ netplan
nano /etc/netplan/00-installer-config.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: true
dhcp6: true # เปิด SLAAC/DHCPv6
accept-ra: true # รับ Router Advertisement
# Apply config
netplan apply
# ตรวจสอบ
ip -6 addr show eth0
CentOS / Rocky / AlmaLinux — NetworkManager
# แก้ไข connection profile
nmcli con show
nmcli con mod eth0 ipv6.method auto
nmcli con up eth0
# ตรวจสอบ
nmcli -p con show eth0 | grep IPv6
วิธีที่ 2 — Static IPv6 Address
เหมาะกับ server ที่ต้องการ IP คงที่ เช่น mail server, DNS server, หรือ web server ที่ทำ AAAA record ให้ผู้อื่น
Ubuntu / Debian — Netplan (static)
nano /etc/netplan/00-installer-config.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: true
addresses:
- 2a01:4f8:c2c:1234::1/64 # แทนด้วย IPv6 จาก provider
routes:
- to: ::/0
via: 2a01:4f8:c2c:1234::1 # gateway (fe80:: หรือ global)
nameservers:
addresses:
- 2606:4700:4700::1111 # Cloudflare IPv6 DNS
- 2001:4860:4860::8888 # Google IPv6 DNS
netplan apply
CentOS / Rocky — nmcli (static)
nmcli con mod eth0 \
ipv6.method manual \
ipv6.addresses "2a01:4f8:c2c:1234::1/64" \
ipv6.gateway "fe80::1" \
ipv6.dns "2606:4700:4700::1111,2001:4860:4860::8888"
nmcli con up eth0
ตั้งค่า Kernel — เปิด IPv6 ถ้าถูกปิด
บาง VPS ปิด IPv6 ไว้ใน kernel parameters ให้ตรวจสอบและเปิด:
# ตรวจสอบว่า IPv6 ถูก disable หรือไม่
sysctl net.ipv6.conf.all.disable_ipv6
# ถ้าได้ 1 = ถูก disable
# เปิด IPv6 ทุก interface
sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl -w net.ipv6.conf.default.disable_ipv6=0
# ให้ persistent หลัง reboot
echo "net.ipv6.conf.all.disable_ipv6 = 0" >> /etc/sysctl.d/99-ipv6.conf
echo "net.ipv6.conf.default.disable_ipv6 = 0" >> /etc/sysctl.d/99-ipv6.conf
sysctl --system
net.ipv6.conf.all.forwarding = 1 จำเป็นถ้าคุณใช้ VPS เป็น IPv6 router หรือ gateway ให้ container อื่นตั้งค่า Firewall สำหรับ IPv6
Firewall ต้องตั้งค่าแยกสำหรับ IPv6 เพราะ iptables ควบคุมแค่ IPv4 — IPv6 ใช้ ip6tables
UFW (แนะนำสำหรับ Ubuntu/Debian)
# ตรวจสอบว่า UFW รองรับ IPv6
grep "IPV6" /etc/default/ufw
# ต้องเป็น IPV6=yes
# เปิด ports สำหรับ IPv6 เหมือน IPv4
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
# ดู rules IPv6
ufw status verbose
ip6tables (manual)
# ล้าง rules เดิม
ip6tables -F
ip6tables -X
# อนุญาต loopback และ established connections
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# อนุญาต ICMPv6 (จำเป็นสำหรับ neighbor discovery)
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
# อนุญาต SSH, HTTP, HTTPS
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
# Drop ทุกอย่างที่เหลือ
ip6tables -A INPUT -j DROP
# บันทึก rules
apt install iptables-persistent -y
netfilter-persistent save
ตั้งค่า DNS AAAA Record
เมื่อ VPS มี IPv6 แล้ว ให้เพิ่ม AAAA record ใน DNS ของโดเมน:
| Record Type | Name | Value |
|---|---|---|
| AAAA | @ | 2a01:4f8:c2c:1234::1 |
| AAAA | www | 2a01:4f8:c2c:1234::1 |
| AAAA | 2a01:4f8:c2c:1234::1 |
สำหรับ reverse DNS (PTR record) ต้องขอผ่าน provider — ไปที่ control panel แล้ว set rDNS ให้ IPv6 address ชี้ไปยัง hostname ของคุณ
ตั้งค่า Nginx ให้ Listen IPv6
server {
# รองรับทั้ง IPv4 และ IPv6
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.example.com;
# ...
}
ถ้าใช้ wildcard [::]:80 และเปิด net.ipv6.bindv6only = 0 (ค่า default บน Linux) การ listen บน IPv6 จะครอบคลุม IPv4 ด้วยผ่าน dual-stack socket
ตรวจสอบว่า IPv6 ทำงานถูกต้อง
# ping6 ไปยัง Google DNS
ping6 2001:4860:4860::8888 -c 4
# ทดสอบ HTTP request ผ่าน IPv6
curl -6 -I https://ipv6.google.com
# ดู IPv6 address ที่ใช้งานอยู่
ip -6 addr show scope global
# ตรวจสอบ routing
ip -6 route show
tracepath6 2001:4860:4860::8888
# ตรวจสอบว่า DNS resolve ผ่าน IPv6
dig AAAA google.com @2606:4700:4700::1111
แก้ปัญหาที่พบบ่อย
Error: "Network is unreachable" เมื่อ ping6
เกิดเมื่อ interface ไม่มี global IPv6 address หรือ default route ของ IPv6 หายไป
# ตรวจสอบ default route
ip -6 route show | grep default
# เพิ่ม route ชั่วคราว (แทน gateway ด้วยค่าจริง)
ip -6 route add default via 2a01:4f8:c2c:1234::1 dev eth0
# ถ้า provider ใช้ link-local gateway (fe80::)
ip -6 route add default via fe80::1 dev eth0
Error: "connect: Cannot assign requested address" ใน curl -6
Kernel ปิด IPv6 อยู่ ให้ตรวจสอบและเปิด:
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# ถ้าได้ 1 ให้รัน:
sysctl -w net.ipv6.conf.all.disable_ipv6=0
Error: "Address already in use" เมื่อ Nginx ไม่ start หลังเพิ่ม [::]:443
เกิดเมื่อ net.ipv6.bindv6only=1 และ port ถูกใช้โดย IPv4 socket ก่อนแล้ว
# ดูว่าค่า bindv6only เป็นอะไร
sysctl net.ipv6.bindv6only
# ถ้าเป็น 1 ให้ set เป็น 0 หรือแยก listen ชัดเจน
sysctl -w net.ipv6.bindv6only=0
echo "net.ipv6.bindv6only = 0" >> /etc/sysctl.d/99-ipv6.conf
Error: ICMPv6 "Destination Unreachable" — neighbor solicitation ไม่ตอบ
firewall block ICMPv6 ทั้งหมด ต้องเปิด neighbor discovery:
# เปิด ICMPv6 type 133-137 (ND messages)
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 133 -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 134 -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 135 -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 136 -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 137 -j ACCEPT
IPv6 address หายหลัง reboot
Address ถูกตั้งแบบ temporary ไม่ได้บันทึกใน config:
# Ubuntu/Debian — ตรวจสอบว่า netplan config บันทึกถูกต้อง
cat /etc/netplan/00-installer-config.yaml
# CentOS/Rocky — ตรวจสอบ connection profile
cat /etc/NetworkManager/system-connections/eth0.nmconnection | grep ipv6
คำถามที่พบบ่อย
VPS ผมมี IPv6 หรือเปล่า?
ดูที่ control panel ของ provider ส่วนใหญ่จะแสดง IPv6 subnet ที่จัดสรรให้ หรือรัน ip -6 addr show แล้วดูว่ามี address ที่ขึ้นต้นด้วย 2 หรือ 3 (global unicast) ถ้ามีแค่ fe80:: (link-local) แปลว่า provider ยังไม่ได้ assign IPv6 ให้
ต้องตั้งค่า IPv6 ด้วยไหม ถ้าเว็บใช้แค่ IPv4?
แนะนำให้ตั้งค่า IPv6 ไว้ด้วยเสมอ เพราะ Google ใช้ IPv6 ในการ crawl เว็บ (Googlebot รองรับ IPv6) และผู้เข้าชมบาง ISP เชื่อมต่อผ่าน IPv6 เท่านั้น นอกจากนี้ Cloudflare ยังให้คะแนน performance ดีกว่าสำหรับ origin ที่รองรับ IPv6
SLAAC กับ DHCPv6 ต่างกันอย่างไร?
SLAAC (Stateless Address Autoconfiguration) ให้ host สร้าง address เองจาก prefix ที่ router ส่งมา — ไม่ต้องมี DHCP server DHCPv6 ทำงานคล้าย DHCP ของ IPv4 คือ server จ่าย address ให้ชัดเจน VPS ส่วนใหญ่ใช้ SLAAC แต่บาง provider ใช้ DHCPv6 หรือ static assignment เท่านั้น — ดู documentation ของ provider