Como posso forçar a consulta DNS padrão a funcionar no modo TCP?

7

Na China, o chamado GFW freqüentemente contamina os resultados do 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

Aqui 159.106.121.75está um IP falso. Temos que usar o modo TCP para consulta 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

Agora nós recebemos o IP real 207.241.224.2.

Em System Preferences-> Network, o Advanced...botão pode abrir uma guia para configurar o DNS. No entanto, só posso adicionar os endereços IP dos servidores DNS, mas não posso fazer mais nada. Então, minha pergunta é: como posso forçar a consulta DNS padrão trabalhando no modo TCP?

PS : Eu não quero modificar o /etc/hostsarquivo para contornar este problema, pois é inconveniente. Se houver algum método elegante que possa resolver este problema, isso me poupará muito tempo :) Obrigado.

Stan
fonte

Respostas:

4

AFAIK não é possível forçar o mDNSResponder a usar TCP em vez de UDP.

Eu encontrei uma solução alternativa embora. O método descrito abaixo usa um proxy DNS local ( dnschef ) forçado a usar o TCP para solicitações DNS de saída.

  • Faça o download e descompacte o dnschef-0.3 .
  • Baixar e descompactar o dnslib
  • Baixar e desarquivar o IPy-0.76

  • cdpara a pasta dnslib :

    cd ~/Downloads/paulc-dnslib-04713cc4a9df 
    
  • instale o dnslib :

    sudo python ./setup.py install
    
  • cdpara a pasta IPy :

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

    sudo python ./setup.py install
    
  • Abra as Preferências do Sistema -> Rede, substitua seus servidores DNS atuais (por exemplo, 8.8.8.8/8.8.8.4) por um local com o IP 127.0.0.1 e aplique as alterações.

  • cdpara a pasta dnschef e inicie-a:

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

Se o último comando for muito problemático ou feio (bem, é feio porque você tem que abrir o Terminal.app e iniciar o DNS-proxy), você pode mover o dnschef.py e o .ini para outro caminho e criar um daemon de inicialização para iniciar o proxy DNS durante a inicialização.

Exemplo:

  • 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 e cole o seguinte conteúdo no arquivo recém-criado com um editor apropriado
    (por exemplo 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>
    
  • Carregue o arquivo com sudo launchctl load -w /Library/LaunchDaemons/local.dnschef.plist

    Todos os arquivos e pastas criados devem pertencer a root: wheel.

klanomath
fonte
Eu não testei isso, mas eu tenho certeza que você vai precisar de aspas ao redor 8.8.8.8#53#tcp(na versão inicial interativa, o arquivo .plist parece bem como é).
Gordon Davisson
@GordonDavisson Eu testei e aspas (ou seja, "8.8.8.8 # 53 # tcp") quebram o daemon de lançamento. O sudo ./dnschef.py --nameservers 8.8.8.8#53#tcpcomando funciona.
klanomath
Certo. As citações são necessárias interativamente para impedir que o shell interprete #como um marcador de comentário; O launchd não usa um shell, portanto, aspas não são necessárias lá (e, como você diz, quebrá-lo porque não há shell para removê-las).
Gordon Davisson
Obrigado pela resposta detalhada. Ainda não tentei, mas eu acredito completamente que funciona: D
Stan