DNS2TCP

Aus C3MAWiki
Dies ist ein Projekt, an dem momentan aktiv gearbeitet wird. Wenn du Fragen hast oder mitarbeiten möchtest, wende dich an Xjs.

Motivation

Ihr seid in einem öffentlichen Netzwerk und habt keinen Zugriff aufs Internet? Ihr bräuchtet einen VPN-Zugang? Jemand mag Euch einfach nicht? Tröstet Euch, DNS geht bestimmt. Und wenn DNS funktioniert, können wir darüber indirekt auch auf Informationen außerhalb des Netzwerkes zugreifen. Dabei hilft uns dns2tcp.

Zutaten

  • DNS-Kontrolle über eine Zone (Domain, Subdomain, whatever), die öffentlich erreichbar ist
  • Einen öffentlich auf Port 53 TCP und UDP erreichbaren Host (der kann gerne auch zu Hause stehen)
  • Ein wenig Geduld beim Aufrufen von Websites

Funktionsweise

Euer Server bedient eine ansonsten ungenutzte, von Euch ausgewählte öffentliche DNS-Zone. Da sie öffentlich ist, kann sie an jedem rekursierenden DNS-Server (das ist so einer, wie er auf Eurem Router läuft) abgefragt werden.

Ihr fragt also mit Eurem Client einen bestimmten Eintrag in dieser Zone am rekursierenden DNS eures geschlossenen Netzwerks an, der daraufhin Euren Server danach fragt. Euer Server dechiffriert die Anfrage, die TCP-Verbindungsdaten enthält, und sendet Euch eventuelle resultierende TCP-Daten als DNS-Antwort. Somit könnt Ihr einen Tunnel zu Eurem Server über einen rekursierenden DNS-Server aufbauen.

Installation

./configure && make && su -c "make install"

auf Client und Server.

  • Bearbeitet auf Eurem Server eine beliebige Datei, die später als Konfigurationsdatei dienen wird. Tragt die folgenden Informationen ein:
listen = <IP>
port = 53
user = nobody
chroot = /var/empty/dns2tcp
domain = <ZONE>
resources = ssh:127.0.0.1:22, ssh6:[::1]:22

<IP> steht hierbei für die IP-Adresse, auf der der Server lauschen soll (ob IPv6 funktioniert, habe ich noch nicht ausprobiert). <ZONE> ist die DNS-Zone, die Ihr später einrichten werdet. Im Idealfall eine ungenutzte Subdomain einer Domain, über die Ihr DNS-Kontrolle habt.

  • Startet den Serverprozess als Root, z. B. mit
# cd /tmp; nohup dns2tcpd -f <KONFIGURATIONSDATEI>
  • Bearbeitet die Datei ~/.dns2tcprc auf Eurem Client. Tragt die folgenden Informationen ein:
domain = <ZONE>
resource = <RESSOURCE>
local_port = <PORT>

<ZONE> ist wieder die selbe DNS-Zone wie oben, <RESSOURCE> ist eine der unter resources eingetragenen Verbindungen, zum Beispiel ssh6. <PORT> ist der Port, auf den diese Verbindung auf die lokale Maschine weitergeleitet werden soll. Ich nehme gerne 8122. Achja, Vorsicht: Der Autor scheint sich nicht ganz im Klaren drüber zu sein, wie man "Ressource" schreibt.

  • Richtet Eure DNS-Zone ein. In BIND-Syntax tragt Ihr dazu folgendes ein:
<ZONE>. IN NS <SERVER>

Wobei <ZONE> immernoch die selbe DNS-Zone ist. Vergesst nicht den Punkt am Ende. <SERVER> ist der Hostname des Servers, auf dem der obige Serverprozess läuft.

Benutzung

Startet den Clientprozess im geschlossenen Netzwerk mit

dns2tcpc <DNS-SERVER>

<DNS-SERVER> entspricht hier einem beliebigen erreichbaren DNS. Typischerweise erfahrt Ihr den über DHCP. Welche DNS-Server über DHCP gepusht wurden, erfahrt Ihr in vielen Fällen über

cat /etc/resolv.conf

Nun erstellt einen SSH-Tunnel über die nun erstellte Verbindung.

ssh -p <PORT> -D <SOCKS-PORT> localhost

<SOCKS-PORT> ist der Port, auf dem der SOCKS5-Proxy laufen soll. Ich nehme immer 8123.

Tragt localhost:<SOCKS-PORT> in Eure systemweiten (SOCKS-)Proxyeinstellungen ein und Ihr könnt auf das Internet zugreifen.

FAQ

  • Q: Die Verbindung hält nur ein paar Sekunden, danach kommen keine Daten mehr. Was tun?

A: Bei mir hilft es, dns2tcpc mit dem Parameter "-d 2" oder "-d 3" (Debugmodus) zu starten. Ich habe noch nicht weiter nachgeforscht.