Rocky Linux 9 配置 IPv6 完整指南
适用环境 :Rocky Linux 9 / AlmaLinux 9 / RHEL 9
网络管理器:NetworkManager(nmcli)
前言
IPv6 的配置方式取决于你的网络接入类型。本文覆盖两种最常见场景:
| 场景 | 说明 |
|---|---|
| 原生 IPv6 | VPS 提供商直接分配 IPv6 地址,配在物理网卡上 |
| 6in4 隧道 | 通过 SIT 隧道把 IPv4 网络桥接到 IPv6(如 HE.net Tunnel Broker) |
一、查看当前网络状态
bash
# 查看所有网卡
ip link show
# 查看 NetworkManager 连接列表
nmcli connection show
# 查看当前 IPv6 地址
ip -6 addr show
# 查看 IPv6 路由表
ip -6 route show
关键判断点:
- 若
ip -6 addr show某接口有scope global地址 → IPv6 地址已配置 - 若路由表有
default via ... dev <接口>→ 默认路由已配置 - 若两者都有但仍不通 → 看防火墙或上游问题
二、场景 A:原生 IPv6(物理网卡)
配置命令
bash
# 替换为你的实际值
网卡名=eth0
IPv6地址=2001:db8:1:2::100
前缀长度=64
IPv6网关=2001:db8:1:2::1
nmcli connection modify $网卡名 \
ipv6.method manual \
ipv6.addresses "${IPv6地址}/${前缀长度}" \
ipv6.gateway "${IPv6网关}"
nmcli connection up $网卡名
验证
bash
ip -6 addr show eth0
ping6 -c 4 2606:4700:4700::1111
三、场景 B:6in4 SIT 隧道
这是通过现有 IPv4 接入 IPv6 的常见方案,Rocky 9 上用 NetworkManager 管理 SIT 隧道。
3.1 创建隧道连接
bash
# 参数说明:
# local = 本机外网 IPv4 地址
# remote = 隧道服务商对端 IPv4 地址
# 以上两个地址由隧道提供商给出
nmcli connection add \
type ip-tunnel \
ifname ipv6net \
con-name ipv6net \
ip-tunnel.mode sit \
ip-tunnel.local <本机IPv4地址> \
ip-tunnel.remote <对端IPv4地址>
3.2 配置隧道上的 IPv6 地址
bash
nmcli connection modify ipv6net \
ipv6.method manual \
ipv6.addresses "<你的IPv6地址>/64"
nmcli connection up ipv6net
3.3 添加默认路由
⚠️ SIT 隧道与普通以太网不同,不需要指定网关,直接路由到接口即可。
bash
# 方法 1:临时添加(测试用,重启失效)
ip -6 route add ::/0 dev ipv6net
# 测试连通后,方法 2:持久化写入 NetworkManager
nmcli connection modify ipv6net +ipv6.routes "::/0"
nmcli connection up ipv6net
3.4 验证
bash
# 确认默认路由存在
ip -6 route show | grep default
# 期望输出:default dev ipv6net metric XXX
# 测试 ICMP 连通性
ping6 -c 4 2606:4700:4700::1111
# 测试 HTTP 出口
curl -6 https://ipv6.icanhazip.com
四、常见问题排查
问题 1:ping6: connect: Network is unreachable
原因:缺少 IPv6 默认路由。
bash
# 检查路由表,确认有无 default 行
ip -6 route show | grep default
修复:
bash
# SIT 隧道场景(不需要网关)
ip -6 route add ::/0 dev ipv6net
# 原生 IPv6 场景(需要指定网关)
ip -6 route add ::/0 via <IPv6网关> dev eth0
问题 2:路由加上了但还是 ping 不通
排查步骤:
bash
# 1. 确认隧道接口状态是 UP
ip link show ipv6net
# 2. 检查本机 IPv4 是否能 ping 通隧道对端
ping -c 4 <对端IPv4地址>
# 3. 抓包看 ICMP 有没有发出去
tcpdump -i ipv6net icmp6 -n
# 4. 查看内核 IPv6 是否被禁用
sysctl net.ipv6.conf.all.disable_ipv6
# 输出为 0 表示已启用,为 1 表示被禁用
若 IPv6 被禁用,启用它:
bash
sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl -w net.ipv6.conf.default.disable_ipv6=0
# 持久化
echo "net.ipv6.conf.all.disable_ipv6 = 0" >> /etc/sysctl.d/99-ipv6.conf
sysctl -p /etc/sysctl.d/99-ipv6.conf
问题 3:重启后 IPv6 配置消失
原因 :用 ip 命令临时配置,未通过 NetworkManager 持久化。
修复 :所有配置必须通过 nmcli connection modify 写入,不要只用 ip 命令。
bash
# 错误方式(重启失效)
ip -6 addr add 2001:db8::1/64 dev eth0
# 正确方式(持久化)
nmcli connection modify eth0 ipv6.method manual ipv6.addresses "2001:db8::1/64"
nmcli connection up eth0
问题 4:防火墙拦截 IPv6
Rocky 9 默认启用 firewalld,需确认 IPv6 流量放行。
bash
# 查看当前规则
firewall-cmd --list-all
# 允许 ICMPv6(必须,否则邻居发现协议失效)
firewall-cmd --permanent --add-rich-rule='rule family="ipv6" protocol value="icmpv6" accept'
# 开放特定端口(以 HTTP/HTTPS 为例)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
问题 5:IPv6 地址显示为 scope link 而非 scope global
fe80:: 开头的地址是链路本地地址,不能用于公网通信。
bash
ip -6 addr show | grep "scope global"
若无 scope global 地址,说明全局 IPv6 地址未配置,回到第二节重新配置。
问题 6:nmcli 显示 ipv6net 连接存在但接口 DOWN
bash
# 强制重启连接
nmcli connection down ipv6net && nmcli connection up ipv6net
# 若报错,查看详细日志
journalctl -u NetworkManager --since "5 minutes ago" | tail -50
五、一键检查脚本
把以下内容保存为 check-ipv6.sh,快速诊断 IPv6 状态:
bash
#!/bin/bash
echo "===== IPv6 地址 ====="
ip -6 addr show | grep "scope global"
echo ""
echo "===== IPv6 路由 ====="
ip -6 route show | grep -E "default|::/0"
echo ""
echo "===== 连通性测试 ====="
ping6 -c 2 -W 3 2606:4700:4700::1111 &>/dev/null \
&& echo "✅ Cloudflare IPv6 可达" \
|| echo "❌ Cloudflare IPv6 不可达"
echo ""
echo "===== 出口 IP ====="
curl -6 -s --max-time 5 https://ipv6.icanhazip.com && echo "" || echo "❌ HTTP IPv6 请求失败"
bash
chmod +x check-ipv6.sh && ./check-ipv6.sh
六、命令速查表
| 操作 | 命令 |
|---|---|
| 查看 IPv6 地址 | ip -6 addr show |
| 查看 IPv6 路由 | ip -6 route show |
| 添加临时默认路由(SIT) | ip -6 route add ::/0 dev ipv6net |
| 添加临时默认路由(原生) | ip -6 route add ::/0 via <网关> dev eth0 |
| 持久化默认路由(SIT) | nmcli connection modify ipv6net +ipv6.routes "::/0" |
| 重启 NM 连接 | nmcli connection up <连接名> |
| 测试连通性 | ping6 -c 4 2606:4700:4700::1111 |
| 查看出口 IPv6 | curl -6 https://ipv6.icanhazip.com |
| 启用内核 IPv6 | sysctl -w net.ipv6.conf.all.disable_ipv6=0 |
| 查看 NM 日志 | journalctl -u NetworkManager -f |