@@ -22,12 +22,10 @@ class WSTunServerProtocol(WebSocketServerProtocol, RelayMixin):
22
22
def __init__ (self ):
23
23
WebSocketServerProtocol .__init__ (self )
24
24
RelayMixin .__init__ (self )
25
- self .clientInfo = None
26
25
self .connectTargetTask = None
27
26
self ._dataToTarget = bytearray ()
28
27
29
28
def onConnect (self , request ):
30
- self .clientInfo = '{0}:{1}' .format (* self .transport .get_extra_info ('peername' ))
31
29
# ----- init decryptor -----
32
30
if not config .tun_ssl :
33
31
if config .compatible :
@@ -60,14 +58,14 @@ def onConnect(self, request):
60
58
raise ValueError ('wrong command %s' % cmd )
61
59
except (ValueError , Base64Error ) as e :
62
60
logging .error ('invalid request: %s (from %s), path: %s' %
63
- (e , self .clientInfo , path ))
61
+ (e , self .peer , path ))
64
62
raise ConnectionDeny (400 )
65
63
66
64
if not config .tun_ssl :
67
65
# filter replay attack
68
66
seen = seenNonceByTime [timestamp // 10 ]
69
67
if nonce in seen :
70
- logging .warning ('replay attack detected (from %s)' % self .clientInfo )
68
+ logging .warning ('replay attack detected (from %s)' % self .peer )
71
69
raise ConnectionDeny (400 )
72
70
seen .add (nonce )
73
71
@@ -86,11 +84,11 @@ def onConnect(self, request):
86
84
87
85
@coroutine
88
86
def connectTarget (self , addr , port , data ):
89
- logging .info ('requested %s <--> %s:%s' % (self .clientInfo , addr , port ))
87
+ logging .info ('requested %s <--> %s:%s' % (self .peer , addr , port ))
90
88
try :
91
89
reader , writer = yield from open_connection (addr , port )
92
90
except (ConnectionError , OSError , TimeoutError ) as e :
93
- logging .info ("can't connect to %s:%s (from %s)" % (addr , port , self .clientInfo ))
91
+ logging .info ("can't connect to %s:%s (from %s)" % (addr , port , self .peer ))
94
92
return self .resetTunnel (reason = "can't connect to target: %s" % e )
95
93
self .setProxy (reader , writer )
96
94
if data :
@@ -127,15 +125,15 @@ def onResetTunnel(self):
127
125
@coroutine
128
126
def onMessage (self , dat , isBinary ):
129
127
if not isBinary :
130
- logging .error ('non binary ws message received (from %s)' % self .clientInfo )
128
+ logging .error ('non binary ws message received (from %s)' % self .peer )
131
129
return self .sendClose (3000 )
132
130
133
131
cmd = ord (self .decrypt (dat [:1 ]))
134
132
if cmd == self .CMD_RST :
135
133
try :
136
134
msg = self .parseResetMessage (dat )
137
135
except ValueError as e :
138
- logging .error ('invalid reset message: %s (from %s)' % (e , self .clientInfo ))
136
+ logging .error ('invalid reset message: %s (from %s)' % (e , self .peer ))
139
137
return self .sendClose (3000 )
140
138
if not msg .startswith (' ' ):
141
139
logging .info ('tunnel abnormal reset: %s' % msg )
@@ -146,7 +144,7 @@ def onMessage(self, dat, isBinary):
146
144
raise Exception ('reset received when not idle' )
147
145
addr , port , remainData , __ = self .parseRelayHeader (dat )
148
146
except Exception as e :
149
- logging .error ('invalid request in reused tun: %s (from %s)' % (e , self .clientInfo ))
147
+ logging .error ('invalid request in reused tun: %s (from %s)' % (e , self .peer ))
150
148
return self .sendClose (3000 )
151
149
self .connectTargetTask = async_ (self .connectTarget (addr , port , remainData ))
152
150
elif cmd == self .CMD_DAT :
@@ -158,7 +156,7 @@ def onMessage(self, dat, isBinary):
158
156
return
159
157
self ._writer .write (dat )
160
158
else :
161
- logging .error ('wrong command: %s (from %s)' % (cmd , self .clientInfo ))
159
+ logging .error ('wrong command: %s (from %s)' % (cmd , self .peer ))
162
160
self .sendClose (3000 )
163
161
164
162
def sendServerStatus (self , redirectUrl = None , redirectAfter = 0 ):
@@ -168,8 +166,7 @@ def onClose(self, wasClean, code, reason, logWarn=True):
168
166
"""Logging failed requests."""
169
167
logWarn = True
170
168
if reason and not self .tunOpen .done ():
171
- peer = '{0}:{1}' .format (* self .transport .get_extra_info ('peername' )) # self.clientInfo is None
172
- logging .warning (reason + ' (from %s)' % peer )
169
+ logging .warning (reason + ' (from %s)' % self .peer )
173
170
logWarn = False
174
171
175
172
RelayMixin .onClose (self , wasClean , code , reason , logWarn = logWarn )
@@ -198,6 +195,7 @@ def silent_timeout_err_handler(loop_, context):
198
195
factory .autoPingInterval = 400 # only used to clear half-open connections
199
196
factory .autoPingTimeout = 30
200
197
factory .openHandshakeTimeout = 8 # timeout after TCP established and before succeeded WS handshake
198
+ factory .trustXForwardedFor = 1 if config .x_forward else 0
201
199
factory .closeHandshakeTimeout = 4
202
200
203
201
0 commit comments