redsocks

A redsocks – egy transzparens proxy megoldás azon elavult/gagyi/összetákolt alkalmazások számára, amelyek „gyárilag” nem támogatják a proxy-n keresztül való kommunikációt. Transzparens, mert sem a kliens, sem pedig a szerver nem is fog arról  tudni, hogy az adatforgalom keresztül van irányítva egy proxy szerveren. Mivel ez a megoldás TCP/UDP szinten működik, így tulajdonképpen bármilyen alkalmazásról beszélhetünk, ami a ezen protokollok valamelyikét használja.

Hogy érthetőbb legyen, vegyünk egy olyan alkalmazást ami HTTP API-n kersztül kommunikál a szerverrel. Ezek esetében alapvető fícsör kellene hogy legyen legalább a HTTP proxy-n keresztül való kommunikáció lehetősége (ahogy ez mindegyik böngésző esetében megtalálható). Ám a gyakorlatban mégis számtalan olyan tákolmánnyal találkozom, ahol erre egyszerűen nincs lehetőség – és a Unix/Lunux világban megszokott környezeti változókat (pl: http_proxy) is figyelmen kívül hagyja – így rendszer és/vagy hálózat szinten kellett ezt a problémát megoldanom.

Erre léteznek kereskedelmi megoldások is, mint pl a Proxifier. De mivel ez csak Windows és Mac operációs rendszerekre elérhető – és nem is open-source megoldás – így ez számomra egyáltalán nem jöhet szóba. A redsocks viszont kicsi, gyors, és csak egy kis csomagszűrő varázslat kell hozzá – ami az iptables REDIRECT működése miatt szükséges:

iptables -I INPUT -i lo -p tcp --dport 8080 -j ACCEPT

Ezen kívül pedig létre kell hozunk egy REDSOCK nevű chain-t, és abban egyetlen szabályt, ami aztán az összes csomagot a 8080-as portra irányítja:

iptables -t nat -N REDSOCKS
iptables -t nat -I REDSOCKS -p tcp -j REDIRECT --to-port 8080


Ahol várhatóan a már futó redsocks alkalmazásunk elkapja, megmódosítgatja, majd a proxy-nak továbbküldi őket.

Hogy pontosan melyik csomagokat térítsük el, azt a nat tábla OUTPUT chain-jébe kell megmondanunk, pl így:

iptables -t nat -I OUTPUT -p tcp -d <DST IP> -j REDSOCKS

A csomagszűrő esetében egy üres, mindent engedő tűzfalat vettem alapul. Ha az általad használt disztribúció tűzfalrendszera nem natív iptables-t használ, vagy előre elkészített szabályokkal kedveskedett neked, akkor abba neked kell beleilleszteni a fenti sorokat, hogy a megoldás valóban működjön.

Maga a redsocks egy igen egyszerű konfigurációs állományt (/etc/redsocks.conf) használ:

base {
  daemon = on;
  redirector = iptables;
  log_info=yes;
  log_debug=on;
  log = "syslog:daemon";
}
redsocks {
  local_ip = 127.0.0.1;
  local_port = 8080;
  
  # Proxy
  ip = 192.168.0.1;
  port = 3128;
  type=http-connect;
}

A fent látható működő példa ugyan csak a minimálisan szükséges paramétereket tartalmazza, de a gyári példa konfig sokkal bőbeszédűbb :)

Igaz, hogy az eredeti fejlesztője jó ideje nem frissítette már programot, ám néhány patch (#50, #123) után működik a modern rendszereken is.

A saját repómban már a javított verzió található, fordítása nagyon egyszerű:

make

Első kipróbálásakor a logjait is érdemes nézegetni:

sudo journalctl -f -t redsocks &

És végül, elindítani is nagyon egyszerű:

sudo redsocks -c /etc/redsocks.conf

Természetesen, a fent vázolt példa csak egy nagyon egyszerű megoldás, amit ráadásul kézzel kell összerakosgatni. Ha azonban összeállta dolog, a könnyebb kezelhetőség érdekében érdemes egy indító/leállító scriptet is köré írni,  :)

Valójában a redsocks rengeteg egyéb felmerülő problémát (UDP forgalom, pl DNS forwarding) is meg tudna oldani, ám ezekre nekem egyelőre nem volt szükségem.