Transparenter SOCKS via Gateway

Dieses Thema im Forum "Security Tutorials" wurde erstellt von chrisb, 8. September 2009 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 8. September 2009
    Hallo zusammen.

    Dies ist mein erstes Tutorial und dessen Ziel ist es, den kompletten Traffic in das Internet über einen SOCKS-Proxy umzuleiten. Kurz: Es geht um eine andere Methode, einen SOCKS-Proxy transparent zu machen.

    Viele von euch kennen gewiss so genannte "Socksifier", welche die Daten der Programme, welche keine native Proxy Unterstützung anbieten, über den Proxy leiten. Beispielsweise erfreuen sich Proxifier / FreeCap unter Windows bzw. tsocks / proxychains unter Linux an Beliebtheit. Ein großes Problem dieser Programme ist jedoch, dass man sich nie vollkommen sicher sein kann, dass auch wirklich der gesamte Traffic über den Proxy läuft. So machen beispielsweise Java Programme des öfterens ihre eigenen Dinge und verbinden sich direkt auf den angeforderten Server.

    Aufgrund dieser Problematik haben viele in der Vergangenheit auf das VPN-Konzept zurückgegriffen. Dass dies auch ohne einen VPN-Server funktionieren kann, werde ich euch in diesem Tutorial zeigen. Zunächst muss das Grundprinzip hierzu erläutert werden:

    In den häufigsten Konfigurationen von Heimnetzwerken tritt der Router, der die Verbindung zum Internet herstellt, gleichzeitg als die Gateway auf. Die simple Idee ist nun, dem Router diese Aufgabe abzunehmen. Dies können wir erreichen, in dem wir einen zusätzlichen Server zwischen dem PC und dem Router schalten, der als neue Gateway fungiert. Dieser Server wird die Aufgabe haben, sämtliche eingehende IP-Pakete über den SOCKS-Proxy weiterzuleiten. So kann gewährleistet werden, dass alle TCP- bzw. UDP-Pakete erst über den Proxy gehen, bevor sie von dort weiter das weltweite Internet besuchen. Um zusätzlich die Sicherhei zu erhöhen, werde ich in diesem Tutorial die Verbindung zum SOCKS via SSH-Tunnel herstellen.

    Das Verbindungsschema sieht demnach wie folgt aus:
    Dein PC <=> Gateway <=> (verschlüsselt) Router <=> ISP <=> Proxy <=> (meist unverschlüsselt) Internet (<=> bidirektional)

    Nach dieser mehr oder weniger langen Erklärung kann es nun endlich losgehen.

    Die Voraussetzungen:
    • Remote SSH Server; Funktion; SOCKS5
    • Linux Server; Funktion: Gateway
    • Interesse am Thema

    Step-by-Step:

    1. Stelle auf der Gateway eine Verbindung zum SSH Server her und starte gleichzeitig einen SOCKS5-Tunnel auf Port 7777 (localhost):
      Code:
      ssh -D 7777 user@SSH-Server # für weitere Details: man ssh
    2. Installiere libevent auf der Gateway. Meist ist die Library in den Paketmanagern der Distributionen bereits enthalten.
      Beispielsweise in Ubuntu:
      Code:
      sudo apt-get install libevent-dev libevent1
    3. Kompiliere transocks_ev auf der Gateway:
      Code:
      svn co http://oss.tiggerswelt.net/transocks_ev/
      cd transocks_ev
      make
      
      Ein kleiner Auszug aus der README des Tools:
    4. Starte transocks_ev wie folgt :
      Code:
      ./transocks_ev -p 8888 -s 7777 -S 127.0.0.1
      Erklärung: -p Port auf dem transocks_ev auf eingehende Verbindungen wartet; -s Port des SOCKS; -S IP des SOCKS
    5. In die Thematik iptables bzw. NAT einlesen, z.B. hier:
      NAT mit Linux und iptables - Tutorial (Einführung)
    6. Führe den folgenden Befehl aus, um das IP Forwarding im Kernel zu aktivieren:
      Code:
      sudo echo 1 > /proc/sys/net/ipv4/ip_forward
    7. Ändere die iptables Konfiguration ab, verwende dabei das folgendes Skript:
      Code:
      #!/bin/bash
      
      # name: run.sh
      
      # Where to find iptables
      IPTABLES="/sbin/iptables"
      
      # Port that is transocks listening on
      TRANSOCKS_PORT="8888"
      
      # Location of our SOCKS-server
      SOCKS_HOST="127.0.0.1"
      SOCKS_PORT="7777"
      
      # Create our own chain
      $IPTABLES -t nat -N transocks
      
      # Do not try to redirect local traffic
      $IPTABLES -t nat -I transocks -o lo -j RETURN
      
      # Do not redirect traffic for the SOCKS-Server
      $IPTABLES -t nat -I transocks -p tcp -d $SOCKS_HOST --dport $SOCKS_PORT -j RETURN
      $IPTABLES -t nat -I transocks -p udp -d $SOCKS_HOST --dport $SOCKS_PORT -j RETURN
      
      # Do not redirect local network
      $IPTABLES -t nat -I transocks -d 192.168.0.0/24 -j RETURN # dein lokales Netzwerk
      $IPTABLES -t nat -I transocks -d [weitere IP] -j RETURN # [weitere IP] kann z.B. dein Rootserver sein, auf dem du dich direkt verbinden möchtest
      
      # Redirect all traffic that gets to the end of our chain
      $IPTABLES -t nat -A transocks -p tcp -j REDIRECT --to-port $TRANSOCKS_PORT
      $IPTABLES -t nat -A transocks -p udp -j REDIRECT --to-port $TRANSOCKS_PORT
      
      # Filter all traffic that is routed over this host
      $IPTABLES -t nat -A PREROUTING -j transocks
      
      Code:
      chmod 777 run.sh
      ./run.sh
      
      Anmekerung: Natürlich muss das Skript auf eigene Bedürfnisse angepasst werden.
    8. Trage bei allen Computern, die ausschließlich via verschlüsseltem SOCKS5-Proxy ins Internet gehen sollen, als Default Gateway die IP des Linux Server anstatt die des Routers ein
    9. Spiele mit tcpdump bzw. Wireshark herum, um zu sehen, ob auch wirklich alles getunnelt wird
    10. Spaß haben und Bier trinken

    Ich verwende diese Konfiguration nun seit mehreren Tagen und bin von der Idee begeistert. Als Linux Server musste mein altes, armen Laptop herhalten . Viel Spaß beim vollständigen, anonymen Surfen ohne VPN-Tunnel!

    Bei Fragen könnt ihr mir gerne eine PN schreiben.
     
  2. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.