Skip to content

Commit 4b71e43

Browse files
committed
chg: [server] support both IPv4 and IPv6
1 parent 0abe815 commit 4b71e43

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

server/install_server.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
set -e
44
set -x
55

6-
sudo apt-get install python3-pip virtualenv screen whois unzip libffi-dev -y
6+
sudo apt-get install python3-pip virtualenv screen whois unzip libffi-dev gcc -y
77

88
if [ -z "$VIRTUAL_ENV" ]; then
99
virtualenv -p python3 D4ENV

server/server.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,16 @@
6868
for type in accepted_type:
6969
redis_server_metadata.sadd('server:accepted_type', type)
7070

71-
class Echo(Protocol, TimeoutMixin):
71+
class D4_Server(Protocol, TimeoutMixin):
7272

7373
def __init__(self):
7474
self.buffer = b''
7575
self.setTimeout(timeout_time)
7676
self.session_uuid = str(uuid.uuid4())
7777
self.data_saved = False
7878
self.first_connection = True
79+
self.ip = None
80+
self.source_port = None
7981
self.stream_max_size = None
8082
self.hmac_key = None
8183
#self.version = None
@@ -85,15 +87,17 @@ def __init__(self):
8587

8688
def dataReceived(self, data):
8789
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))
9195
# check blacklisted_ip
92-
if redis_server_metadata.sismember('blacklist_ip', ip):
96+
if redis_server_metadata.sismember('blacklist_ip', self.ip):
9397
self.transport.abortConnection()
94-
logger.warning('Blacklisted IP={}, connection closed'.format(ip))
98+
logger.warning('Blacklisted IP={}, connection closed'.format(self.ip))
9599

96-
self.process_header(data, ip, source_port)
100+
self.process_header(data, self.ip, self.source_port)
97101

98102
def timeoutConnection(self):
99103
self.resetTimeout()
@@ -103,7 +107,7 @@ def timeoutConnection(self):
103107
def connectionLost(self, reason):
104108
redis_server_stream.sadd('ended_session', self.session_uuid)
105109
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))
107111
redis_server_stream.srem('active_connection', '{}'.format(self.uuid))
108112
logger.debug('Connection closed: session_uuid={}'.format(self.session_uuid))
109113

@@ -119,7 +123,7 @@ def unpack_header(self, data):
119123

120124
# blacklist ip by uuid
121125
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)
123127
self.transport.abortConnection()
124128
logger.warning('Blacklisted IP by UUID={}, connection closed'.format(data_header['uuid_header']))
125129

@@ -142,6 +146,17 @@ def unpack_header(self, data):
142146

143147
return data_header
144148

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+
145160
def is_valid_uuid_v4(self, header_uuid):
146161
try:
147162
uuid_test = uuid.UUID(hex=header_uuid, version=4)
@@ -325,8 +340,9 @@ def main(reactor):
325340
print(e)
326341
sys.exit(1)
327342
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='::')
330346
return defer.Deferred()
331347

332348

0 commit comments

Comments
 (0)