Get started

The reference implementation is a Python library: a MURX client, server, and node registry, plus a sample client/backend pair (using an ERP-style login as the illustrative case — the same code shape works for database brokering, game matchmaking, or any other backend pool). Source: github.com/Inxsoft/murx.

Install

git clone https://github.com/Inxsoft/murx.git
cd murx/python
pip install -e ".[dev]"       # library + test dependencies
pip install -e ".[dev,srv]"   # also pulls in dnspython for SRV discovery

Authenticate as user@domain

The client resolves which MURX server handles the domain (default: murx.<domain> on port 2743 — no DNS record required), authenticates over TLS, and follows the redirect to whichever backend node MURX picked.

import asyncio
from murx import MurxClient, resolve_murx_server, split_client_id, tls

async def main():
    client_id = "[email protected]"
    _, domain = split_client_id(client_id)
    host, port = await resolve_murx_server(domain)
    ctx = tls.client_context()   # ALPN murx/1, verifies certificates

    route = await MurxClient.authenticate(
        host=host, port=port, client_id=client_id,
        auth_data=b"hunter2", ssl_context=ctx,
    )
    reader, writer = await MurxClient.connect_to_backend(route, ssl_context=ctx)
    # reader/writer is now an authenticated session with the backend
    # node MURX routed this client to.

asyncio.run(main())

Run the demos

In one process, with no setup: a MURX server, two toy backend nodes that register over authenticated UDP, and a client.

python examples/erp_backend_demo.py
MURX server listening on 127.0.0.1:PORT (tcp+udp)
Routed to 127.0.0.1:PORT (65-byte signed token)
Backend says: ERP[erp-1]: welcome, [email protected]

In separate containers: the nodes announce their service names, so the client is redirected to a DNS name.

docker compose up --build --abort-on-container-exit --exit-code-from client
client-1  | client: redirected to erp-1:9200
client-1  | client: backend says: ERP[erp-1]: welcome, [email protected]

Run the tests

cd murx/python
pytest

The suite covers end-to-end TLS, forged, expired and replayed tokens, bad and stale UDP MACs, fuzzing of every decoder, and the byte-exact conformance test vectors that other implementations can check against. CI runs it on Python 3.9–3.13.

Inspect traffic in Wireshark

A Lua dissector decodes MURX on port 2743, including signed tokens and the UDP authentication trailer.

tshark -X lua_script:tools/wireshark/murx.lua -r capture.pcap -Y murx
NODE_ANNOUNCE node=erp-1 at erp-1.internal:9200
AUTH_CONNECT [email protected]
ROUTE_REDIRECT -> erp-1.internal:9200
AUTH_REJECT Invalid credentials

Status

This is a reference implementation of spec revision 1.1, not a production gateway. The included StaticAuthBackend is for demos and tests; real deployments plug in their own AuthBackend, add rate limiting, and provision one random secret per backend node. See Security Considerations in the spec.