aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/tcp.py
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2016-09-22 01:58:08 -0700
committerMaximilian Hils <git@maximilianhils.com>2016-09-22 01:58:08 -0700
commitf59ae4a57f65fa76812c3a29965df8a4b35448e9 (patch)
treeb7372482e9a40fe68f1faa70a2e7905076c8f960 /netlib/tcp.py
parent0dbb7033ee1a6e238752381ce99439ef7d38b208 (diff)
parente5b79a6d728584cceb918ffbf73c54ec55e948b5 (diff)
downloadmitmproxy-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.py13
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())