Advertisement
rfmonk

port_forward.py

Jun 25th, 2014
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.69 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # optimized for python 2.7
  3.  
  4.  
  5. import argparse
  6. import asyncore
  7. import socket
  8. LOCAL_SERVER_HOST = 'localhost'
  9. REMOTE_SERVER_HOST = 'www.infose.cc'
  10. BUFSIZE = 4096
  11.  
  12. class PortForwarder(asyncore.dispatcher):
  13.     def __init__(self, ip, port, remoteip, remoteport, backlog=5):
  14.         asyncore.dispatcher.__init__(self)
  15.         self.remoteip=remoteip
  16.         self.remoteport=remoteport
  17.         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
  18.         self.set_reuse_addr()
  19.         self.bind((ip, port))
  20.         self.listen(backlog)
  21.     def handle_accept(self):
  22.         conn, addr = self.accept()
  23.         print "Connected to:", addr
  24.         Sender(Receiver(conn), self.remoteip,self.remoteport)
  25.  
  26.  
  27. class Receiver(asyncore.dispatcher):
  28.     def __init__(self, conn):
  29.         asyncore.dispatcher.__init__(self,conn)
  30.         self.from_remote_buffer=''
  31.         self.to_remote_buffer=''
  32.         self.sender=None
  33.  
  34.     def handle_connect(self):
  35.         pass
  36.  
  37.     def handle_read(self):
  38.         read = self.recv(BUFSIZE)
  39.         self.from_remote_buffer += read
  40.  
  41.     def writable(self):
  42.         return (len(self.to_remote_buffer) > 0)
  43.  
  44.     def handle_write(self):
  45.         sent = self.send(self.to_remote_buffer)
  46.         self.to_remote_buffer = self.to_remote_buffer[sent:]
  47.  
  48.     def handle_close(self):
  49.         self.close()
  50.         if self.sender:
  51.             self.sender.close()
  52.  
  53.  
  54. class Sender(asyncore.dispatcher):
  55.     def __init__(self, receiver, remoteaddr, remoteport):
  56.         asyncore.dispatcher.__init__(self)
  57.         self.receiver=receiver
  58.         receiver.sender=self
  59.         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
  60.         self.connect((remoteaddr, remoteport))
  61.  
  62.     def handle_connect(self):
  63.         pass
  64.  
  65.     def handle_read(self):
  66.         read = self.recv(BUFSIZE)
  67.         self.receiver.to_remote_buffer += read
  68.  
  69.     def writable(self):
  70.         return (len(self.receiver.from_remote_buffer) > 0)
  71.  
  72.     def handle_write(self):
  73.         sent = self.send(self.receiver.from_remote_buffer)
  74.         self.receiver.from_remote_buffer = \
  75.         self.receiver.from_remote_buffer[sent:]
  76.  
  77.     def handle_close(self):
  78.         self.close()
  79.         self.receiver.close()
  80.  
  81.  
  82. if __name__ == "__main__":
  83.     parser = argparse.ArgumentParser(description='Port forwarding example')
  84.     parser.add_argument('--local-host', action="store", dest="local_host", \
  85.         default=LOCAL_SERVER_HOST)
  86.     parser.add_argument('--local-port', action="store", dest="local_port", \
  87.         type=int, required=True)
  88.     parser.add_argument('--remote-host', action="store", dest="remote_host"\
  89.         , default=REMOTE_SERVER_HOST)
  90.     parser.add_argument('--remote-port', action="store", dest="remote_port"\
  91.         , type=int, default=80)
  92.     given_args = parser.parse_args()
  93.     local_host, remote_host = given_args.local_host, given_args.remote_host
  94.     local_port, remote_port = given_args.local_port, given_args.remote_port
  95.     print "Starting port forwarding local %s:%s => remote %s:%s" % \
  96.     (local_host, local_port, remote_host, remote_port)
  97.     asyncore.loop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement