optimize DNS query
This commit is contained in:
parent
979a51318c
commit
c5ca6bd80a
2 changed files with 30 additions and 3 deletions
|
@ -1008,6 +1008,9 @@ class TCPRelay(object):
|
||||||
if error_no in (errno.EAGAIN, errno.EINPROGRESS,
|
if error_no in (errno.EAGAIN, errno.EINPROGRESS,
|
||||||
errno.EWOULDBLOCK):
|
errno.EWOULDBLOCK):
|
||||||
return
|
return
|
||||||
|
elif error_no == errno.ECONNRESET:
|
||||||
|
shell.print_exception(e)
|
||||||
|
logging.info("recv RST, ignore")
|
||||||
else:
|
else:
|
||||||
shell.print_exception(e)
|
shell.print_exception(e)
|
||||||
if self._config['verbose']:
|
if self._config['verbose']:
|
||||||
|
|
|
@ -885,6 +885,8 @@ class UDPRelay(object):
|
||||||
self._udp_cache_size = config['udp_cache']
|
self._udp_cache_size = config['udp_cache']
|
||||||
self._cache = lru_cache.LRUCache(timeout=config['udp_timeout'],
|
self._cache = lru_cache.LRUCache(timeout=config['udp_timeout'],
|
||||||
close_callback=self._close_client)
|
close_callback=self._close_client)
|
||||||
|
self._cache_dns_client = lru_cache.LRUCache(timeout=10,
|
||||||
|
close_callback=self._close_client)
|
||||||
self._client_fd_to_server_addr = {}
|
self._client_fd_to_server_addr = {}
|
||||||
self._dns_cache = lru_cache.LRUCache(timeout=300)
|
self._dns_cache = lru_cache.LRUCache(timeout=300)
|
||||||
self._eventloop = None
|
self._eventloop = None
|
||||||
|
@ -1066,6 +1068,8 @@ class UDPRelay(object):
|
||||||
af, socktype, proto, canonname, sa = addrs[0]
|
af, socktype, proto, canonname, sa = addrs[0]
|
||||||
key = client_key(r_addr, af)
|
key = client_key(r_addr, af)
|
||||||
client = self._cache.get(key, None)
|
client = self._cache.get(key, None)
|
||||||
|
if not client:
|
||||||
|
client = self._cache_dns_client.get(key, None)
|
||||||
if not client:
|
if not client:
|
||||||
if self._forbidden_iplist:
|
if self._forbidden_iplist:
|
||||||
if common.to_str(sa[0]) in self._forbidden_iplist:
|
if common.to_str(sa[0]) in self._forbidden_iplist:
|
||||||
|
@ -1075,8 +1079,18 @@ class UDPRelay(object):
|
||||||
return
|
return
|
||||||
client = socket.socket(af, socktype, proto)
|
client = socket.socket(af, socktype, proto)
|
||||||
client.setblocking(False)
|
client.setblocking(False)
|
||||||
|
is_dns = False
|
||||||
|
if len(data) > 12 and data[11:19] == b"\x00\x01\x00\x00\x00\x00\x00\x00":
|
||||||
|
is_dns = True
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
#logging.info("unknown data %s" % (binascii.hexlify(data),))
|
||||||
|
if sa[1] == 53 and is_dns: #DNS
|
||||||
|
logging.debug("DNS query %s from %s:%d" % (common.to_str(sa[0]), r_addr[0], r_addr[1]))
|
||||||
|
self._cache_dns_client[key] = client
|
||||||
|
else:
|
||||||
self._cache[key] = client
|
self._cache[key] = client
|
||||||
self._client_fd_to_server_addr[client.fileno()] = r_addr
|
self._client_fd_to_server_addr[client.fileno()] = (r_addr, af)
|
||||||
|
|
||||||
self._sockets.add(client.fileno())
|
self._sockets.add(client.fileno())
|
||||||
self._eventloop.add(client, eventloop.POLL_IN, self)
|
self._eventloop.add(client, eventloop.POLL_IN, self)
|
||||||
|
@ -1088,6 +1102,7 @@ class UDPRelay(object):
|
||||||
r_addr[0], r_addr[1]))
|
r_addr[0], r_addr[1]))
|
||||||
|
|
||||||
self._cache.clear(self._udp_cache_size)
|
self._cache.clear(self._udp_cache_size)
|
||||||
|
self._cache_dns_client.clear(16)
|
||||||
|
|
||||||
if self._is_local:
|
if self._is_local:
|
||||||
ref_iv = [encrypt.encrypt_new_iv(self._method)]
|
ref_iv = [encrypt.encrypt_new_iv(self._method)]
|
||||||
|
@ -1215,7 +1230,13 @@ class UDPRelay(object):
|
||||||
client_addr = self._client_fd_to_server_addr.get(sock.fileno())
|
client_addr = self._client_fd_to_server_addr.get(sock.fileno())
|
||||||
if client_addr:
|
if client_addr:
|
||||||
self.server_transfer_dl += len(response)
|
self.server_transfer_dl += len(response)
|
||||||
self.write_to_server_socket(response, client_addr)
|
self.write_to_server_socket(response, client_addr[0])
|
||||||
|
key = client_key(client_addr[0], client_addr[1])
|
||||||
|
client = self._cache_dns_client.get(key, None)
|
||||||
|
if client:
|
||||||
|
logging.debug("remove dns client %s:%d" % (client_addr[0][0], client_addr[0][1]))
|
||||||
|
del self._cache_dns_client[key]
|
||||||
|
self._close_client(client)
|
||||||
else:
|
else:
|
||||||
# this packet is from somewhere else we know
|
# this packet is from somewhere else we know
|
||||||
# simply drop that packet
|
# simply drop that packet
|
||||||
|
@ -1344,6 +1365,7 @@ class UDPRelay(object):
|
||||||
def handle_periodic(self):
|
def handle_periodic(self):
|
||||||
if self._closed:
|
if self._closed:
|
||||||
self._cache.clear(0)
|
self._cache.clear(0)
|
||||||
|
self._cache_dns_client.clear(0)
|
||||||
self._dns_cache.sweep()
|
self._dns_cache.sweep()
|
||||||
if self._eventloop:
|
if self._eventloop:
|
||||||
self._eventloop.remove_periodic(self.handle_periodic)
|
self._eventloop.remove_periodic(self.handle_periodic)
|
||||||
|
@ -1355,6 +1377,7 @@ class UDPRelay(object):
|
||||||
else:
|
else:
|
||||||
before_sweep_size = len(self._sockets)
|
before_sweep_size = len(self._sockets)
|
||||||
self._cache.sweep()
|
self._cache.sweep()
|
||||||
|
self._cache_dns_client.sweep()
|
||||||
self._dns_cache.sweep()
|
self._dns_cache.sweep()
|
||||||
if before_sweep_size != len(self._sockets):
|
if before_sweep_size != len(self._sockets):
|
||||||
logging.debug('UDP port %5d sockets %d' % (self._listen_port, len(self._sockets)))
|
logging.debug('UDP port %5d sockets %d' % (self._listen_port, len(self._sockets)))
|
||||||
|
@ -1369,3 +1392,4 @@ class UDPRelay(object):
|
||||||
self._eventloop.remove(self._server_socket)
|
self._eventloop.remove(self._server_socket)
|
||||||
self._server_socket.close()
|
self._server_socket.close()
|
||||||
self._cache.clear(0)
|
self._cache.clear(0)
|
||||||
|
self._cache_dns_client.clear(0)
|
||||||
|
|
Loading…
Add table
Reference in a new issue