Rocky Linux 9 配置 IPv6 完整指南

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

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
相关推荐
十五年专注C++开发2 小时前
Linux 下用 VS Code 高效调试
linux·运维·服务器·c++·vscode
Sylvia33.2 小时前
体育数据API实战:用火星数据实现NBA赛事实时比分与状态同步
java·linux·开发语言·前端·python
大胖某人2 小时前
Kali系统安装OpenClaw调用DeepSeek API部署方法详解
linux·人工智能
七夜zippoe2 小时前
OpenClaw CLI 完整命令手册
linux·服务器·网络·cli·openclaw·命令手册
桌面运维家2 小时前
理解 Linux Front Page:构建动态Web首页指南
linux·运维·服务器
旺仔.2912 小时前
死锁 详解
linux·开发语言·计算机网络·安全
季明洵2 小时前
预处理详解(上)
linux·c语言·数据结构·预定义
toooooop82 小时前
linux常用命令nano和vim有啥区别
linux·运维·vim
i建模2 小时前
在Ubuntu中解压ZIP文件
linux·chrome·ubuntu