kire@net:~$ uptime seit 1998 • ddos: scharf • vhosts: geladen • identd: an • bouncer: online • bot: +o und schützt #channel

$./proxies

Port X redet mit Port Y. Optional mit TLS.

Ein Relay ist kein Produkt. Es ist ein Prozess. Login: ssh user@kire.net. Binde, wo man dir gesagt hat, dass du binden darfst. Der Platzhalter-Hostname unten ist shell.kire.net — ersetze ihn aus der Willkommensmail / dem Kundenbereich.

Was diese Seite ist. Die Shell als TCP-Forward und als Proxy, der TLS wickelt oder beendet. socat, ncat, stunnel, hitch, nginx stream, haproxy — wenn die Binary da ist. Sonst frag, oder kompiliere in $HOME. Wir segnen keine konkrete Version in einem Blogpost.

Für wen. Port X auf der Shell soll mit Port Y woanders reden, oder du brauchst TLS vor einem Klartext-TCP-Dienst, den du schon fährst. Wenn SSH -L / -D das schon tut, hör auf zu lesen und geh zu ./ssh-forwarding.

$why-a-kire-shell

Stabile IPv4 und IPv6. Ein PTR, der nicht dein Kabelmodem ist. DDoS davor. identd hat schon geantwortet. Der Laptopdeckel ist zu. Das ist trotzdem keine Wohn-Proxy-Farm, und wir tun nicht so.

$cheat-sheet

dingwas es tutwann
SSH -L / -DTunnel in der Session, die du schon hasterster Versuch. meist genug
dummes TCP-ForwardBytes rein, Bytes raus, kein TLSzwei Klartext-Ports, dieselbe Welt
TLS-HülleKlartext-Dienst + TLS außendu hast ein Cert, der Client erwartet 6697-förmige Dinge
TLS beendenTLS auf dem Weg rein, klar auf dem Weg rausdas Backend ist localhost und faul
WireGuardOverlay, kein Port-Proxynur wenn ein Tunnel nicht reicht. ./vpn

$for-beginners

Schau, was da ist, bevor du einen Schrein kompilierst:

command -v socat ncat stunnel nginx haproxy hitch

Privilegierte Ports (< 1024) gehören dir nicht. Hoch binden, oder Staff fragen. Prozesslimits bleiben Prozesslimits.

Port X auf der Shell soll mit Port Y woanders reden

socat, falls vorhanden. Auf der Shell lauschen, weiter verbinden. Beispiel: lokal 9000 → irgendein Host 6667. Hosts ersetzen.

socat TCP-LISTEN:9000,bind=127.0.0.1,fork,reuseaddr TCP:irc.example.net:6667

bind=127.0.0.1 heißt, nur die Shell kann es treffen. Das ist der richtige Default. Paar es mit SSH -L von zu Hause, wenn du es treffen musst. Den vhost öffentlich zu binden ist, wie Open Proxys geboren werden. Nicht.

Ich brauche TLS vor einem Klartext-TCP-Dienst

stunnel (oder hitch, oder nginx stream) wickelt oder beendet. Certs sind dein Problem. Ein selbstsigniertes Cert ist in Ordnung für einen Client, den du kontrollierst; nicht für Fremde.

# stunnel.conf — TLS in front of a local plain port
foreground = no
pid = /home/user/stunnel.pid
[wrap]
accept = 127.0.0.1:6697
connect = 127.0.0.1:6667
cert = /home/user/certs/fullchain.pem
key = /home/user/certs/privkey.pem

Dann stunnel ~/stunnel.conf, wenn die Binary da ist. Accept-Adresse auf Loopback lassen, außer du hast einen Grund und eine Ahnung.

$for-people-who-already-know-the-flags

Ein dummes TCP-Forward ist kein SSL-Proxy. Eines kopiert Bytes. Das andere spricht einen Handshake. Log den Handshake nicht in eine weltweit lesbare Datei. Log keine Zugangsdaten. Rotiere, was du loggst.

SNI: wenn du mehr als einen Namen auf einem Port beendest, muss der Proxy das ClientHello ansehen. nginx stream + ssl_preread, haproxy ssl, stunnel-SNI-Maps — eine Binary wählen und ihre man-Page lesen. Wir dokumentieren OpenSSL nicht nochmal.

Client-Certs: möglich. Meist mehr Zeremonie, als eine KIRE-Shell hergibt. Wenn du mTLS brauchst, hast du schon eine Config.

PROXY-Protokoll: nur wenn der nächste Hop es versteht. Es in einen Stock-ircd zu schicken macht Murks. Idle-Timeouts: setzen. Halboffene Relays sind, wie du File-Descriptor-Limits entdeckst.

SO_REUSEPORT, wenn du Worker stapelst. systemd --user für den Prozess, wenn es sein muss; er zählt trotzdem als Prozess. Kein CAP_NET_BIND_SERVICE, außer Staff hat es gesagt.

IPv4 und IPv6 gibt es hier beide. Binde die Familie, die du meintest. Ein vhost-PTR macht ein schlechtes Bind nicht magisch richtig.

Wenn der Job „mein Browser im Café-WLAN“ ist, ist das SSH -D, nicht diese Seite. Wenn der Job „ein geroutetes Netz fürs Haus“ ist, ist das ./vpn und wahrscheinlich ein Nein.

$dont

  • Open Proxy. Öffentliches Relay. „SOCKS für die Freunde der Freunde.“ Der Seitentext sagt das seit immer.
  • Mining, Scanner, Spam, Dienste, die dir nicht gehören.
  • 25/465/587 als Überraschungs-MX binden. Nein.
  • Volle TLS-Keys „zum Debuggen“ loggen und in ~/tmp liegen lassen.

Voller Text: AUP / TOS. Unsicher, ob ein Prozess erlaubt ist: frag, bevor es ein Ticket über einen Kill ist.