Verwenden Sie netcat zum Konvertieren von UDP-DNS-Abfragen in TCP-DNS-Abfragen

821
Dave

Ich verwende Debian 9 in einem isolierten Netzwerk und brauche DNS-Dienste, um externe Hostnamen aufzulösen.

(Ich bin mir sicher, einige werden sich fragen, warum ich externe Hostnamen auflösen muss, wenn ich in einem isolierten Netzwerk bin, aber das ist mehr Details, als ich hier eingeben muss, um meine Frage zu stellen. Es reicht aus, diese Notwendigkeit zu sagen existiert.)

Auf dem isolierten Host, von dem aus ich externe Hostnamen auflösen kann, habe ich diesen SSH-Tunnel eingerichtet:

ssh -N -L localhost:53:192.168.13.14:53 myUserId@jumpServer 

Hier ist 192.168.13.14 ein DNS-Server, der alle Namen global auflösen kann. Dieser SSH-Tunnel leitet alles, was am lokalen TCP- Port 53 gehört wird, an den TCP- Port 53 am 192.168.13.14 weiter.

Ich kann dig verwenden, um einen Hostnamen aufzulösen, indem ich angibt, dass die Abfrage über TCP-Port 53 statt über den üblichen UDP-Port 53 erfolgen soll:

root@isolatedHost:~# dig @localhost +vc example.com  ; <<>> DiG 9.10.3-P4-Debian <<>> @localhost +vc example.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53054 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1  ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;example.com. IN A  ;; ANSWER SECTION: example.com. 3600 IN A 93.184.216.34  ;; Query time: 133 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Dec 20 15:21:01 MST 2017 ;; MSG SIZE rcvd: 56 

Der Schlüssel für dieses Beispiel ist, dass:

  1. dig hat das Flag "+ vc +" ("virtuelle Schaltung"), mit dem Sie angeben können, dass TCP anstelle des üblichen UDP verwendet wird
  2. Unser Nameserver (der unter 192.168.13.14) ist so konfiguriert, dass er normale rekursive Abfragen auf TCP sowie das übliche UDP akzeptiert

Dig ist natürlich etwas Besonderes. Es kann gesagt werden, dass TCP anstelle von UDP verwendet wird. Im allgemeinen Fall einer zufälligen Anwendung, die in der lokalen Auflösungsbibliothek aufgerufen wird, wird die Abfrage immer über das übliche UDP durchgeführt.

Das Problem bei meinem SSH-Tunnel ist, dass SSH nur TCP- Ports weiterleiten kann . UDP-Ports können nicht weitergeleitet werden. Ich brauche also eine Möglichkeit, alle DNS-Abfragen vom üblichen UDP in TCP umzuwandeln. Sie können dann über den SSH-Tunnel aus unserem isolierten Netzwerk herauskommen und sich zum Nameserver begeben.

Das erste, was mir einfällt, ist netcat:

nc -u -l -p 53 | nc localhost 53 

Das funktioniert leider nicht und ich weiß noch nicht warum.

Hat jemand eine Lösung zum Weiterleiten von UDP-DNS-Abfragen in einem isolierten Netzwerk, mit netcat in Verbindung mit einem SSH-Tunnel oder auf andere Weise?

0
Sie können ein UDP-Datagramm nicht einfach in ein TCP-Segment konvertieren. UDP ist verbindungslos, aber TCP erfordert eine Verbindung zwischen den Hosts. Die DNS-Abfrage muss von Anfang an mit TCP erfolgen, da TCP zuerst eine Verbindung zwischen dem Anforderer und dem Befragten herstellen muss. Für die Unterstützung von TCP ist eine ordnungsgemäße DNS-Implementierung gemäß [RFC 7766] (https://tools.ietf.org/html/rfc7766) erforderlich Teil einer vollständigen Implementierung des DNS-Protokolls. "Ihre Anwendung und Ihr Betriebssystem müssen TCP für DNS unterstützen. Ron Maupin vor 6 Jahren 0
XY-Problem. [* Wie konfiguriere ich Linux für die Verwendung von TCP für DNS-Abfragen? *] (Https://serverfault.com/q/762003) Kamil Maciorowski vor 6 Jahren 0
Ja, die Absicht war, dass für jedes eingehende UDP-Paket (und der Stack übergibt vollständige Fragmente an die App, nicht Fragmente) eine TCP-Verbindung hergestellt wird, die UDP-Nutzdaten, die über die TCP-Verbindung gesendet werden, und die TCP-Verbindung geschlossen. Mein netcat-Befehl zum ersten Mal war zu simpel. Danke sowohl an Ron als auch an Kamil! Ich werde den Link "So konfigurieren Sie Linux für die Verwendung von TCP für DNS-Abfragen" anzeigen. Das klingt perfekt, nur dass ich keine Garantie dafür habe, dass jede beliebige Anwendung, die mitkommt, den * system * - Resolver verwendet. Dave vor 6 Jahren 0
Ich möchte meinen letzten Kommentar korrigieren, kann ihn aber aus irgendeinem Grund nicht bearbeiten ... "(und der Stack übergibt vollständige * Pakete * (* nicht * Fragmente) an die App, keine Fragmente ...") Dave vor 6 Jahren 0
Die Bearbeitungszeit für @Dave-Kommentare ist auf 3 Minuten begrenzt (soweit ich weiß). Danach müssen Sie nur noch kopieren / einfügen / korrigieren und als neuen Kommentar posten (wahrscheinlich wird der alte gelöscht, sofern er nicht korrekt / relevant ist). Anaksunaman vor 6 Jahren 0

0 Antworten auf die Frage