用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/lukemcqueen/hermes-cortex --skill wan-reachability-probing命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Cross-server agent health monitoring using binary status vectors — deploy health endpoints on each agent, poll from orchestrator, alert on state transitions.
Wire a self-hosted Langfuse instance to Hermes Agent — generate API keys, configure env vars, enable the bundled plugin, install SDK, and verify traces flow.
Use before enforcement code changes or shared-repo commits.
正在显示 SKILL.md
| name | wan-reachability-probing |
| description | Test port reachability from internet via external probes. |
| version | 0.1.0 |
| author | Hermes Cortex |
| license | MIT |
| platforms | ["linux","macos"] |
Verify whether a port/service is actually reachable from the internet when your test host sits inside the same LAN as the target — or when a peer reports you unreachable but local checks look fine.
Curling your own public IP or DDNS from inside the LAN is inconclusive: most routers don't support NAT hairpin, so even a perfectly OPEN port returns HTTP 000/timeout from inside. A 000 from a hairpin test is NOT evidence of a closed port. Verified 2026-08-30: curl https://<PUBLIC_IP>:8443/ from inside → 000, while external nodes reported 443/14007/11022 OPEN at the same moment.
Ping the target, then curl the LAN endpoint. 401/200 means the service is up locally; a LAN-side 000 IS meaningful (service/router down).
dig +short <ddns-domain> A must equal curl -s https://api.ipify.org. A stale A record is a top "can't connect" cause even when everything else is healthy.
yougetsignal-style web port checkers are Cloudflare-blocked (301). Use:
req=$(curl -s -H "Accept: application/json" "https://check-host.net/check-tcp?host=<PUBLIC_IP>:<PORT>&max_nodes=3" | python3 -c "import sys,json;print(json.load(sys.stdin)['request_id'])")
sleep 6 # nodes report asynchronously
curl -s -H "Accept: application/json" "https://check-host.net/check-result/$req"
Result shape per node:
[{"address": ..., "time": 0.3}] = OPEN[{"error": "Connection timed out"}] = CLOSEDPoll multiple nodes; majority rules.
| Probe pattern | Meaning |
|---|---|
| ALL probed ports CLOSED | WAN-level problem: ISP block, router firewall, or remote admin disabled |
| Some OPEN, some CLOSED | CLOSED ones are target-side (unforwarded, service down, host firewall); the router WAN path works |
| One port CLOSED, siblings OPEN | That specific host/service, not the router (2026-08-30: WAN:10022 peer-SSH down while 11022 SSH open) |
| Forwards OPEN but router-admin ports (8443/8080/444/81) CLOSED | FreshTomato remote admin disabled — enable Administration → Access → Remote Access, then reach at https://<ddns>:8443 |
sleep ~6 before polling the result.request_id) = API rate-limited or transient — retry once.A probe pass is verified when ≥1 external node returns a structured result (OPEN or timed-out) — an empty/no-result JSON proves nothing.
health-external-verification (user-owned): health-endpoint-specific external testing — overlaps with this skill; curator should consolidate.fresh-tomato-router (user-owned): router nvram, port-forward rules, remote-admin enable — its Verification section has the same hairpin trap.Worked example: references/wan-reachability-probe-example.md.