docs: add enterprise network deployment guide - #87
Conversation
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>
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>
Yes, that is correct. You always connect to the home relay of the destination endpoint/the endpoint being dialed.
Yes, this is also correct. We probably could do with some mechanism to also include auth tokens in
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. |
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>
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:
GET /ping. Called out for readers running application-aware firewalls, which may permit 443 but block the upgrade.troubleshooting.mdxstill showsstun_port: 3478in its sample output. Left alone as separate cleanup.CaTlsConfig::system()is set. This is the most likely thing on the page to bite a real user.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 relayaccessconfig (allowlist,denylist,shared_token,http) did not appear to be documented anywhere.Two behaviors inferred from reading
socket/transports/relay/actor.rsthat 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, thatstart_active_relaywill 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