eventlet icon indicating copy to clipboard operation
eventlet copied to clipboard

[Windows] Failed to resolve DNS name after monkey_patch

Open dantingl opened this issue 6 years ago • 6 comments

When using Set-DnsClientServerAddress to set DNS server on windows, there will be a '\x00' in the end of the IP address. Eventlet does not strip '\x00' after reading DNS server IP. So it fails when it sends DNS request. eventlet version: 0.25.1 BTW withouth monkey_patch, it could work.

The error trace is like:

Traceback (most recent call last):                                                                                              
  File "test.py", line 11, in <module>                                                                                          
    print(requests.Session().get(url))                                                                                          
  File "C:\...\lib\site-packages\requests\sessions.py", line 546, in get                          
    return self.request('GET', url, **kwargs)                                                                                   
  File "C:\...\lib\site-packages\requests\sessions.py", line 533, in request                      
    resp = self.send(prep, **send_kwargs)                                                                                       
  File "C:\...\lib\site-packages\requests\sessions.py", line 646, in send                         
    r = adapter.send(request, **kwargs)                                                                                         
  File "C:\...\lib\site-packages\requests\adapters.py", line 449, in send                         
    timeout=timeout                                                                                                             
  File "C:\...\lib\site-packages\urllib3\connectionpool.py", line 672, in urlopen                 
    chunked=chunked,                                                                                                            
  File "C:\...\lib\site-packages\urllib3\connectionpool.py", line 376, in _make_request           
    self._validate_conn(conn)                                                                                                   
  File "C:\...\lib\site-packages\urllib3\connectionpool.py", line 994, in _validate_conn          
    conn.connect()                                                                                                              
  File "C:\...\lib\site-packages\urllib3\connection.py", line 334, in connect                     
    conn = self._new_conn()                                                                                                     
  File "C:\...\lib\site-packages\urllib3\connection.py", line 157, in _new_conn                   
    (self._dns_host, self.port), self.timeout, **extra_kw                                                                       
  File "C:\...\lib\site-packages\urllib3\util\connection.py", line 61, in create_connection       
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):                                                      
  File "C:\...\lib\site-packages\eventlet\support\greendns.py", line 517, in getaddrinfo          
    qname, addrs = _getaddrinfo_lookup(host, family, flags)                                                                     
  File "C:\...\lib\site-packages\eventlet\support\greendns.py", line 479, in _getaddrinfo_lookup  
    answer = resolve(host, qfamily, False, use_network=use_network)                                                             
  File "C:\...\lib\site-packages\eventlet\support\greendns.py", line 425, in resolve              
    use_network=use_network)                                                                                                    
  File "C:\...\lib\site-packages\eventlet\support\greendns.py", line 369, in query                
    step(self._resolver.query, qname, rdtype, rdclass, tcp, source, raise_on_no_answer=False)                                   
  File "C:\...\lib\site-packages\eventlet\support\greendns.py", line 344, in step                 
    a = fun(*args, **kwargs)                                                                                                    
  File "C:\...\lib\site-packages\dns\resolver.py", line 913, in query                             
    source_port=source_port)                                                                                                    
  File "C:\...\lib\site-packages\eventlet\support\greendns.py", line 716, in udp                  
    s.sendto(wire, destination)                                                                                                 
  File "C:\...\lib\site-packages\eventlet\greenio\base.py", line 400, in sendto                   
    return self._send_loop(self.fd.sendto, data, *args)                                                                         
  File "C:\...\lib\site-packages\eventlet\greenio\base.py", line 384, in _send_loop               
    return send_method(data, *args)                                                                                             
TypeError: getsockaddrarg() argument 1 must be encoded string without null bytes, not str 

(temoto) update: format

dantingl avatar Sep 27 '19 10:09 dantingl

Linux also has the same problem, Linux built-in lib can handle the DNS address '127.0.0.53\x00' in /etc/resolv.conf but eventlet cannot. Error logs for validation as follow:

Python 2.7.15+ (default, Jul  9 2019, 16:51:35) 
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
\>>> import dns.resolver
\>>> dns.resolver.Resolver().nameservers
['127.0.0.53\x00']
\>>> import requests
\>>> requests.Session().get('http://www.google.com')
<Response [200]>
\>>> import eventlet
\>>> eventlet.monkey_patch()
\>>> requests.Session().get('http://www.google.com')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 546, in get
    return self.request('GET', url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 354, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python2.7/httplib.py", line 1058, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 1098, in _send_request
    self.endheaders(body)
  File "/usr/lib/python2.7/httplib.py", line 1054, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 892, in _send_output
    self.send(msg)
  File "/usr/lib/python2.7/httplib.py", line 854, in send
    self.connect()
  File "/usr/local/lib/python2.7/dist-packages/urllib3/connection.py", line 181, in connect
    conn = self._new_conn()
  File "/usr/local/lib/python2.7/dist-packages/urllib3/connection.py", line 159, in _new_conn
    (self._dns_host, self.port), self.timeout, **extra_kw)
  File "/usr/local/lib/python2.7/dist-packages/urllib3/util/connection.py", line 57, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  File "/usr/local/lib/python2.7/dist-packages/eventlet/support/greendns.py", line 517, in getaddrinfo
    qname, addrs = _getaddrinfo_lookup(host, family, flags)
  File "/usr/local/lib/python2.7/dist-packages/eventlet/support/greendns.py", line 479, in _getaddrinfo_lookup
    answer = resolve(host, qfamily, False, use_network=use_network)
  File "/usr/local/lib/python2.7/dist-packages/eventlet/support/greendns.py", line 425, in resolve
    use_network=use_network)
  File "/usr/local/lib/python2.7/dist-packages/eventlet/support/greendns.py", line 380, in query
    return end()
  File "/usr/local/lib/python2.7/dist-packages/eventlet/support/greendns.py", line 359, in end
    raise result[1]
TypeError: getsockaddrarg() argument 1 must be encoded string without null bytes, not str

(temoto) update: format

heypnus avatar Sep 27 '19 10:09 heypnus

Have the same problem using eventlet.... event resolve the localhost name is fail.

>>> from eventlet import monkey_patch
>>> monkey_patch()
>>> socket.gethostbyname(socket.gethostname())
Traceback (most recent call last):
  File "C:\Users\woolen\Documents\xhack\xhack_sploit_client\py_3.7\lib\site-packages\eventlet\support\greendns.py", line 425, in resolve
    use_network=use_network)
  File "C:\Users\woolen\Documents\xhack\xhack_sploit_client\py_3.7\lib\site-packages\eventlet\support\greendns.py", line 380, in query
    return end()
  File "C:\Users\woolen\Documents\xhack\xhack_sploit_client\py_3.7\lib\site-packages\eventlet\support\greendns.py", line 359, in end
    raise result[1]
  File "C:\Users\woolen\Documents\xhack\xhack_sploit_client\py_3.7\lib\site-packages\eventlet\support\greendns.py", line 340, in step
    a = fun(*args, **kwargs)
  File "C:\Users\woolen\Documents\xhack\xhack_sploit_client\py_3.7\lib\site-packages\dns\resolver.py", line 1002, in query
    raise NXDOMAIN(qnames=qnames_to_try, responses=nxdomain_responses)
dns.resolver.NXDOMAIN: The DNS query name does not exist: DESKTOP-B70E1G4.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\woolen\Documents\xhack\xhack_sploit_client\py_3.7\lib\site-packages\eventlet\support\greendns.py", line 550, in gethostbyname
    rrset = resolve(hostname)
  File "C:\Users\woolen\Documents\xhack\xhack_sploit_client\py_3.7\lib\site-packages\eventlet\support\greendns.py", line 434, in resolve
    raise EAI_NODATA_ERROR
socket.gaierror: [Errno 11001] Name or service not known

WoolenWang avatar Apr 21 '20 07:04 WoolenWang

Same issue here on eventlet 0.26.0 and dnspython 2.0.0: dns not working after monkey patching. Easily reproduced by following the steps of @heypnus. It is not related to special chars in the dns though, mine is:

dns.resolver.Resolver().nameservers ['192.168.65.1']

As a workaround reverting to dnspython 1.16.0 solves it.

Gilles-qbmt avatar Aug 06 '20 12:08 Gilles-qbmt

Same issue here on eventlet 0.26.0 and dnspython 2.0.0: dns not working after monkey patching. Easily reproduced by following the steps of @heypnus. It is not related to special chars in the dns though, mine is:

dns.resolver.Resolver().nameservers ['192.168.65.1']

As a workaround reverting to dnspython 1.16.0 solves it.

That's a different issue https://github.com/eventlet/eventlet/issues/619 Eventlet 0.26.1+ pins dnspython<2 so just upgrade will partially solve it for you.

temoto avatar Oct 20 '20 01:10 temoto

@heypnus do you know why would there be \x00 at the end of nameserver in Linux?

temoto avatar Oct 20 '20 01:10 temoto

@Gilles-qbmt it fixed the issue for me, thanks.

yurijmikhalevich avatar Jan 11 '21 10:01 yurijmikhalevich