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

6

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.75 es 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 obtenemos la IP real 207.241.224.2 .

En Preferencias del sistema - > Red , el botón Avanzado ... 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 el funcionamiento de la consulta de DNS predeterminada en el modo TCP?

PS : no quiero modificar el archivo /etc/hosts para evitar este problema por inconveniente. Si hay algún método elegante que pueda resolver este problema, me ahorrará mucho tiempo :) Gracias.

    
pregunta Stan 16.12.2015 - 12:13

1 respuesta

3

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

Aunque he encontrado una solución alternativa. El método descrito a continuación utiliza un proxy DNS local ( dnschef ) forzado a usar TCP para solicitudes DNS salientes.

  • Descargue y descomprima dnschef-0.3 .
  • Descargue y descomprima dnslib
  • Descargue y desarchive IPy-0.76

  • cd a la carpeta dnslib :

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

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

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

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

  • cd a 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 molesto o feo (bueno, es feo porque tienes que abrir Terminal.app e iniciar el proxy DNS), puedes mover el dnschef.py y .ini a otra ruta y crear un inicie el daemon para iniciar el DNS-proxy 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
    (por ejemplo, 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 con sudo launchctl load -w /Library/LaunchDaemons/local.dnschef.plist

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

respondido por el klanomath 16.12.2015 - 18:32

Lea otras preguntas en las etiquetas