Skip to main content

Ports and firewall

Since 08.10.2026 the calendar and identity roles are one role, directory: one service, the role's name dir.<domain> (directory, console, portal, the calendar under /cal, CalDAV on the name's root), both private ports.

Applies to: SimpleTwo 0.9.x · Checked: 02.10.2026

Firewall rules on role hosts are set by the agent itself, from the same description it installs the service from. This page is for the case where another firewall sits between your networks: that one is configured by you, not by the agent.

1. What must be reachable from the internet​

RolePortWhy
coordinator80/tcpdomain-validation challenge (ACME) and the redirect to HTTPS
coordinator443/tcpAPI, console, the client download page
messaging9090/tcp or 443/tcpclients; 443 when the service terminates its own TLS
directory443/tcpsign-in (OpenID Connect, SAML), the person's portal /me, /admin — a redirect to the coordinator's console, the calendar /cal (subscriptions), CalDAV and CardDAV /dav/; opened only when the host has a public name — its own, or through the organisation's NAT
mail443/tcpmail for the clients (JMAP and its push); opened only when the host has a public name
sfu443/tcpsignalling when the node sits behind a TLS edge
sfu7880/tcpsignalling directly — opened only when there is no edge
sfu7881/tcpmedia fallback over TCP
sfu50000–60000/udpthe streams themselves
turn3478/udp + 3478/tcpNAT traversal
turn443/tcpthe same over TLS (turns:) — for networks that leave only HTTPS open; opened only once the certificate is on disk
turn49152–65535/udprelay
mcu5061/tcpSIP over TLS (_sips._tcp) — the way in for meeting-room terminals; opened only once the node has a public name and its certificate is on disk — the coordinator orders it
mcu5060/udp + 5060/tcpopen SIP — only with the device transport «TLS and open SIP»; closed by default (see below)
mcu80/tcponly while the SIP-TLS certificate is being issued (the domain-validation challenge)
mcu10000–20000/udpmedia: voice, video, presentation, BFCP over UDP
mcu10000–20000/tcppresentation control (BFCP over TCP): the device connects to the MCU; from agent 0.5.76
gateway443/tcp and the ports of enabled transportsclient tunnels
monitoring443/tcpthe way into the monitoring interface — the only port people reach; where it is visible from (the internet or only your network) is your choice
monitoring80/tcponly while a certificate is being issued (the domain-validation challenge)
mx25/tcpmail from the internet (MX) and messages from password-less devices in the networks set in the console; the agent opens it itself. Whether mail from the internet arrives here is decided by the MX record in your DNS
drive443/tcpfiles for clients and external links /d/…; the service obtains its certificate there itself (TLS-ALPN-01). Opened only when the host has a public name (see files)
mx587/tcp, 465/tcpsubmission with an app password: 587 is STARTTLS, 465 is TLS; opened only when the host has a public name and a certificate

5060 is closed on mcu by default. Whether it opens is the setting Telephony → SIP SRV records → Device transport (in detail — meeting rooms, section «Device transport»):

  • «TLS only» (the default) — the node does not listen on 5060 and the agent closes it in the firewall. A device comes in over SIP-TLS: by its own certificate, or, as the exception, with a user name and password (SIP digest with SHA-256).
  • «TLS and open SIP» — 5060 UDP and TCP is open. Only devices that cannot speak SIP-TLS at all need it: plain SIP carries no certificate, so such a device can sign in only with a user name and password.

«TLS only» takes effect only once SIP-TLS is up: with no certificate on disk 5060 stays open and the node reports why. A node that listens nowhere is worse than one that listens in the clear.

There are two mx nodes by design, each with its own public address — the ports are the same on both. Until your DNS has an MX record pointing at an mx node, no mail from the internet comes in; more in mail.

A port opens when there is something behind it to answer

This is a rule rather than a configuration detail: turn does not announce TLS on 443 until it has a certificate, mcu does not announce 5061 until its certificate is on disk, and directory, mail and drive do not open 443 until the host has a public name. A port that accepts a connection and cannot finish the handshake is read by a carrier as our fault and by a scanner as an invitation.

2. What must not be reachable from the internet​

RolePortOpen it to
postgres5432/tcponly the hosts of the services that use it
redis6379/tcponly messaging, sfu, mcu, recorder
s39000/tcponly messaging and recorder; it listens on one private leg, not on every interface
support8087/tcponly the messaging hosts, and only signed webhooks; the agent opens the port to them only
messaging9091/tcpthe control API: loopback only by default
directory8086/tcpthe coordinator: the private HTTP the console writes to identity through
mail8087/tcpthe coordinator and the platform's services: private HTTP
mail24/tcpLMTP — the door mx hands mail in through; only the mx hosts
mail8087/tcpthe mx hosts too: the edge takes its list of recipients from there
mx2525/tcponly the mail nodes: the cluster hands its outbound mail to the edge there
drive8088/tcp (the default; the console's listen setting changes it)the files' private HTTP for the coordinator and services; clients use 443 on the public name
directory (calendar)8085/tcpthe coordinator and the platform's services: private HTTP

From agent 0.5.111 the roles' internal HTTP — by default directory 8085 and 8086, mail 8087 and LMTP 24, mx 2525, drive 8088 — listens on the host's private address only, when the host holds it; otherwise on every interface, with the reason in the agent's log. The allow-lists (redis, s3, monitoring 4319, postgres, mail 24, mx 2525, support) are reconciled by the agent, which drops sources that are gone; rules written by agents before 0.5.111 stay until removed by hand. | monitoring | 4319/tcp | telemetry from the other hosts, on the private address. The agent opens it only to the addresses of the hosts that send, and a request without the token is refused |

On loopback (127.0.0.1) only, and never opened outward: the services' /metrics — coordinator 9101, messaging 9091, directory 9103, support 9104, mail 9105, mx 9106, drive 9107, the mx admin listener 8088; on the monitoring host its stores 8428, 9428, 10428 and Grafana 3000; on every host with a telemetry collector, 4318.

On the bus and storage hosts a firewall is mandatory

Neither redis nor s3 has authentication strong enough to stand open even on a private network: the boundary is the firewall rule. Installing the s3 role on a host without one is refused rather than leaving the store open.

3. Outbound​

ToPortWho and why
Let's Encrypt443/tcpthe coordinator and the services that issue their own certificates
GitLab / image registry443/tcpupdates and agent distribution
APNs, FCM443/tcpmessaging — pushes to devices
model provider443/tcpmessaging — the AI lane, when it is enabled
the organisation's sign-in provider (ADFS, Entra, Keycloak)443/tcpthe coordinator and directory — signing in through it
AD or another LDAP directory389/tcp or 636/tcpthe coordinator and directory — reading people and groups
the recipients' mail servers25/tcpmx — sending out: by the recipient's MX record, with STARTTLS when the server offers it
the monitoring host4319/tcp, private networkthe collector on every host with a private address — telemetry
dl.grafana.com443/tcpthe coordinator, once: the Grafana archive for the monitoring host, checked against the hash in the image
meeting-room terminals (Poly, Cisco)5061 (5060 only with «TLS and open SIP») + 10000–20000 to the mcu hostinbound to mcu
the carrier's SIP trunk5060/5061 + RTPthe pstn role, the PSTN gateway; not mcu
role hosts22/tcponly hosts provisioned over SSH. A host enrolled with the join command needs no inbound SSH: its agent fetches its own state from the coordinator

4. How to check​

# is the role listening at all (on the host itself)
ss -tlnp | grep -E ':(24|25|443|465|587|2525|7880|7881|9090|8085|8086|8087|8088|5060|9000|4319)\b'

# is it visible from outside
nc -z -w 5 <address> 443 && echo ok

"From inside" and "from outside" answer different questions: the agent watches whether anything is listening on the host, the coordinator's console whether a client can reach it. A host that fails the first is misconfigured; a host that fails the second is unreachable.