Skip to content
Fixedmark
Dedicated inbound IP

Inbound

Updated

Dedicated inbound IP: the add-on

Tunnels are the base inbound product, on shared ingress IPs. The dedicated inbound IP is an add-on on top: it places a route on one Fixedmark IP of your own, so partners allowlist your address and traffic arrives only there. A dedicated route can also reach a host origin the node dials, with no connector. It passes each partner connection, byte for byte, to that origin.

Docs preview: Fixedmark is not live yet. Endpoints are issued at launch, and these pages describe planned launch behavior. Anything marked planned may change. Join early access to get yours first.

When to add a dedicated IP

  • Start with a tunnel. A hostname route on the shared pool needs no IP of your own and fails over between two nodes.
  • Add a dedicated IP when a partner must allowlist one address that is yours alone, or when your traffic must arrive only at your address.
  • Add one when the origin is a host the node dials, such as a server with a public address. A shared route always takes a connector origin.
  • Add one for your own host names on 443, routed by SNI. See your own names.

The add-on changes where a route is placed, not what it is. A dedicated route has the same kinds, partners, logs, and webhooks as a tunnel, and fm routes placement moves a route between the two. See Move a route.

Before you start

  • The add-on, on Pro and up at $9 per IP-month, billed by the hour for each dedicated IP while it holds a route, on top of the plan. Each plan's dedicated inbound IPs are in Limits. A plan without it refuses a dedicated route with route.dedicated_not_entitled (402).
  • Tunnels are on Pro and up, and a plan without them refuses every route with route.tunnel_not_entitled (402).
  • A dedicated IP of the app, in the region your partner expects. fm ips list prints its id and address.
  • An origin for your partner's traffic, as a host name with an A record or a public IPv4 address, and its port. Private, loopback, link-local, CGNAT, multicast, and metadata addresses are refused, and so are Fixedmark's own addresses and the mail ports 25, 465, and 587.
  • The partner's source addresses, as IPv4 addresses or CIDRs. Ask the partner for the list they publish for outbound traffic.

Create the route

Name the app, the dedicated IP, the origin, and every partner range. Repeat --partner for each one. Leave out --port and the route takes the lowest unused port from 20000.

fm routes create --app APP_ID --kind tcp --name db \
  --dedicated-ip IP_ID \
  --origin app.example.com:5432 \
  --partner 198.51.100.0/24

The API answers 202 with the route and a job_id. fm prints the route, then watch it with: fm jobs watch JOB_ID. Send the same Idempotency-Key again to repeat a create safely.

Wait for the route to open

Terminal
fm jobs watch JOB_ID
fm routes list --app APP_ID

The job checks the origin, writes the route, pushes it to the node, and waits for the node's listener. GET /v1/jobs/JOB_ID/events streams the same steps. The route's state then reads:

Route states
StateMeaning
pendingWritten, not yet listening on the node.
boundThe node listens on the port. Its firewall is not yet open to the partners.
activeThe node listens and admits the partner list. Partners can connect.
disabledFixedmark staff stopped the route, for example during abuse handling. Contact support.

Give the partner the address

Send the partner the IP's address and the route's port, such as 203.0.113.10:20000. From one of the listed source addresses, the partner checks the port opens:

Terminal
nc -vz 203.0.113.10 20000

A dedicated tcp route also gets a hostname that points at your IP, such as db.<org-slug>.<zone>, so a partner may dial the name instead. The connection reaches app.example.com:5432. Your connection log shows an ingress row with peer set to the partner's address, such as 198.51.100.7, and result ok. A source outside the list is dropped by the node's firewall before the proxy sees it.

Change the partner list

Setting partners replaces the whole list. Nodes apply the new list within seconds.

fm routes partners set --app APP_ID db \
  --partner 198.51.100.0/24 --partner 192.0.2.44
0.0.0.0/0 admits every source on the internet, and any entry wider than a /8 admits a large part of it. Each is refused with route.partner_open_to_all unless you add --allow-any, or allow_any: true in the API, and the route then carries the warning open_to_all.

Health, alerts, and logs

  • Fixedmark checks the route's listener from outside the node and its origin from the node, and shows the placement's health beside the route: healthy, listener_down, origin_down, ip_down, or unknown. The route's own health is the roll-up: healthy, degraded, down, or unknown.
  • Each change of the roll-up sends the webhook route.health to endpoints that subscribe to it.
  • Partner connections are in your connection logs with direction=ingress. Filter by peer, listener_port, or route_id.
  • Inbound bytes count toward your plan's inbound allowance, separately from outbound.

When a node fails

A dedicated route is never moved to another IP, since its partners allowlist that one address. It follows its IP. What holds the IP during a node failure depends on the region's provider. These values are provisional until Fixedmark's failover measurements on each provider are published. A tunnel fails over by DNS between two nodes instead.

Inbound standby by provider
ProviderStandbyWhat happens
LinodeStandby node shares the addressA standby node in the same region shares the address and takes over inbound routes when the active node fails.
Oracle Cloud (OCI)No standby yetNo standby holds the address. When the node fails, the address moves to a new node and routes come back once its listener is up.
VultrNo standby yetNo standby holds the address until BGP is granted on the account. When the node fails, the address moves to a new node and routes come back once its listener is up.

Limits

  • TCP routes use ports 20000 to 29999, one route per port on each IP.
  • A route admits 1 to 256 partner entries, IPv4 only. An entry inside another one on the same route is refused.
  • A connection idle for 5 minutes closes. The node gives the origin 10 seconds to accept.
  • Your plan sets how many routes, hostnames, and dedicated inbound IPs you can hold. See limits.

Refusals

Common route refusals
CodeMeaning
route.tunnel_not_entitled (402)Your plan does not include tunnels. Every route needs them.
route.dedicated_not_entitled (402)Your plan does not sell the dedicated inbound IP add-on.
route.quota, route.hostname_quota, route.inbound_ips_quotaYour plan's routes, hostnames, or dedicated inbound IPs are all in use.
route.ip_not_dedicatedThe IP is not a dedicated IP of the route's app.
route.conflict, route.port_takenAnother route on the IP has that port.
route.ports_exhaustedEvery port from 20000 to 29999 is taken on the IP.
route.origin_private, route.origin_loopback, route.origin_metadataThe origin resolves to an address Fixedmark does not reach.
route.origin_unresolvableThe origin's name has no A record.
route.origin_port_blockedThe origin port is a mail port.
route.partner_invalid, route.partners_too_manyA partner entry is not an IPv4 CIDR, overlaps another, or the list is over 256.

fm exits 2 on a malformed request (400 or 422) and prints every problem. It exits 1 on any other refusal, such as 402, 409, or 503, and prints the code. The API answers with the code in error.code.

Delete a route

Terminal
fm routes delete --app APP_ID db

The node closes the port within seconds. For TLS traffic to your own host name on port 443, use your own names instead of a TCP port.

Frequently asked questions

Does Fixedmark decrypt inbound traffic?

No. The node passes the partner's bytes to your origin unchanged. It never holds a certificate for your traffic.

Which address does my origin see?

Your Fixedmark IP. The node opens the connection to your origin from the route's IP, so the origin can allowlist that one address. The partner's own address is in the connection log.

Which providers serve dedicated inbound IPs?

Dedicated routes run on the same IPs as outbound, in every region, on Linode, Oracle Cloud (OCI), and Vultr.

Do I need the add-on for a tunnel?

No. Tunnels run on shared ingress IPs and need no IP of your own. The add-on is for routes that must arrive at an address of yours.

Make it fixed.

Fixedmark is in early access. Join the list to get dedicated static IPs when your region opens.