Browse Source

detect wrong http request

disconnect wrong request by default
dev
BreakWa11 9 years ago
parent
commit
b778a60502
  1. 2
      shadowsocks/obfsplugin/http_simple.py
  2. 16
      shadowsocks/tcprelay.py

2
shadowsocks/obfsplugin/http_simple.py

@ -178,6 +178,8 @@ class http_simple(plain.plain):
if len(ret_buf) >= 15: if len(ret_buf) >= 15:
self.has_recv_header = True self.has_recv_header = True
return (ret_buf, True, False) return (ret_buf, True, False)
if len(ret_buf) == 0:
return self.not_match_return(buf)
return (b'', True, False) return (b'', True, False)
else: else:
return (b'', True, False) return (b'', True, False)

16
shadowsocks/tcprelay.py

@ -130,6 +130,8 @@ class TCPRelayHandler(object):
server_info.param = '' server_info.param = ''
self._protocol.set_server_info(server_info) self._protocol.set_server_info(server_info)
self._redir_list = config.get('redirect', ["0.0.0.0:0"])
self._fastopen_connected = False self._fastopen_connected = False
self._data_to_write_to_local = [] self._data_to_write_to_local = []
self._data_to_write_to_remote = [] self._data_to_write_to_remote = []
@ -312,8 +314,7 @@ class TCPRelayHandler(object):
return True return True
def _get_redirect_host(self, client_address, ogn_data): def _get_redirect_host(self, client_address, ogn_data):
# test host_list = self._redir_list or ["0.0.0.0:0"]
host_list = [(b"www.bing.com", 80), (b"www.microsoft.com", 80), (b"cloudfront.com", 80), (b"cloudflare.com", 80), (b"1.2.3.4", 1000), (b"0.0.0.0", 0)]
hash_code = binascii.crc32(ogn_data) hash_code = binascii.crc32(ogn_data)
addrs = socket.getaddrinfo(client_address[0], client_address[1], 0, socket.SOCK_STREAM, socket.SOL_TCP) addrs = socket.getaddrinfo(client_address[0], client_address[1], 0, socket.SOCK_STREAM, socket.SOL_TCP)
af, socktype, proto, canonname, sa = addrs[0] af, socktype, proto, canonname, sa = addrs[0]
@ -324,7 +325,14 @@ class TCPRelayHandler(object):
addr = struct.unpack('>I', address_bytes)[0] addr = struct.unpack('>I', address_bytes)[0]
else: else:
addr = 0 addr = 0
return host_list[((hash_code & 0xffffffff) + addr + 3) % len(host_list)] host_post = common.to_str(host_list[((hash_code & 0xffffffff) + addr) % len(host_list)])
items = host_post.rsplit(':', 1)
if len(items) > 1:
try:
return (items[0], int(items[1]))
except:
pass
return (host_post, 80)
def _handel_protocol_error(self, client_address, ogn_data): def _handel_protocol_error(self, client_address, ogn_data):
#raise Exception('can not parse header') #raise Exception('can not parse header')
@ -332,7 +340,7 @@ class TCPRelayHandler(object):
self._encrypt_correct = False self._encrypt_correct = False
#create redirect or disconnect by hash code #create redirect or disconnect by hash code
host, port = self._get_redirect_host(client_address, ogn_data) host, port = self._get_redirect_host(client_address, ogn_data)
data = b"\x03" + common.chr(len(host)) + host + struct.pack('>H', port) data = b"\x03" + common.chr(len(host)) + common.to_bytes(host) + struct.pack('>H', port)
logging.warn("TCP data redir %s:%d %s" % (host, port, binascii.hexlify(data))) logging.warn("TCP data redir %s:%d %s" % (host, port, binascii.hexlify(data)))
return data + ogn_data return data + ogn_data

Loading…
Cancel
Save