kire@net:~$ uptime depuis 1998 • ddos: armé • vhosts: chargé • identd: actif • bouncer: en ligne • bot: +o et protège #channel

$./proxies

Le port X parle au port Y. Avec TLS si tu veux.

Un relais n’est pas un produit. C’est un processus. Login : ssh user@kire.net. Bind là où on t’a dit que tu peux binder. Le hostname d’exemple plus bas est shell.kire.net — remplace-le depuis le mail de bienvenue / l’espace client.

Ce que cette page est. Le shell comme forward TCP, et comme proxy qui enveloppe ou termine le TLS. socat, ncat, stunnel, hitch, nginx stream, haproxy — si le binaire est là. Sinon, demande, ou compile dans $HOME. On ne va pas bénir une version précise dans un billet de blog.

Pour qui. Tu as besoin que le port X du shell parle au port Y ailleurs, ou de TLS devant un service TCP en clair que tu fais déjà tourner. Si SSH -L / -D le fait déjà, arrête de lire et va sur ./ssh-forwarding.

$why-a-kire-shell

IPv4 et IPv6 stables. Un PTR qui n’est pas ton modem câble. Le DDoS devant. identd a déjà répondu. Le capot du portable est fermé. Ce n’est toujours pas une ferme de proxys résidentiels, et on ne fera pas semblant.

$cheat-sheet

chosece que ça faitquand s’en servir
SSH -L / -Dtunnel dans la session que tu as déjàpremier essai. souvent assez
forward TCP bêtedes octets entrent, des octets sortent, pas de TLSdeux ports en clair, le même monde
enveloppe TLSservice en clair + TLS dehorstu as un cert, le client attend des choses en forme de 6697
terminaison TLSTLS à l’entrée, clair à la sortiele backend est localhost et paresseux
WireGuardoverlay, pas un proxy de portseulement si un tunnel ne suffit pas. ./vpn

$for-beginners

Vérifie ce qui existe avant de compiler un autel :

command -v socat ncat stunnel nginx haproxy hitch

Les ports privilégiés (< 1024) ne sont pas à toi. Bind haut, ou demande au staff. Les limites de processus restent des limites de processus.

Il me faut le port X du shell qui parle au port Y ailleurs

socat, s’il est là. Écoute sur le shell, connecte plus loin. Exemple : 9000 local → un hôte en 6667. Remplace les hôtes.

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

bind=127.0.0.1 veut dire que seul le shell peut taper dessus. C’est le bon défaut. Couple avec SSH -L depuis chez toi si toi tu dois taper dessus. Binder le vhost en public, c’est comme ça que naissent les open proxies. Non.

Il me faut du TLS devant un service TCP en clair

stunnel (ou hitch, ou nginx stream) enveloppe ou termine. Les certs sont ton problème. Un cert auto-signé va pour un client que tu contrôles ; pas pour des inconnus.

# 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

Puis stunnel ~/stunnel.conf si le binaire est là. Garde l’adresse d’accept en loopback sauf si tu as une raison et une idée.

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

Un forward TCP bête n’est pas un proxy SSL. L’un copie des octets. L’autre parle un handshake. Ne log pas le handshake dans un fichier lisible par tous. Ne log pas les identifiants. Fais tourner ce que tu logues.

SNI : si tu termines plus d’un nom sur un port, le proxy doit regarder le ClientHello. nginx stream + ssl_preread, haproxy ssl, maps SNI de stunnel — choisis un binaire et lis son man. On ne va pas re-documenter OpenSSL.

Certs client : possible. En général plus de cérémonie que ce pour quoi un shell KIRE est fait. Si tu as besoin de mTLS, tu as déjà un fichier de config.

PROXY protocol : seulement si le saut suivant le comprend. L’envoyer dans un ircd stock fera un dégât. Timeouts d’inactivité : règle-les. Les relais à moitié ouverts, c’est comme ça qu’on découvre les limites de descripteurs.

SO_REUSEPORT si tu empiles des workers. systemd --user pour le processus si tu y tiens ; ça compte quand même comme un processus. Pas de CAP_NET_BIND_SERVICE sauf si le staff l’a dit.

IPv4 et IPv6 existent ici. Bind la famille que tu voulais. Un PTR de vhost ne rend pas magiquement un mauvais bind correct.

Si le boulot est « mon navigateur sur le Wi-Fi du café », c’est SSH -D, pas cette page. Si le boulot est « un réseau routé pour la maison », c’est ./vpn et probablement non.

$dont

  • Open proxy. Relais public. « SOCKS pour les amis des amis. » Le texte du site le dit depuis toujours.
  • Minage, scanners, spam, services qui ne sont pas à toi.
  • Binder 25/465/587 comme MX surprise. Non.
  • Logger des clés TLS complètes « pour debug » et les laisser dans ~/tmp.

Texte complet : AUP / TOS. Pas sûr qu’un processus soit approuvé : demande avant que ce soit un ticket sur un kill.