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.75
ist 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.
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 IPy-0.76 herunter und dearchivieren Sie es
cd
in den dnslib- Ordner:
cd ~/Downloads/paulc-dnslib-04713cc4a9df
dnslib installieren :
sudo python ./setup.py install
cd
in 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.
cd
in 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.
Gordon Davisson
8.8.8.8#53#tcp
(in der interaktiven Startversion; die .plist-Datei sieht so gut aus, wie sie ist).klanomath
sudo ./dnschef.py --nameservers 8.8.8.8#53#tcp
Befehl funktioniert.Gordon Davisson
#
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).Stan
Laurentius