diff options
author | Maximilian Hils <git@maximilianhils.com> | 2016-09-22 01:58:08 -0700 |
---|---|---|
committer | Maximilian Hils <git@maximilianhils.com> | 2016-09-22 01:58:08 -0700 |
commit | f59ae4a57f65fa76812c3a29965df8a4b35448e9 (patch) | |
tree | b7372482e9a40fe68f1faa70a2e7905076c8f960 /netlib/tcp.py | |
parent | 0dbb7033ee1a6e238752381ce99439ef7d38b208 (diff) | |
parent | e5b79a6d728584cceb918ffbf73c54ec55e948b5 (diff) | |
download | mitmproxy-f59ae4a57f65fa76812c3a29965df8a4b35448e9.tar.gz mitmproxy-f59ae4a57f65fa76812c3a29965df8a4b35448e9.tar.bz2 mitmproxy-f59ae4a57f65fa76812c3a29965df8a4b35448e9.zip |
Merge branch 'fully_transparent'
Diffstat (limited to 'netlib/tcp.py')
-rw-r--r-- | netlib/tcp.py | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/netlib/tcp.py b/netlib/tcp.py index e5c84165..eea10425 100644 --- a/netlib/tcp.py +++ b/netlib/tcp.py @@ -605,7 +605,7 @@ class ConnectionCloser(object): class TCPClient(_Connection): - def __init__(self, address, source_address=None): + def __init__(self, address, source_address=None, spoof_source_address=None): super(TCPClient, self).__init__(None) self.address = address self.source_address = source_address @@ -613,6 +613,7 @@ class TCPClient(_Connection): self.server_certs = [] self.ssl_verification_error = None # type: Optional[exceptions.InvalidCertificateException] self.sni = None + self.spoof_source_address = spoof_source_address @property def address(self): @@ -729,6 +730,16 @@ class TCPClient(_Connection): def connect(self): try: connection = socket.socket(self.address.family, socket.SOCK_STREAM) + + if self.spoof_source_address: + try: + # 19 is `IP_TRANSPARENT`, which is only available on Python 3.3+ on some OSes + if not connection.getsockopt(socket.SOL_IP, 19): + connection.setsockopt(socket.SOL_IP, 19, 1) + except socket.error as e: + raise exceptions.TcpException( + "Failed to spoof the source address: " + e.strerror + ) if self.source_address: connection.bind(self.source_address()) connection.connect(self.address()) |