skills/ip-diagnosis/SKILL.md
在 macOS + Chrome 上排查公网 IPv4/IPv6 出口、国家/地区、ASN/组织、DNS、默认路由、utun 状态,以及浏览器侧 Server Response 与 WebRTC 暴露情况。适用于用户要求检查 IP、地区一致性、VPN/代理接管情况、IPv6 问题或浏览器网络暴露,并输出详细运维报告与复查链接。
npx skillsauth add pangcheng1849/g-claude-code-plugins ip-diagnosisInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
在 macOS + Chrome 上做详细网络诊断,并输出固定结构的运维报告。
当用户要求以下任务时使用本技能:
IPv4 / IPv6IPv4/IPv6 是否地区分裂本技能默认针对当前机器执行,不询问是否继续。
Server Response 看到公网 IP,本身不等于浏览器泄露Via WebRTC 暴露出额外私网或异常公网地址时,才判浏览器侧泄露风险先检查:
command -v curl
command -v dig
command -v jq
command -v python3
command -v npm
command -v playwright-cli
command -v brew
open -Ra "Google Chrome"
默认依赖:
curldigjqpython3npmplaywright-cliGoogle Chrome安装规则:
playwright-cli 缺失但 npm 不存在,且 brew 可用:
brew install node
playwright-cli 缺失:
npm install -g playwright-cli
playwright-cli open --help
Google Chrome 不存在,明确写出阻塞项并停止;不要自动降级到其他浏览器playwright-cli 能运行,但 chrome 浏览器通道打不开,再尝试:
playwright-cli install-browser --browser chrome
jq 缺失且 brew 可用:
brew install jq
python3 缺失且 brew 可用:
brew install python
如果关键依赖无法安装,报告中明确写出阻塞项并停止,不要伪造结论。
按顺序执行:
route -n get default
route -n get default | awk '/interface:/{print $2}'
networksetup -listallhardwareports
netstat -rn -f inet6 | sed -n '1,80p'
scutil --dns
ifconfig | grep -E -A3 '^(en0|en1|utun[0-9]+):'
然后:
route -n get default 提取当前默认接口,例如 en0networksetup -listallhardwareports 把接口映射到对应的网络服务名networksetup -getinfo "<实际服务名>"
networksetup service unresolved,不要硬编码成 Wi-Fi目标:
IPv6 默认路由是否经由 utunutunIPv6DNS 是否像隧道私网解析器或本地直连解析器至少执行:
curl --connect-timeout 8 --max-time 15 -4sS https://api.ipify.org
curl --connect-timeout 8 --max-time 15 -6sS https://api64.ipify.org
curl --connect-timeout 8 --max-time 15 -4sS https://ipinfo.io/json
curl --connect-timeout 8 --max-time 15 -6sS https://ipinfo.io/json
curl --connect-timeout 8 --max-time 15 -4sS https://ifconfig.co/json
curl --connect-timeout 8 --max-time 15 -6sS https://ifconfig.co/json
curl --connect-timeout 8 --max-time 15 -4sS https://api.ip.sb/geoip
curl --connect-timeout 8 --max-time 15 -6sS https://api.ip.sb/geoip
dig +short txt ch whoami.cloudflare @1.1.1.1
要求:
IPv4 和 IPv6-6 查询失败,不要立刻判“没有 IPv6”::ffff:x.x.x.x 这类 IPv4-mapped IPv6,不要把它当成独立公网 IPv6必须使用:
推荐顺序:
playwright-cli open --browser=chrome https://webbrowsertools.com/ip-address/
playwright-cli eval "document.title"
playwright-cli eval "document.body.innerText"
playwright-cli snapshot
如需要,可再读取:
playwright-cli console
playwright-cli network
如果出现以下任一情况:
请稍候Just a momentVerify you are humanCloudflare 挑战页playwright-cli network 或控制台显示主页面请求 403IP Addresses、From Server Response、Via WebRTC 这些关键分组则执行一次受限重试:
playwright-cli close
playwright-cli open --browser=chrome --headed --persistent https://webbrowsertools.com/ip-address/
playwright-cli eval "document.title"
playwright-cli eval "document.body.innerText"
playwright-cli snapshot
如果重试后仍然是挑战页、403、或关键分组缺失:
blocked by challenge / partial / unavailablewebbrowsertools 标成“浏览器侧验证受阻,需人工复查”报告里尽量详细记录这些动态结果分组:
IP AddressesFrom Server ResponseRemote DataRemote IP ServicesVia WebRTC如果页面上能看到具体行,尽量逐项列出,不要简单摘要。
重点字段通常包括:
HTTP_CLIENT_IPHTTP_CONNECTING_IPHTTP_COUNTRY_CODEHTTP_X_FORWARDEDHTTP_X_CLUSTER_CLIENT_IPHTTP_FORWARDED_FORHTTP_FORWARDEDipapi.cohostip.infoipify.org [IPv4]ipify.org [IPv6]ipecho.netSTUN/WebRTC 行必须按以下结构输出。
正常 / 有保留风险 / 明显异常结论判定要求:
IPv6 Off,且:
Via WebRTC 额外地址IPv6
则默认写成 正常(IPv6 已关闭)IPv6 未确认就写成 有保留风险IPv6 仍然活跃但状态不清时,才升级为 有保留风险IPv4:<ip 或 未确认>IPv6:<ip 或 未确认>DNS:<解析器摘要>Default route:<网关 / 接口>utun:<存在 / 不存在 + 简述>IPv6:<摘要>IPv4
IPv6
如果某个来源失败,明确写:
Failed to fetchtimeoutblocked无独立公网 IPv6 证据待核实如果活跃网络服务明确显示 IPv6 Off,并且本地接口没有全局 IPv6:
IPv6 证据优先写成 无独立公网 IPv6 证据(IPv6 已关闭)待核实IPv6 已关闭 以 networksetup -getinfo "<实际服务名>" 返回的 IPv6: Off 为准success / partial / blocked by challenge / unavailableIP AddressesFrom Server Response 各项Remote Data 各项Remote IP Services 各项Via WebRTC 各项必须显式回答:
IPv4/IPv6 地区分裂:是 / 否 / 待核实是 / 否 / 部分一致WebRTC 泄露:是 / 否 / 待核实Server Response 中看到的公网地址是否只是直连网站的正常现象:是 / 否IPv6:是 / 否 / 待核实是 / 否每条建议都要写:
建议顺序按优先级从高到低排列。
如果观察到 IPv4 与 IPv6 国家/地区不一致,必须给出 macOS 关闭 IPv6 的具体方式:
networksetup -listallnetworkservices
networksetup -setv6off "Wi-Fi"
如果需要恢复,补充:
networksetup -setv6automatic "Wi-Fi"
并明确提示用户:如果当前使用的网络服务不是 Wi-Fi,应先从 networksetup -listallnetworkservices 输出中找到正确服务名再执行。
如果观察到 Via WebRTC 暴露了额外私网或异常公网地址,可以把 Chrome 扩展作为浏览器侧缓解选项之一:
说明要点:
WebRTC 路由与隐私设置来减少私网和公网地址暴露WebRTC 的音视频或实时通信站点WebRTC 暴露问题,不解决网站通过正常直连请求看到的 Server Response如果观察到某些站点显示的 AS Name / ASN 与当前 HTTP 出口 IP 的归属不一致,补充一条低优先级建议:
HTTP 出口 IP 与多数外部来源一致,但某个站点展示的 DNS ASN / AS Name 指向其他组织或运营商DNS 解析器归属,而不是额外公网 IP 泄露;由用户自行决定是否继续处理HTTP 出口和 DNS 解析器,页面上的 AS Name 可能反映递归解析器的 ASN,而不是当前网页连接出口的 ASN如果用户决定继续处理该问题,只把下面这些动作作为可选项,不要默认推荐成必须修复:
macOS 系统 DNSDoHDNS 的客户端或模式并明确说明:
DNS ASN 暴露通常不按高风险处理至少包含:
如果已经确认了具体公网 IP,建议额外给出把该 IP 直接带入的复查链接:
https://ping0.cc/ip/<detected-ip>https://iplark.com/<detected-ip>https://ipinfo.io/<detected-ip>这里的 <detected-ip> 应替换成报告中已确认的实际 IPv4 或 IPv6,不要硬编码成历史示例值。
当 WebRTC 暴露是问题的一部分时,一并给出:
From Server Response 看见公网 IP:
Via WebRTC 暴露额外私网或异常公网地址:
IPv4 和 IPv6 国家/地区不同:
macOS 关闭 IPv6 的具体命令IPv6 查询失败,但本地接口和路由表显示仍有 IPv6:
IPv6 状态待核实IPv6 Off,且本地接口没有全局 IPv6,外部来源也没有独立公网 IPv6 证据:
是否确认存在独立公网 IPv6 写 否是否存在 IPv4/IPv6 地区分裂 写 否(IPv6 已关闭)有保留风险utun 上的 fe80::、链路本地 IPv6 地址、或残留 inet6 路由,不能单独推翻这个结论来源不一致,需复查AS Name / ASN 与 HTTP 出口 IP 归属冲突,但 HTTP 出口 IP 本身在多数来源上一致:
DNS 解析器DNS ASN 与 HTTP 出口 ASN 不一致发现隐藏真实 IP 或 发生额外公网 IP 泄露IPv6 证据:
未确认独立公网 IPv6IPv6 正常优先用这些来源做交叉验证:
其中 webbrowsertools 只作为浏览器交叉验证页,不作为唯一真值来源。
IPv4Server Response 直接写成浏览器泄露IPv6 状态前草率下结论development
Design failing tests for complex features using Independent Evaluation — dispatches a context-free agent that sees only the requirement spec and code paths (not the implementation approach), then returns executable failing tests. Use when starting TDD for a non-trivial feature, when the requirement is ambiguous enough that biased tests are a risk, or when the user asks for independent test design.
tools
Plan how to slice a non-trivial coding task across parallel subagents. Returns a dispatch plan (file assignments, dependencies, output-format contracts) — the main Agent then executes it with the Agent tool + `isolation: "worktree"`. Invoke only when work justifies multi-agent overhead: (a) greenfield 0→1 across multiple independent modules, (b) change touches ≥3 modules, or (c) ≥5 files each with >50 lines of diff. Small changes write inline.
tools
通过 Gemini CLI 将编码、审查、诊断、规划和结构化输出任务委派给独立的 Gemini 会话。使用场景包括 `gemini -p` 非交互执行、`gemini -r latest` 续接最近会话、`gemini -r "<session-id>"` 指定会话恢复,以及需要 `--output-format json` / `stream-json`、`--approval-mode plan` 只读审查、`--sandbox` 隔离执行,或 `--worktree` 在独立 git worktree 中跑任务的 scripted / CI 调用。
tools
通过 Codex CLI 将编码、审查、诊断、规划、结构化输出和本机浏览器调研任务委派给独立的 Codex 会话。使用场景包括 `codex exec` 新建任务、`codex exec resume` 续接多轮会话、`codex exec review` 做只读审查,以及需要 `--json` 事件流、`-o` 最终消息落盘、图片输入或 Computer Use 浏览器操作时。