68
68
for type in accepted_type :
69
69
redis_server_metadata .sadd ('server:accepted_type' , type )
70
70
71
- class Echo (Protocol , TimeoutMixin ):
71
+ class D4_Server (Protocol , TimeoutMixin ):
72
72
73
73
def __init__ (self ):
74
74
self .buffer = b''
75
75
self .setTimeout (timeout_time )
76
76
self .session_uuid = str (uuid .uuid4 ())
77
77
self .data_saved = False
78
78
self .first_connection = True
79
+ self .ip = None
80
+ self .source_port = None
79
81
self .stream_max_size = None
80
82
self .hmac_key = None
81
83
#self.version = None
@@ -85,15 +87,17 @@ def __init__(self):
85
87
86
88
def dataReceived (self , data ):
87
89
self .resetTimeout ()
88
- ip , source_port = self .transport .client
89
- if self .first_connection :
90
- logger .debug ('New connection, ip={}, port={} session_uuid={}' .format (ip , source_port , self .session_uuid ))
90
+ if self .first_connection or self .ip is None :
91
+ client_info = self .transport .client
92
+ self .ip = self .extract_ip (client_info [0 ])
93
+ self .source_port = client_info [1 ]
94
+ logger .debug ('New connection, ip={}, port={} session_uuid={}' .format (self .ip , self .source_port , self .session_uuid ))
91
95
# check blacklisted_ip
92
- if redis_server_metadata .sismember ('blacklist_ip' , ip ):
96
+ if redis_server_metadata .sismember ('blacklist_ip' , self . ip ):
93
97
self .transport .abortConnection ()
94
- logger .warning ('Blacklisted IP={}, connection closed' .format (ip ))
98
+ logger .warning ('Blacklisted IP={}, connection closed' .format (self . ip ))
95
99
96
- self .process_header (data , ip , source_port )
100
+ self .process_header (data , self . ip , self . source_port )
97
101
98
102
def timeoutConnection (self ):
99
103
self .resetTimeout ()
@@ -103,7 +107,7 @@ def timeoutConnection(self):
103
107
def connectionLost (self , reason ):
104
108
redis_server_stream .sadd ('ended_session' , self .session_uuid )
105
109
self .setTimeout (None )
106
- redis_server_stream .srem ('active_connection:{}' .format (self .type ), '{}:{}' .format (self .transport . client [ 0 ] , self .uuid ))
110
+ redis_server_stream .srem ('active_connection:{}' .format (self .type ), '{}:{}' .format (self .ip , self .uuid ))
107
111
redis_server_stream .srem ('active_connection' , '{}' .format (self .uuid ))
108
112
logger .debug ('Connection closed: session_uuid={}' .format (self .session_uuid ))
109
113
@@ -119,7 +123,7 @@ def unpack_header(self, data):
119
123
120
124
# blacklist ip by uuid
121
125
if redis_server_metadata .sismember ('blacklist_ip_by_uuid' , data_header ['uuid_header' ]):
122
- redis_server_metadata .sadd ('blacklist_ip' , self .transport . client [ 0 ] )
126
+ redis_server_metadata .sadd ('blacklist_ip' , self .ip )
123
127
self .transport .abortConnection ()
124
128
logger .warning ('Blacklisted IP by UUID={}, connection closed' .format (data_header ['uuid_header' ]))
125
129
@@ -142,6 +146,17 @@ def unpack_header(self, data):
142
146
143
147
return data_header
144
148
149
+ def extract_ip (self , ip_string ):
150
+ #remove interface
151
+ ip_string = ip_string .split ('%' )[0 ]
152
+ # IPv4
153
+ #extract ipv4
154
+ if '.' in ip_string :
155
+ return ip_string .split (':' )[- 1 ]
156
+ # IPv6
157
+ else :
158
+ return ip_string
159
+
145
160
def is_valid_uuid_v4 (self , header_uuid ):
146
161
try :
147
162
uuid_test = uuid .UUID (hex = header_uuid , version = 4 )
@@ -325,8 +340,9 @@ def main(reactor):
325
340
print (e )
326
341
sys .exit (1 )
327
342
certificate = ssl .PrivateCertificate .loadPEM (certData )
328
- factory = protocol .Factory .forProtocol (Echo )
329
- reactor .listenSSL (4443 , factory , certificate .options ())
343
+ factory = protocol .Factory .forProtocol (D4_Server )
344
+ # use interface to support both IPv4 and IPv6
345
+ reactor .listenSSL (4443 , factory , certificate .options (), interface = '::' )
330
346
return defer .Deferred ()
331
347
332
348
0 commit comments