rfmonk

port_forward.py

Jul 17th, 2014
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.50 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # forward a local port
  3. # usage $ python port_forward.py --local-port=8800
  4.  
  5. import argparse
  6. import asyncore
  7. import socket
  8. #import sys
  9. #sys.argv = ['--local-port=8800']
  10.  
  11. LOCAL_SERVER_HOST = 'localhost'
  12. REMOTE_SERVER_HOST = 'www.gentoo.org'
  13. BUFSIZE = 4096
  14.  
  15. class PortForwarder(asyncore.dispatcher):
  16.     def __init__(self, ip, port, remoteip, remoteport, backlog=5):
  17.         asyncore.dispatcher.__init__(self)
  18.         self.remoteip=remoteip
  19.         self.remoteport=remoteport
  20.         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
  21.         self.set_reuse_addr()
  22.         self.bind((ip,port))
  23.         self.listen(backlog)
  24.     def handle_accept(self):
  25.         conn, addr = self.accept()
  26.         print "Connected to:", addr
  27.         Sender(Receiver(conn),self.remoteip,self.remoteport)
  28.  
  29. class Receiver(asyncore.dispatcher):
  30.     def __init__(self,conn):
  31.         asyncore.dispatcher.__init__(self, conn)
  32.         self.from_remote_buffer=''
  33.         self.to_remote_buffer=''
  34.         self.sender=None
  35.     def handle_connect(self):
  36.         pass
  37.     def handle_read(self):
  38.         read = self.recv(BUFSIZE)
  39.         self.from_remote_buffer += read
  40.     def writable(self):
  41.         return (len(self.to_remote_buffer) > 0)
  42.     def handle_write(self):
  43.         sent = self.send(self.to_remote_buffer)
  44.         self.to_remote_buffer = self.to_remote_buffer[sent:]
  45.     def handle_close(self):
  46.         self.close()
  47.         if self.sender:
  48.             self.sender.close()
  49.  
  50. class Sender(asyncore.dispatcher):
  51.     def __init__(self, receiver, remoteaddr, remoteport):
  52.         asyncore.dispatcher.__init__(self)
  53.         self.receiver=receiver
  54.         receiver.sender = self
  55.         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
  56.         self.connect((remoteaddr, remoteport))
  57.     def handle_connect(self):
  58.         pass
  59.     def handle_read(self):
  60.         read = self.recv(BUFSIZE)
  61.         self.receiver.to_remote_buffer += read
  62.     def writable(self):
  63.         return (len(self.receiver.from_remote_buffer) > 0)
  64.     def handle_write(self):
  65.         sent = self.send(self.receiver.from_remote_buffer)
  66.         self.receiver.from_remote_buffer = \
  67.                                          self.receiver.from_remote_buffer[sent:]
  68.     def handle_close(self):
  69.         self.close()
  70.         self.receiver.close()
  71.  
  72. if __name__ == "__main__":
  73.     parser = argparse.ArgumentParser(description='Port forwarding example')
  74.     parser.add_argument('--local-host', action="store", dest="local_host", \
  75.                         default=LOCAL_SERVER_HOST)
  76.     parser.add_argument('--local-port', action="store", dest="local_port", \
  77.                         type=int, required=True)
  78.     parser.add_argument('--remote-host', action="store", \
  79.                         dest="remote_host", default=REMOTE_SERVER_HOST)
  80.     parser.add_argument('--remote-port', action="store", dest="remote_port", \
  81.                         type=int, default=80)
  82.     given_args = parser.parse_args()
  83.     local_host, remote_host = given_args.local_host, given_args.remote_host
  84.     local_port, remote_port = given_args.local_port, given_args.remote_port
  85.     print "Starting port forwarding local %s:%s => remote %s:%s" % \
  86.           (local_host, local_port, remote_host, remote_port)
  87.     PortForwarder(local_host, local_port, remote_host, remote_port)
  88.     asyncore.loop()
  89. """
  90. Empty Page!
  91. If you expected a real website instead something must be wrong. :-(
  92. If you also got an SSL hostname mismatch, your browser doesn't
  93. properly support SNI (e.g. IE8 on Windows XP).
  94.  
  95. was expecting Gentoo.org
  96. I receive this on FF and Links
  97. """
Advertisement
Add Comment
Please, Sign In to add comment