Install
openclaw skills install @orionshaowswmw/agent-dnstt-rendezvousAuthorization-gated coordination skill for agents that need to plan, verify, and troubleshoot a DNSTT client/server link without sharing private keys, scanning resolvers, changing DNS/firewalls, or auto-executing tunnel commands. Uses short-lived rendezvous cards, out-of-band public-key fingerprints, optional HMAC authentication, loopback-by-default services, deterministic argv plans, and secret-free status handoffs. Use only on domains, resolvers, servers, and services the operator owns or is explicitly authorized to administer.
openclaw skills install @orionshaowswmw/agent-dnstt-rendezvousA distinct, original agent-coordination layer for authorized DNSTT links. It does not implement DNSTT, copy another project's code, download binaries, scan the public Internet, change DNS/firewalls, or start processes. It helps a server agent, client agent, and optional observer agent agree on the same short-lived connection facts and produce commands for a human to review.
Use this skill when all of the following are true:
dnstt-server and dnstt-client are already obtained from a
trusted source and verified separately.Do not use it for covert access, policy evasion, unauthorized proxying, data exfiltration, public-resolver sweeps, open proxies, or hiding activity from network owners. DNSTT traffic is observable in DNS logs and is not an anonymity system.
This skill is a coordination protocol rather than a tunnel implementation:
0600; shares only the public key.card_id.planned → authorized → configured → reachable → connected → verified → closed
Failures use the failed state with a secret-free observation. Agents do not
advance state based on claims alone; each transition needs observable evidence.
The skill helper uses Python's standard library only:
python3 scripts/rendezvous.py --help
python3 -m unittest discover -s tests -v
DNSTT binaries are optional external runtime dependencies for executing a reviewed plan. This skill never downloads them.
Run the read-only doctor and complete regression suite before any release or when diagnosing unexpected behavior:
PYTHONDONTWRITEBYTECODE=1 python3 scripts/rendezvous.py doctor
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v
For structured, secret-free diagnostics, put global flags before the subcommand:
python3 scripts/rendezvous.py --debug --json-errors verify-card \
--card ./state/rendezvous-card.json \
--expected-fingerprint 'sha256:<64-lowercase-hex>' \
--hmac-env AGENT_LINK_SECRET \
--require-hmac
See DEBUGGING.md for the bug matrix, error codes, reproduction protocol,
property/fuzz/concurrency testing, and future-fix acceptance criteria.
The examples use reserved documentation names and addresses. Replace them only with infrastructure you are authorized to operate.
python3 scripts/rendezvous.py keygen-plan \
--privkey-file ./state/server.key \
--pubkey-file ./state/server.pub \
--ack-authorized \
--output ./state/keygen-plan.json
Review command_argv, run it manually, then protect the private key:
chmod 600 ./state/server.key
export AGENT_LINK_SECRET='replace-with-a-strong-shared-coordination-secret'
python3 scripts/rendezvous.py server-card \
--agent-id server-agent-a \
--domain t.example.com \
--pubkey-file ./state/server.pub \
--listen 0.0.0.0:5300 \
--upstream 127.0.0.1:8000 \
--expires-minutes 30 \
--authorization-ref LAB-2026-001 \
--purpose 'authorized agent message service' \
--hmac-env AGENT_LINK_SECRET \
--ack-authorized \
--output ./state/rendezvous-card.json
The card contains a public key, never a private key. Send the displayed
sha256:<64hex> public-key fingerprint to the client through a separate,
authenticated channel. Operational plans require an HMAC-authenticated card by
default; --allow-unsigned-card is an explicit offline-workflow waiver, not a
normal convenience flag.
python3 scripts/rendezvous.py server-plan \
--card ./state/rendezvous-card.json \
--privkey-file ./state/server.key \
--hmac-env AGENT_LINK_SECRET \
--ack-authorized \
--output ./state/server-plan.json
The helper refuses private key files with group/world permissions. It does not modify DNS, firewall rules, services, or systemd.
python3 scripts/rendezvous.py verify-card \
--card ./state/rendezvous-card.json \
--expected-fingerprint 'sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' \
--hmac-env AGENT_LINK_SECRET
Use the real fingerprint received out of band. A mismatch is a hard stop.
python3 scripts/rendezvous.py client-plan \
--card ./state/rendezvous-card.json \
--expected-fingerprint 'sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' \
--transport udp \
--resolver 192.0.2.53:53 \
--local-listen 127.0.0.1:7000 \
--pubkey-file ./state/server.pub \
--hmac-env AGENT_LINK_SECRET \
--ack-authorized \
--output ./state/client-plan.json
The output contains the public-key file content and a DNSTT client argv array. It writes neither file and starts no process.
Start with planned:
python3 scripts/rendezvous.py status-report \
--card ./state/rendezvous-card.json \
--agent-id client-agent-b \
--role client \
--state planned \
--message 'card verified; awaiting operator approval' \
--expected-fingerprint 'sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' \
--hmac-env AGENT_LINK_SECRET \
--require-hmac \
--output ./state/client-planned.json
Each later state must provide the previous report. For example:
python3 scripts/rendezvous.py status-report \
--card ./state/rendezvous-card.json \
--agent-id client-agent-b \
--role client \
--state authorized \
--message 'operator approval recorded' \
--previous-report ./state/client-planned.json \
--expected-fingerprint 'sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' \
--hmac-env AGENT_LINK_SECRET \
--require-hmac \
--output ./state/client-authorized.json
Verify a chained report with its predecessor:
python3 scripts/rendezvous.py verify-status \
--card ./state/rendezvous-card.json \
--status ./state/client-authorized.json \
--previous-report ./state/client-planned.json \
--expected-fingerprint 'sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' \
--hmac-env AGENT_LINK_SECRET \
--require-hmac
Status messages containing token/password/private-key patterns or control characters are rejected. The HMAC tag authenticates the report but is not the secret itself.
python3 scripts/rendezvous.py diagnose \
--card ./state/rendezvous-card.json \
--symptom no-response \
--expected-fingerprint 'sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' \
--hmac-env AGENT_LINK_SECRET
Available symptoms:
dns-delegationkey-mismatchno-responseconnects-no-serviceintermittentDiagnostics print bounded checks. They never probe hosts or resolver ranges.
DNSTT is a userspace TCP tunnel over delegated DNS, not a full VPN. A typical
server forwards incoming streams to a single TCP endpoint, while a client
opens a local TCP listener. Exact flags differ by build/fork; always compare the
plan with the installed binary's --help before execution.
A tunnel DNS zone normally needs an NS delegation to a nameserver hostname with A/AAAA records for the authorized server. This skill does not create records. The server plan defaults to UDP port 5300 so DNSTT need not run as root; an operator may separately review port-53 forwarding. No firewall command is created here.
A full adversarial audit reproduced and fixed twelve bug classes:
The fix set adds strict schemas, bounded no-follow reads, atomic mode-0600 writes, 32-byte HMAC minimum, safe binary/path parsing, dual-consent LAN listeners, authenticated status chains, structured error codes, secret-free debug events, a read-only doctor, and fail-closed CLI handling.
Verification now includes 31 unit/regression/property/fuzz/concurrency tests: 500 signed-card round trips, 2,000 endpoint fuzz cases, 1,000 malformed JSON cases, mutation checks, and 64 concurrent atomic writers.
No source code, UI, configuration format, profile URI, branding, assets, or text was copied from the referenced projects. Architectural lessons were studied at a high level: client/server role separation, resolver-aware health, explicit profiles, key pinning, bounded service management, and clear diagnostics. This skill's card schema, HMAC handoff, state machine, safety gates, planner, tests, and documentation are original.
See references/INSPIRATION.md for project links, license boundaries, and the
specific ideas that were transformed rather than copied.