Làm ngay trong 5 phút: Bật IPv6 và kiểm tra kết nối
Nếu bạn chỉ cần biết server có IPv6 chưa và bật nó lên nhanh nhất có thể, làm theo 3 bước này:
# Kiểm tra IPv6 đã bật chưa
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# Kết quả 0 = đã bật, 1 = đang tắt
# Bật IPv6 ngay (không cần reboot)
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0
# Kiểm tra địa chỉ IPv6 được gán
ip -6 addr show
Thấy fe80:: trong output? Server đã nhận link-local IPv6 — nhưng chưa xong. Link-local chỉ dùng được trong cùng subnet, ping từ internet vẫn thất bại. Cần thêm vài bước mới truy cập được từ ngoài.
Hiểu nhanh về IPv6 trước khi cấu hình
Cái hay gây nhầm khi mới làm quen IPv6: một interface thường có 3–4 địa chỉ IPv6 đồng thời, mỗi loại có vai trò riêng.
- Link-local (
fe80::/10): Tự sinh, chỉ dùng trong cùng subnet. Không route được ra ngoài. - Global unicast (
2000::/3): Địa chỉ public, routable toàn cầu — giống IPv4 public. - Loopback (
::1): Tương đương127.0.0.1. - ULA (
fd00::/8): Địa chỉ private nội bộ, như192.168.x.xnhưng cho IPv6.
Khi mới deploy VPS có IPv6, cứ tưởng thấy fe80:: là xong — nhưng ping từ bên ngoài vẫn fail vì đó chỉ là link-local. Phải có global unicast mới truy cập được từ internet.
Cấu hình IPv6 tĩnh trên Ubuntu/Debian
Ubuntu 20.04 trở lên quản lý network qua Netplan — file config nằm trong /etc/netplan/, không còn dùng /etc/network/interfaces nữa.
# Xem file netplan hiện tại
ls /etc/netplan/
cat /etc/netplan/00-installer-config.yaml
Chỉnh sửa để thêm IPv6 tĩnh:
# /etc/netplan/00-installer-config.yaml
network:
version: 2
ethernets:
eth0:
addresses:
- 192.168.1.100/24 # IPv4 tĩnh (giữ nguyên)
- 2001:db8:1::100/64 # IPv6 tĩnh (thay bằng địa chỉ thật)
routes:
- to: default
via: 192.168.1.1 # Gateway IPv4
- to: ::/0
via: 2001:db8:1::1 # Gateway IPv6
nameservers:
addresses:
- 8.8.8.8
- 2001:4860:4860::8888 # Google DNS IPv6
# Áp dụng cấu hình
sudo netplan apply
# Kiểm tra kết quả
ip -6 addr show eth0
ip -6 route show
Cấu hình IPv6 tĩnh trên CentOS/RHEL/Rocky Linux
Trên hệ CentOS/Rocky, file cấu hình interface nằm ở /etc/sysconfig/network-scripts/:
# Mở file cấu hình interface
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
Thêm các dòng IPv6 vào file:
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
# IPv4
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
# IPv6
IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6ADDR=2001:db8:1::100/64
IPV6_DEFAULTGW=2001:db8:1::1
DNS1=8.8.8.8
DNS2=2001:4860:4860::8888
# Restart network interface
sudo nmcli connection reload
sudo nmcli connection up eth0
# Hoặc trên hệ thống cũ
sudo systemctl restart NetworkManager
Cấu hình nâng cao: Dual-Stack và SLAAC
Dual-Stack: Chạy IPv4 và IPv6 song song
Setup này mình đang chạy trên tất cả server production. IPv4 giữ lại để tương thích với hệ thống cũ, IPv6 để kết nối trực tiếp không qua NAT — latency thấp hơn và tránh được các vấn đề của CGNAT.
Chỗ dễ bị bỏ qua: Nginx listen trên :: (all IPv6) thường tự cover IPv4 luôn qua IPv4-mapped addresses — nhưng chỉ là thường. Kết quả thực tế phụ thuộc vào kernel setting này:
# Kiểm tra xem IPv4-mapped có được bật không
cat /proc/sys/net/ipv6/bindv6only
# 0 = dual-stack tự động, 1 = phải bind riêng từng protocol
SLAAC — Tự động nhận địa chỉ IPv6 từ Router
Nếu router hỗ trợ RA (Router Advertisement), server có thể tự nhận IPv6 global mà không cần cấu hình tĩnh:
# Bật SLAAC cho interface eth0
sudo sysctl -w net.ipv6.conf.eth0.autoconf=1
sudo sysctl -w net.ipv6.conf.eth0.accept_ra=1
# Ghi vào /etc/sysctl.conf để persistent
echo "net.ipv6.conf.eth0.autoconf=1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv6.conf.eth0.accept_ra=1" | sudo tee -a /etc/sysctl.conf
Với máy trạm trong office thì SLAAC tiện, không cần cấu hình gì thêm. Còn server luôn gán IP tĩnh — IP cố định thì viết firewall rule đơn giản hơn nhiều, không lo IP thay đổi sau mỗi lần reboot.
Cấu hình ip6tables — Firewall cho IPv6
Lỗi này mình gặp nhiều lần khi review server người khác: iptables tight hết mức, nhưng ip6tables trống rỗng — IPv6 traffic vào thẳng, không bị filter.
# Xem rule ip6tables hiện tại
sudo ip6tables -L -n -v
# Thiết lập rule cơ bản cho IPv6
# Cho phép loopback
sudo ip6tables -A INPUT -i lo -j ACCEPT
# Cho phép traffic đã thiết lập
sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Cho phép ICMPv6 (BẮT BUỘC — không có cái này IPv6 sẽ không hoạt động đúng)
sudo ip6tables -A INPUT -p icmpv6 -j ACCEPT
# Cho phép SSH
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
# Cho phép HTTP/HTTPS
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
# Chặn tất cả còn lại
sudo ip6tables -A INPUT -j DROP
# Lưu rule
sudo ip6tables-save | sudo tee /etc/ip6tables.rules
ICMPv6 không được chặn — đây là điểm khác hoàn toàn so với IPv4. ICMPv4 tắt một phần thì server vẫn chạy bình thường. Nhưng ICMPv6 là backbone của cả giao thức: neighbor discovery, router advertisement, path MTU discovery đều đi qua đây. Chặn ICMPv6 là IPv6 tê liệt ngay.
Tips thực tế từ kinh nghiệm quản lý network
Mình quản lý network cho office 50 người và datacenter nhỏ — những điểm dưới đây đều từ lỗi thật, không phải lý thuyết:
1. Kiểm tra connectivity đúng cách
# Ping IPv6 (dùng -6 để force IPv6)
ping6 google.com
# Hoặc
ping -6 2001:4860:4860::8888
# Traceroute IPv6
traceroute6 google.com
# Curl qua IPv6
curl -6 https://ipv6.google.com
# Kiểm tra DNS có trả về AAAA record không
dig AAAA google.com
nslookup -type=AAAA google.com
2. Persistent sysctl — Bật IPv6 tồn tại sau reboot
# Thêm vào /etc/sysctl.conf hoặc tạo file riêng
cat << 'EOF' | sudo tee /etc/sysctl.d/99-ipv6.conf
net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0
net.ipv6.conf.lo.disable_ipv6=0
EOF
# Áp dụng ngay
sudo sysctl --system
3. Cách viết địa chỉ IPv6 trong config Nginx/Apache
# Nginx — lắng nghe cả IPv4 và IPv6
server {
listen 80;
listen [::]:80; # IPv6 — phải có dấu ngoặc vuông
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com;
}
# Kết nối SSH đến server qua IPv6 (phải có ngoặc vuông)
ssh user@[2001:db8:1::100]
ssh -6 [email protected]
4. Xử lý khi VPS provider gán IPv6 nhưng không kết nối được
Hồi dùng Vultr, gặp đúng trường hợp này: IPv6 đã hiện trong dashboard, nhưng ping ra ngoài vẫn timeout. Nguyên nhân là gateway IPv6 của họ yêu cầu cấu hình route khác:
# Kiểm tra route IPv6
ip -6 route show
# Nếu thiếu default route, thêm thủ công
sudo ip -6 route add default via 2001:db8:1::1 dev eth0
# Kiểm tra neighbor cache (tương đương ARP của IPv4)
ip -6 neigh show
Nếu vẫn không xong, kiểm tra MTU. IPv6 có yêu cầu tối thiểu 1280 bytes — thấp hơn thì packet bị drop silently, rất khó debug:
ip link show eth0 | grep mtu
# Nếu MTU < 1280, tăng lên
sudo ip link set eth0 mtu 1500

