¿Cómo puedo forzar que la consulta DNS predeterminada funcione en modo TCP?

En China, el llamado GFW a menudo contamina los resultados de DNS como

$ dig @8.8.8.8 archive.org 

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

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

Aquí 159.106.121.75hay una IP falsa. Tenemos que usar el modo TCP para la consulta de DNS:

$ 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

Ahora tenemos la IP real 207.241.224.2.

En System Preferences-> Network, el Advanced...botón puede abrir una pestaña para configurar DNS. Sin embargo, solo puedo agregar las direcciones IP de los servidores DNS, pero no puedo hacer nada más. Entonces mi pregunta es: ¿cómo puedo forzar que la consulta de DNS predeterminada funcione en el modo TCP?

PD : no quiero modificar el /etc/hostsarchivo para evitar este problema, ya que es un inconveniente. Si hay algún método elegante que pueda resolver este problema, me ahorrará mucho tiempo :) Gracias.

Respuestas (1)

AFAIK no es posible forzar a mDNSResponder a usar TCP en lugar de UDP.

Sin embargo, he encontrado una solución. El método descrito a continuación utiliza un proxy DNS local ( dnschef ) obligado a utilizar TCP para las solicitudes de DNS salientes.

  • Descargue y descomprima dnschef-0.3 .
  • Descargar y descomprimir dnslib
  • Descargar y desarchivar IPy-0.76

  • cda la carpeta dnslib :

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

    sudo python ./setup.py install
    
  • cda la carpeta IPy :

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

    sudo python ./setup.py install
    
  • Abra Preferencias del sistema -> Red, reemplace su(s) servidor(es) DNS actual(es) (por ejemplo, 8.8.8.8/8.8.8.4) por uno local con la IP 127.0.0.1 y aplique los cambios.

  • cda la carpeta dnschef e inícielo:

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

Si el último comando es demasiado problemático o feo (bueno, es feo porque tiene que abrir Terminal.app e iniciar el proxy DNS), puede mover dnschef.py e .ini a otra ruta y crear un demonio de lanzamiento para inicie el proxy DNS durante el arranque.

Ejemplo:

  • 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
  • copie y pegue el siguiente contenido en el archivo recién creado con un editor apropiado
    (p. ej sudo nano /Library/LaunchDaemon/local.dnschef.plist.):

    <?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>
    
  • Cargue el archivo consudo launchctl load -w /Library/LaunchDaemons/local.dnschef.plist

    Todos los archivos y carpetas creados deben ser propiedad de root:wheel.

No he probado esto, pero estoy bastante seguro de que necesitará comillas 8.8.8.8#53#tcp(en la versión de inicio interactiva; el archivo .plist se ve bien tal como está).
@GordonDavisson Lo probé y las comillas (es decir, "8.8.8.8#53#tcp") rompen el demonio de lanzamiento. El sudo ./dnschef.py --nameservers 8.8.8.8#53#tcpcomando funciona.
Bien. Las comillas se necesitan de forma interactiva para evitar que el shell se interprete #como un marcador de comentario; launchd no usa un shell, por lo que no se necesitan comillas allí (y, como usted dice, lo romperá porque no hay un shell para eliminarlas).
Gracias por la respuesta detallada. Todavía no lo he probado pero creo que funciona :D
Enlace actualizado para dnschef: github.com/iphelix/dnschef