diff --git a/mitmproxy/models/connections.py b/mitmproxy/models/connections.py index 2cab6e4af..a98711a15 100644 --- a/mitmproxy/models/connections.py +++ b/mitmproxy/models/connections.py @@ -112,7 +112,7 @@ class ServerConnection(tcp.TCPClient, stateobject.StateObject): Attributes: address: Remote address. Can be both a domain or an IP address. ip_address: Resolved remote IP address. - source_address: Local IP address + source_address: Local IP address or client's source IP address. ssl_established: True if TLS is established, False otherwise cert: The certificate presented by the remote during the TLS handshake sni: Server Name Indication sent by the proxy during the TLS handshake diff --git a/netlib/tcp.py b/netlib/tcp.py index 1fd0164fb..c3b8a4076 100644 --- a/netlib/tcp.py +++ b/netlib/tcp.py @@ -729,10 +729,15 @@ class TCPClient(_Connection): def connect(self): try: - connection = socket.socket(self.address.family, socket.SOCK_STREAM) + if not self.connection: + connection = socket.socket(self.address.family, socket.SOCK_STREAM) + else: + connection = self.connection + if self.spoof_source_address: try: - connection.setsockopt(socket.SOL_IP, 19, 1) + if not connection.getsockopt(socket.SOL_IP, 19): + connection.setsockopt(socket.SOL_IP, 19, 1) except socket.error as e: raise exceptions.ProtocolException( "Failed to spoof the source address: " + e.strerror)