[Python] Cmd line param to log proxied clients

* Added a command line parameter, '--log-proxied-client' to
  enable logging of intermediate proxies;
* only supports X-Forwarded-For header.
This commit is contained in:
Alessandro Muggianu 2018-05-03 15:09:17 +01:00
parent 38b77714a9
commit 9b9196e4af
3 changed files with 41 additions and 8 deletions

View File

@ -457,6 +457,9 @@ def websockify_init():
parser.add_option("--log-file", metavar="FILE",
dest="log_file",
help="File where logs will be saved")
parser.add_option("--log-proxied-client", action="store_true",
help="prepends the content of the X-Forwarded-For "
"header (if present) to the immediate client's IP in logs")
(opts, args) = parser.parse_args()

View File

@ -17,6 +17,7 @@ except ImportError:
from websockify.websocket import WebSocket, WebSocketWantReadError, WebSocketWantWriteError
class WebSocketRequestHandler(BaseHTTPRequestHandler):
"""WebSocket request handler base class.
@ -35,6 +36,13 @@ class WebSocketRequestHandler(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
BaseHTTPRequestHandler.__init__(self, request, client_address, server)
def address_string(self, show_proxied=False):
immediate_client = super(WebSocketRequestHandler, self).address_string()
fwd_for = self.headers.get("X-Forwarded-For", None)
if show_proxied and fwd_for:
return "{},{}".format(fwd_for, immediate_client)
return immediate_client
def handle_one_request(self):
"""Extended request handler

View File

@ -88,10 +88,11 @@ class WebSockifyRequestHandler(WebSocketRequestHandler, SimpleHTTPRequestHandler
self.daemon = getattr(server, "daemon", False)
self.record = getattr(server, "record", False)
self.run_once = getattr(server, "run_once", False)
self.rec = None
self.rec = None
self.handler_id = getattr(server, "handler_id", False)
self.file_only = getattr(server, "file_only", False)
self.traffic = getattr(server, "traffic", False)
self.log_proxied_client = getattr(server, "log_proxied_client", False)
self.logger = getattr(server, "logger", None)
if self.logger is None:
@ -99,13 +100,17 @@ class WebSockifyRequestHandler(WebSocketRequestHandler, SimpleHTTPRequestHandler
WebSocketRequestHandler.__init__(self, req, addr, server)
def log_message(self, format, *args):
self.logger.info("%s - - [%s] %s" % (self.address_string(), self.log_date_time_string(), format % args))
#
# WebSocketRequestHandler logging/output functions
#
def log_message(self, format, *args):
self.logger.info(
"%s - - [%s] %s" % (
self.address_string(show_proxied=self.log_proxied_client),
self.log_date_time_string(),
format % args))
def print_traffic(self, token="."):
""" Show traffic flow mode. """
if self.traffic:
@ -216,7 +221,13 @@ class WebSockifyRequestHandler(WebSocketRequestHandler, SimpleHTTPRequestHandler
def handle_upgrade(self):
# ensure connection is authorized, and determine the target
self.validate_connection()
try:
self.validate_connection()
except WebSockifyServer.EClose as e:
# Add info on remote client and re-raise
if self.log_proxied_client:
e.orig_client = self.address_string(show_proxied=self.log_proxied_client)
raise
WebSocketRequestHandler.handle_upgrade(self)
@ -332,7 +343,8 @@ class WebSockifyServer(object):
file_only=False,
run_once=False, timeout=0, idle_timeout=0, traffic=False,
tcp_keepalive=True, tcp_keepcnt=None, tcp_keepidle=None,
tcp_keepintvl=None):
tcp_keepintvl=None,
log_proxied_client=False):
# settings
self.RequestHandlerClass = RequestHandlerClass
@ -361,6 +373,8 @@ class WebSockifyServer(object):
self.tcp_keepidle = tcp_keepidle
self.tcp_keepintvl = tcp_keepintvl
self.log_proxied_client = log_proxied_client
# keyfile path must be None if not specified
self.key = None
@ -411,6 +425,8 @@ class WebSockifyServer(object):
self.msg(" - Backgrounding (daemon)")
if self.record:
self.msg(" - Recording to '%s.*'", self.record)
if self.log_proxied_client:
self.msg(" - Logging IP of intermediate proxies")
#
# WebSockifyServer static methods
@ -671,11 +687,17 @@ class WebSockifyServer(object):
try:
try:
client = self.do_handshake(startsock, address)
except self.EClose:
except self.EClose as e:
_, exc, _ = sys.exc_info()
# Connection was not a WebSockets connection
if exc.args[0]:
self.msg("%s: %s" % (address[0], exc.args[0]))
orig_client = getattr(e, 'orig_client', None)
if orig_client:
# this allowes to log IP of possibly
# proxied clients
self.msg("%s: %s" % (orig_client, exc.args[0]))
else:
self.msg("%s: %s" % (address[0], exc.args[0]))
except WebSockifyServer.Terminate:
raise
except Exception: