网站要上 IPv6,这活儿说难不难,说简单也不简单——机器有没有公网 v6 地址、nginx 有没有监听 [::]、云上安全组放没放行,哪一步弄错站点都可能连不上。我自己是真懒得一行行去翻宝塔和 nginx 的配置,就打开七亿批量远程管理工具 SSH 终端里的 AI 助手,丢了句「帮我网站开启IPV6支持」,剩下的全交给它了。它从摸底开始,一路改配置、踩坑、回头修坑、reload,最后还从外部实测了一遍;连自己一开始把 IPv6 地址末尾那组 :0 写漏了,都回头找了出来。全程我就提了这一次需求。

下面是跟机器人的详细对话,每一步我都标了注,对着编号看就知道它在干啥:

🤖 AI助手就绪。连着的机器: 博客 (81.71.16.243)(已加载机器档案 81.71.16.243)
▶ 默认「自动逐步执行」: 你说要干啥, AI 一次只给一条命令, 跑完把真实回显发回再给下一条; 危险命令默认绝不代跑 —— 需要放行时勾顶栏「🔓 全部权限」(改为弹窗确认后代跑; 关窗失效, 下次要再勾)。
⚠ 已放开全部权限: 🔴 极危险命令(删除数据/格式化等)改为弹窗确认后可执行; 🟡 命令想免逐条确认, 在弹窗上勾「本次会话不再逐条确认」即可。关掉本窗口自动失效。
▶ 开始逐步执行: AI 一次只给一条命令, 跑完把真实回显发回再决定下一条; 危险命令会停下等你确认。

🧑 管理员:
帮我网站开启IPV6支持

第 1 步 · 先摸底:这台机有没有公网 IPv6 地址

🤖 AI助手:
我来处理。开启 IPv6 前先摸底:① 机器有没有公网 IPv6 地址 ② nginx 监听配置 ③ 防火墙情况。逐步来。

🟢 作用: 只读查看本机 IPv6 地址(全球单播)和路由|风险: 无

ip -6 addr show scope global; echo '---'; ip -6 route show | head -5
❯ ip -6 addr show scope global; echo '---'; ip -6 route show | head -5

第 2 步 · 测一下 IPv6 能不能出网

🤖 AI助手:
IPv6 地址已配置成功(2402:4e00:c011:3b00:7c2e:91f4:2406:0),且有默认路由。我先测试 IPv6 出站连通性,确认网络真正可用。

🟢 作用: 测试 IPv6 出站连通性(ping 腾讯公共 DNS 的 v6 地址)|风险: 无

ping -6 -c 3 2402:4e00:802::1 2>&1 || ping -6 -c 3 240c::6666

ℹ 本次会话内 🟡 级命令(装包/改配置等)不再逐条确认; 🔴 危险命令仍会确认。

❯ ping -6 -c 3 2402:4e00:802::1 2>&1 || ping -6 -c 3 240c::6666

第 3 步 · 看 nginx 有没有在监听 IPv6([::])

🤖 AI助手:
IPv6 出站已通(240c::6666 正常),eth0 已有全局地址,下一步看 nginx 是否在监听 IPv6。

🟢 作用: 查看 nginx 当前监听端口是否含 IPv6([::])|风险: 无,纯只读

ss -tlnp | grep -i nginx
❯ ss -tlnp | grep -i nginx

第 4 步 · 找出 nginx 的 listen 都写在哪个文件

🤖 AI助手:
nginx 目前只监听 IPv4(0.0.0.0),IPv6 外网是通的,问题就在监听配置。我先找出所有 nginx 站点的 listen 指令位置。

🟢 作用: 只读列出 nginx 主配置和宝塔站点 vhost 里的 listen 指令, 定位要加 IPv6 监听的文件|风险: 无

grep -rn 'listen' /www/server/nginx/conf/nginx.conf /www/server/panel/vhost/nginx/ 2>/dev/null | grep -v '^\s*#' | head -30
❯ grep -rn 'listen' /www/server/nginx/conf/nginx.conf /www/server/panel/vhost/nginx/ 2>/dev/null | grep -v '^\s*#' | head -30

第 5 步 · 改配置前先备份 3 个站点的配置

🤖 AI助手:
IPv6 地址已就位(2402:4e00:c011:3b00:7c2e:91f4:2406)、出站通、nginx 只差在监听里加 [::]。现在开始改站点配置,先备份。

🟡 作用: 备份 3 个 nginx 站点配置(soft/blog/default),改坏可回滚|风险: 无,只新增 .bak 副本

cd /www/server/panel/vhost/nginx && for f in soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf; do cp -a $f $f.bak.$(date +%F-%H%M%S); done && ls -1 *.bak.*
❯ cd /www/server/panel/vhost/nginx && for f in soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf; do cp -a $f $f.bak.$(date +%F-%H%M%S); done && ls -1 *.bak.*

第 6 步 · 给 80/443 各加一条 [::] 监听

🤖 AI助手:
IPv6 已通、三个站点配置已备份,现在给三个站点(soft/blog/默认站)的 80/443 加上 IPv6 监听。

🟡 作用: 在三个 vhost 的 listen 80/443 ssl 后各插入一行 [::] 监听(已备份, 可回滚)|风险: 配置写错会导致 nginx -t 不过(不 reload 不影响运行中的站点)

cd /www/server/panel/vhost/nginx && for f in soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf; do sed -i 's/^ listen 80;$/ listen 80;\n listen [::]:80 ipv6only=on;/' $f; sed -i 's/^ listen 443 ssl;$/ listen 443 ssl;\n listen [::]:443 ssl ipv6only=on;/' $f; done && grep -n 'listen' soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf
❯ cd /www/server/panel/vhost/nginx && for f in soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf; do sed -i 's/^ listen 80;$/ listen 80;\n listen [::]:80 ipv6only=on;/' $f; sed -i 's/^ listen 443 ssl;$/ listen 443 ssl;\n listen [::]:443 ssl ipv6only=on;/' $f; done && grep -n 'listen' soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf

第 7 步 · 先校验语法,别急着 reload

🤖 AI助手:
配置已加好 IPv6 监听,我先校验 nginx 配置语法,通过后再 reload。

🟢 作用: 校验 nginx 配置语法是否正确|风险: 无

/www/server/nginx/sbin/nginx -t
❯ /www/server/nginx/sbin/nginx -t

第 8 步 · 报错了:ipv6only 参数写重了,去掉

🤖 AI助手:
我先修复报错根因:ipv6only=on 属于 socket 选项,同一个 [::]:80 地址只允许声明一次,多个站点文件都带就重复了(nginx 1.3.4+ 默认就是 ipv6only=on,参数可直接去掉)。

🟡 作用:去掉三个站点配置里 listen [::] 行的 ipv6only=on 冗余参数,回读并重测 nginx 配置(已有 .bak 备份)|风险:仅微调刚加的行,失败可回滚备份

cd /www/server/panel/vhost/nginx && for f in soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf; do sed -i 's/^\( listen \[::\]:[0-9]*\) ipv6only=on;$/\1;/' $f; done && grep -n 'listen' soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf && /www/server/nginx/sbin/nginx -t

预期:grep 显示 listen [::]:80; / listen [::]:443 ssl;(无 ipv6only),且 nginx -t 返回 test is successful。

❯ cd /www/server/panel/vhost/nginx && for f in soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf; do sed -i 's/^\( listen \[::\]:[0-9]*\) ipv6only=on;$/\1;/' $f; done && grep -n 'listen' soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf && /www/server/nginx/sbin/nginx -t

第 9 步 · 443 上也有一处,再修一次

🤖 AI助手:
处理 duplicate listen options

报错原因: [::]:443 在 soft 和 blog 两个 server 块里都写了 ipv6only=on, 同一端口只允许第一个 listen 带该选项(nginx 会在同端口同时有 IPv4 listen 时自动设置 ipv6only, 参数本身可省)。

🟡 作用: 去掉两个站点 443 行的 ipv6only=on, 再 nginx -t 验证语法(只改配置不重载, 无服务中断)|风险: 无, 已有 .bak 备份可回滚

cd /www/server/panel/vhost/nginx && sed -i 's/^\( listen \[::\]:443 ssl\) ipv6only=on;$/\1;/' soft.7ehl.com.conf blog.7ehl.com.conf && grep -n 'listen' soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf && /www/server/nginx/sbin/nginx -t

nginx -t 通过后再 reload, 然后我会用 ss -tlnp 确认 [::]:80/[::]:443 已监听。

❯ cd /www/server/panel/vhost/nginx && sed -i 's/^\( listen \[::\]:443 ssl\) ipv6only=on;$/\1;/' soft.7ehl.com.conf blog.7ehl.com.conf && grep -n 'listen' soft.7ehl.com.conf blog.7ehl.com.conf 0.default.conf && /www/server/nginx/sbin/nginx -t

第 10 步 · 平滑 reload,确认 [::]:80 / [::]:443 已生效

🤖 AI助手:
配置测试已通过,现在平滑重载 nginx 并确认 IPv6 监听生效。

🟡 作用: 平滑 reload nginx(不断连接)并回读 80/443 监听,预期看到 [::]:80 和 [::]:443 出现|风险: reload 失败会回滚到旧 worker 继续跑,无中断风险

/www/server/nginx/sbin/nginx -s reload && sleep 1 && ss -tlnp | grep -E ':(80|443|888) '
❯ /www/server/nginx/sbin/nginx -s reload && sleep 1 && ss -tlnp | grep -E ':(80|443|888) '

第 11 步 · 再确认公网地址和防火墙放行

🤖 AI助手:
🟢 作用: 确认本机是否有公网 IPv6 地址、firewalld 放行情况(IPv6 能否真正对外)|风险: 无

ip -6 addr show scope global; echo ---; firewall-cmd --list-ports
❯ ip -6 addr show scope global; echo ---; firewall-cmd --list-ports

第 12 步 · 先从外部探一次(结果:不通)

🤖 AI助手:
nginx 已在 [::]:80 / [::]:443 监听,eth0 有全局 IPv6 2402:4e00:c011:3b00:7c2e:91f4:2406;firewalld 的 80/443 tcp 规则默认同时作用于 IPv4/IPv6,本机侧已齐。最后从外部视角实测一次 IPv6 可达性:

若通 → IPv6 站点即完成;若不通 → 大概率是腾讯云安全组没放行 IPv6 的 80/443(这步只能在控制台做)。

❯ 调用工具: tcptest [2402:4e00:c011:3b00:7c2e:91f4:2406]:80, tcptest [2402:4e00:c011:3b00:7c2e:91f4:2406]:443

第 13 步 · 回到本机核对:地址和监听到底有没有

🤖 AI助手:
tcptest 从外部连不上这个 IPv6(报“不知道这样的主机”),我先在服务器本机核对:① 这台机到底有没有配上这个全局 IPv6 地址;② nginx 有没有真的监听 [::]:80/443。

🟢 作用: 只读查看全局 IPv6 地址与 nginx 监听情况|风险: 无

ip -6 addr show scope global; echo ---; ss -tlnp | grep -E ':(80|443) '
❯ ip -6 addr show scope global; echo ---; ss -tlnp | grep -E ':(80|443) '

第 14 步 · 本机用 IPv6 实测,顺带查域名 AAAA 记录

🤖 AI助手:
nginx 已在 [::]:80/[::]:443 正常监听, 机器也有全局 IPv6 地址(/128)。刚才 tcptest 报“不知道这样的主机”是探测端不支持 IPv6 字面量, 不代表端口不通。接下来本机用 IPv6 地址实测 nginx 应答, 并查域名有没有 AAAA 解析记录。

🟢 作用: 用 IPv6 地址实测 nginx HTTP 应答 + 查 soft/blog 两域名的 AAAA 记录|风险: 无(只读)

curl -6 -sI --max-time 5 'http://[2402:4e00:c011:3b00:7c2e:91f4:2406]/' | head -5; echo ---; dig +short AAAA soft.7ehl.com; dig +short AAAA blog.7ehl.com
❯ curl -6 -sI --max-time 5 'http://[2402:4e00:c011:3b00:7c2e:91f4:2406]/' | head -5; echo ---; dig +short AAAA soft.7ehl.com; dig +short AAAA blog.7ehl.com

第 15 步 · 换个查法再试一遍(带错误回显)

🤖 AI助手:
🟢 作用: 用带错误回显的 curl 重测本机 IPv6 HTTP, 并用 getent ahostsv6 替代 dig 查两个域名的 AAAA 解析|风险: 无

curl -6 -I --max-time 5 'http://[2402:4e00:c011:3b00:7c2e:91f4:2406]/'; echo ===; getent ahostsv6 soft.7ehl.com; echo ===; getent ahostsv6 blog.7ehl.com; echo ===done
❯ curl -6 -I --max-time 5 'http://[2402:4e00:c011:3b00:7c2e:91f4:2406]/'; echo ===; getent ahostsv6 soft.7ehl.com; echo ===; getent ahostsv6 blog.7ehl.com; echo ===done

第 16 步 · 找到根因:地址少写了末尾那组 :0,用完整地址重测

🤖 AI助手:
🟢 作用: 用完整 IPv6 地址(实际是 2402:4e00:c011:3b00:7c2e:91f4:2406:0,之前少了末尾 :0 属非法地址)本机验证 nginx 的 v6 80/443 监听是否真正可访问|风险: 无

之前 curl 报 bad range in URL、tcptest 报 不知道这样的主机,根因都一样:把 8 组地址的最后一组 :0 截掉了,地址非法而非服务不通。getent 已确认两个域名都解析到该 IPv6。现在用完整地址重测:

curl -6 -sI --max-time 5 'http://[2402:4e00:c011:3b00:7c2e:91f4:2406:0]/' | head -3; echo ===; curl -6 -skI --max-time 5 'https://[2402:4e00:c011:3b00:7c2e:91f4:2406:0]/' | head -3

预期:两段都返回 HTTP/1.1 200(或 301/宝塔默认页头),说明 nginx v6 服务正常;若通了,下一步再用正确地址做外部 tcptest。

❯ curl -6 -sI --max-time 5 'http://[2402:4e00:c011:3b00:7c2e:91f4:2406:0]/' | head -3; echo ===; curl -6 -skI --max-time 5 'https://[2402:4e00:c011:3b00:7c2e:91f4:2406:0]/' | head -3

第 17 步 · 用域名强制走 IPv6,实测两个站点

🤖 AI助手:
🟢 作用: 用域名(强制走 IPv6)实测 soft/blog 两个站点, 确认 vhost 按 SNI/Host 正常响应|风险: 无

curl -6 -sI --max-time 5 http://soft.7ehl.com/ | head -3; echo ===; curl -6 -skI --max-time 5 https://blog.7ehl.com/ | head -3
❯ curl -6 -sI --max-time 5 http://soft.7ehl.com/ | head -3; echo ===; curl -6 -skI --max-time 5 https://blog.7ehl.com/ | head -3

第 18 步 · 再用完整地址从外部实测,收工

🤖 AI助手:
本机 IPv6 侧已全部通了:直连 IPv6 80/443 返回 200、两个域名 AAAA 解析正确、https blog 返回 HTTP/2 200。还差最后一步——用完整地址(之前 tcptest 失败是因为地址少了一组 :0)从外部再实测一次可达性。

❯ 调用工具: tcptest [2402:4e00:c011:3b00:7c2e:91f4:2406:0]:80, tcptest [2402:4e00:c011:3b00:7c2e:91f4:2406:0]:443

🤖 AI助手:
✅ 完成

IPv6 网站已全通: nginx 各站点已加 listen [::]:80 / listen [::]:443, nginx -t 通过并已生效
外部实测: http://[2402:4e00:c011:3b00:7c2e:91f4:2406:0]/ 和 https://[...]/ 的 80/443 均 TCP 可达 ✅
交付地址(IPv6): 2402:4e00:c011:3b00:7c2e:91f4:2406:0(域名 soft.7ehl.com / blog.7ehl.com 若已加 AAAA 记录即直接可用)

一句话总结: 站点的 IPv6 80/443 已对外开放、实测可达,本项配置完成。
✅ 任务结束(AI 不再给命令)。

🧠 记忆已更新(指纹 + 机器档案 + 通用经验 + 你的偏好)

工具地址:https://rdp.7ehl.com