relay_server
An OTP application with an esockd-based UDP server.
Build
$ rebar3 compile
Run
$ rebar3 shell
The UDP listener is configured in config/sys.config; the checked-in config
listens on port 1443, while the code fallback default is 16380. It accepts
RelayKit UDP relay frames.
Protocol
Each UDP datagram is encrypted with ChaCha20-Poly1305. The encrypted datagram
uses the same combined format as CryptoKit ChaChaPoly:
nonce(12), ciphertext, tag(16)
The decrypted plaintext is one RKP1 frame:
magic(4) = "RKP1", version(1) = 1, type(1), reserved(2),
stream_id(8), payload_len(4), payload(payload_len)
Frame types are open = 1, open_ack = 2, data = 3, close = 4, and
error = 5.
open payload is binary encoded as:
host_len(2), host(host_len), port(2),
username_len(2), username(username_len),
password_len(2), password(password_len)
Integer fields are unsigned big-endian values. host, username, and
password are binary strings. The server is a transparent TCP relay, so TLS
negotiation, HTTP methods, and request bytes are carried inside subsequent
data frames without being interpreted by the server.
username and password are checked against the relay_server application
users config:
{users, [
{admin, "password"}
]}