Wie kann ich erzwingen, dass die Standard-DNS-Abfrage im TCP-Modus funktioniert?

In China kontaminiert das sogenannte GFW oft DNS-Ergebnisse wie

$ dig @8.8.8.8 archive.org 

;; QUESTION SECTION:
;archive.org.           IN  A

;; ANSWER SECTION:
archive.org.        2662    IN  A   159.106.121.75

Hier 159.106.121.75ist eine gefälschte IP. Wir müssen den TCP-Modus für die DNS-Abfrage verwenden:

$ dig @8.8.8.8 +tcp archive.org

;; QUESTION SECTION:
;archive.org.           IN  A

;; ANSWER SECTION:
archive.org.        237 IN  A   207.241.224.2

Jetzt bekommen wir die echte IP 207.241.224.2.

In System Preferences-> Networkkann die Advanced...Schaltfläche einen Tab zum Einstellen von DNS öffnen. Ich kann jedoch nur die IP-Adressen von DNS-Servern hinzufügen, aber nichts anderes tun. Meine Frage ist also: Wie kann ich die Standard-DNS-Abfrage erzwingen, die im TCP-Modus arbeitet?

PS : Ich möchte die Datei nicht ändern /etc/hosts, um dieses Problem zu umgehen, da dies unbequem ist. Wenn es irgendeine elegante Methode gibt, die dieses Problem lösen kann, wird es mir viel Zeit sparen :) Danke.

Antworten (1)

AFAIK ist es nicht möglich, den mDNSResponder zu zwingen, TCP anstelle von UDP zu verwenden.

Ich habe aber einen Workaround gefunden. Die unten beschriebene Methode verwendet einen lokalen DNS-Proxy ( dnschef ), der gezwungen ist, TCP für ausgehende DNS-Anfragen zu verwenden.

  • Laden Sie dnschef-0.3 herunter und entpacken Sie es .
  • Laden Sie dnslib herunter und entpacken Sie es
  • Laden Sie IPy-0.76 herunter und dearchivieren Sie es

  • cdin den dnslib- Ordner:

    cd ~/Downloads/paulc-dnslib-04713cc4a9df 
    
  • dnslib installieren :

    sudo python ./setup.py install
    
  • cdin den IPy- Ordner:

    cd ~/Downloads/IPy-0.76 
    
  • IPy installieren :

    sudo python ./setup.py install
    
  • Öffnen Sie Systemeinstellungen -> Netzwerk, ersetzen Sie Ihren aktuellen DNS-Server (zB 8.8.8.8/8.8.8.4) durch einen lokalen mit der IP 127.0.0.1 und übernehmen Sie die Änderungen.

  • cdin den dnschef Ordner und starte ihn:

    cd ~/Downloads/dnschef-0.3 
    sudo ./dnschef.py --nameservers 8.8.8.8#53#tcp
    

Wenn der letzte Befehl zu lästig oder hässlich ist (na ja, er ist hässlich, weil Sie Terminal.app öffnen und den DNS-Proxy starten müssen), können Sie die dnschef.py und .ini in einen anderen Pfad verschieben und einen Start-Daemon erstellen Starten Sie den DNS-Proxy beim Booten.

Beispiel:

  • sudo mkdir /usr/local/python
  • sudo cp ~/Downloads/dnschef-0.3/dns* /usr/local/python/
  • sudo rm /usr/local/python/dnschef.exe
  • sudo touch /Library/LaunchDaemon/local.dnschef.plist
  • Kopieren Sie den folgenden Inhalt und fügen Sie ihn mit einem geeigneten Editor
    (z. B. sudo nano /Library/LaunchDaemon/local.dnschef.plist) in die neu erstellte Datei ein:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>Label</key>
        <string>local.dnschef</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/python/dnschef.py</string>
            <string>--nameservers</string>
            <string>8.8.8.8#53#tcp</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
    </plist>
    
  • Laden Sie die Datei mitsudo launchctl load -w /Library/LaunchDaemons/local.dnschef.plist

    Alle erstellten Dateien und Ordner müssen root:wheel gehören.

Ich habe das nicht getestet, aber ich bin mir ziemlich sicher, dass Sie Anführungszeichen benötigen 8.8.8.8#53#tcp(in der interaktiven Startversion; die .plist-Datei sieht so gut aus, wie sie ist).
@GordonDavisson Ich habe es getestet und Anführungszeichen (dh "8.8.8.8#53#tcp") unterbrechen den Start-Daemon. Der sudo ./dnschef.py --nameservers 8.8.8.8#53#tcpBefehl funktioniert.
Rechts. Anführungszeichen werden interaktiv benötigt, um zu verhindern, dass die Shell #als Kommentarmarkierung interpretiert wird; launchd verwendet keine Shell, daher werden dort keine Anführungszeichen benötigt (und wird es, wie Sie sagen, kaputt machen, weil es keine Shell gibt, um sie zu entfernen).
Vielen Dank für die ausführliche Antwort. Ich habe es noch nicht ausprobiert, aber ich glaube fest daran, dass es funktioniert :D
Aktualisierter Link für dnschef: github.com/iphelix/dnschef