Skip to content

docs: add enterprise network deployment guide - #87

Merged
okdistribute merged 18 commits into
mainfrom
rae/enterprise-networks
Jul 30, 2026
Merged

docs: add enterprise network deployment guide#87
okdistribute merged 18 commits into
mainfrom
rae/enterprise-networks

Conversation

@okdistribute

@okdistribute okdistribute commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

A network deployment guide aimed at the person who has to approve iroh on a corporate network, rather than at the developer shipping the application. The reader assumed here is an IT manager at a small or medium business: wary of what this software will do on their network, not a network specialist, and without an iroh developer sitting next to them.

The structure follows what that reader has to decide. A one-minute summary, a direct answer to whether iroh defeats their firewall, a security and privacy FAQ, and troubleshooting organized by symptom rather than by subsystem. Changes made on the network are separated from changes made in the application, since only the first kind is theirs to make. The framing throughout is STUN and TURN, because anyone who has configured a conferencing system has already reasoned through these trade-offs once.

Facts came from iroh v1 rather than from the existing docs, several of which are stale on this. Worth a check from someone who knows the relay internals:

  • Relay connections are HTTPS on 443 upgrading to a WebSocket, with latency probes at GET /ping. Called out for readers running application-aware firewalls, which may permit 443 but block the upgrade.
  • Address discovery is UDP 7842. STUN and port 3478 are gone in v1, though troubleshooting.mdx still shows stun_port: 3478 in its sample output. Left alone as separate cleanup.
  • Certificate verification uses compiled-in Mozilla roots and ignores the OS trust store, so TLS-intercepting proxies break relay connections until CaTlsConfig::system() is set. This is the most likely thing on the page to bite a real user.
  • The pkarr publisher defaults to AddrFilter::relay_only, so internal IP addresses are not published to the public DNS server. Stated plainly in the privacy FAQ, since it is the reassuring answer to a question this audience will definitely ask.
  • proxy_from_env() and the relay access config (allowlist, denylist, shared_token, http) did not appear to be documented anywhere.

Two behaviors inferred from reading socket/transports/relay/actor.rs that I would like confirmed, since the multi-site section rests on them. First, that a device connects to the peer's home relay rather than its own. Second, that start_active_relay will dial a relay absent from the local relay map but find no auth token for it, so an authenticated relay refuses the connection. The guide presents the second as the reason to ship identical relay configuration to every site.

Also worth a second opinion on the claim that roughly one connection in ten needs a relay. That came from the existing relay and NAT traversal pages rather than from any measurement I did.

🤖 Generated with Claude Code

okdistribute and others added 4 commits July 27, 2026 18:49
Corporate networks are where iroh deployments hit friction, and the
answers have lived in the source tree rather than the docs: which ports
and hostnames an endpoint actually touches, that the relay path is a
WebSocket over TLS on 443, that certificate verification ignores the OS
trust store, and that the relay ships an access control config.

The guide is organized around what a network administrator has to decide
rather than around iroh's internals. It leads with the fact that iroh
works with UDP blocked entirely, since that is the question enterprise
reviews open with, and treats allowing UDP as an optimization to argue
for rather than a requirement to concede.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The first draft assumed a network engineer at a large company. The real
reader is closer to an IT manager at a small or medium business who has
been handed a piece of software to approve, is wary of it, and does not
spend their day writing firewall rules.

Reorganized around what that reader has to decide rather than around
iroh's internals: a one-minute summary, a direct answer to whether this
defeats their firewall, a security and privacy FAQ, and troubleshooting
organized by symptom. Network changes are now separated from application
changes, since only the first kind is theirs to make. Terms are defined
on first use and anchored to STUN and TURN, which anyone who has set up
a conferencing system has already reasoned about once.

Also drops the hole-punching-only relay server configuration. It is a
sharp edge that does not belong on a page aimed at this reader.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Listing two sets of hostnames made the reader stop and work out which
one applied to them, at the point in the page where they just want
something to paste into a firewall rule. Anyone still on a pre-1.0
release has a version question to answer anyway, and the page already
tells them to confirm the configured hostnames with their developers.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@okdistribute
okdistribute requested review from flub and matheus23 July 28, 2026 02:15
okdistribute and others added 2 commits July 27, 2026 19:16
The page read as though every deployment uses the public relays, when
most production users either self-host or buy dedicated relays. That
framing sends the reader off to allowlist four hostnames that are
probably not the ones their application uses.

The hostname section now starts from the question the reader has to
answer, which relays the application is pointed at, and treats the
public defaults as the third case and a sign the application has not
been configured yet. The privacy answers are phrased for relays in
general, including the point that running the relay yourself buys
control of the path but still not visibility into the contents.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The two pages answer to different readers, so the network material stays
in one place and the FAQ points at it rather than restating it. Four
entries now link across: relay confidentiality, self-hosting, limiting
which endpoints connect, and ports.

"What ports does iroh use?" did not name a port a firewall administrator
could act on, which is the one question they are most likely to search
for, so it now lists 443, the two local UDP sockets, and 7842. Also adds
an entry for the case where a security team rather than a developer is
the one asking.

Corrects the relay count, which said three in one answer and four in
another. Four is right.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Comment thread deployment/enterprise-networks.mdx Outdated
Comment thread configuring-networks.mdx
Comment thread deployment/enterprise-networks.mdx Outdated
Comment thread deployment/enterprise-networks.mdx Outdated
Comment thread deployment/enterprise-networks.mdx Outdated
Comment thread deployment/enterprise-networks.mdx Outdated
Comment thread configuring-networks.mdx Outdated
Comment thread deployment/enterprise-networks.mdx Outdated
@flub

flub commented Jul 28, 2026

Copy link
Copy Markdown

First, that a device connects to the peer's home relay rather than its own.

Yes, that is correct. You always connect to the home relay of the destination endpoint/the endpoint being dialed.

Second, that start_active_relay will dial a relay absent from the local relay map but find no auth token for it, so an authenticated relay refuses the connection.

Yes, this is also correct. We probably could do with some mechanism to also include auth tokens in EndpointAddr as that's a feature request waiting to happen I guess.

Also worth a second opinion on the claim that roughly one connection in ten needs a relay. That came from the existing relay and NAT traversal pages rather than from any measurement I did.

That's globally probably about true. Though since this is targetting network operators it is worth pointing out that from their side they can configure things so that it is 100% relayed with no successful nat traversal. Given a certain network setup iroh can either holepunch or not. There is no "it can holepunch some of the time on this network" (that would be a bug). But of course the network of the peer also matters which might not be under the same person's control.

Comment thread deployment/enterprise-networks.mdx Outdated
Comment thread configuring-networks.mdx Outdated
Comment thread configuring-networks.mdx Outdated
Comment thread configuring-networks.mdx
Comment thread deployment/enterprise-networks.mdx Outdated
Comment thread configuring-networks.mdx
Comment thread configuring-networks.mdx Outdated
Comment thread configuring-networks.mdx Outdated
Comment thread configuring-networks.mdx Outdated
Comment thread about/faq.mdx Outdated
okdistribute and others added 12 commits July 28, 2026 12:19
Co-authored-by: Franz Heinzmann <frando@unbiskant.org>
Co-authored-by: Franz Heinzmann <frando@unbiskant.org>
"Allow outbound TCP 443" reads as satisfied by an ordinary HTTPS rule,
which is how someone running a web filter or application-aware firewall
ends up with a relay that never connects. The required-traffic table now
carries a protocol column naming the upgrade, with a warning saying
plainly that opening 443 is not always enough, and the relay connection
is described as an upgraded HTTPS request where the reader first meets
it.

Also completes the page move to configuring-networks so the nav entry
resolves, and repoints the cross-links from the FAQ and the
troubleshooting page.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
They answer questions about iroh rather than about a firewall, so they
belong with the rest of the security and privacy material where a
developer fielding a review will look for them. The network guide keeps
the heading and points across, so the administrator reading that page
still lands on the answers.

Two edits the move required. The relay access answer linked to an anchor
that only existed on the network page, so it now links across. The "what
leaves our network" answer deferred its IP disclosure point to prose
that is now above it on the same page.

Also notes that relay visibility ends once a connection goes direct,
which the FAQ already said and this section had dropped.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A device does not only connect to the relays it was configured with. To
reach a peer it dials whichever relay that peer selected as its home,
which need not be one of yours. Listing only the configured relays
understated the egress.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two claims were wrong. Endpoints do listen for incoming connections on
the UDP sockets they bind, and port mapping is a default feature with
PortmapperConfig::Enabled as its default, so on a gateway that honors
UPnP, NAT-PMP or PCP iroh will get an external port opened. Telling a
network administrator that nothing listens and no port is ever forwarded
is the kind of thing that destroys trust in the rest of the page when
they find out otherwise.

What is true is narrower: there is no inbound rule for you to write,
because return traffic arrives on a flow already allowed outbound. The
port mapping exception is now stated in the summary, in the reasons for
allowing UDP, and in its own section, which leads with the perimeter
change rather than with the IDS noise it makes.

Also notes that a relay is never told when a pair goes direct, so it
cannot tell a pair still talking directly from one that disconnected,
which limits what its metadata supports inferring.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@okdistribute
okdistribute marked this pull request as ready for review July 30, 2026 02:24
@okdistribute
okdistribute merged commit 0dd9475 into main Jul 30, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants