[Windows] Failed to resolve DNS name after monkey_patch
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
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
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
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.
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.
@heypnus do you know why would there be \x00 at the end of nameserver in Linux?
@Gilles-qbmt it fixed the issue for me, thanks.