Skip to content

Instantly share code, notes, and snippets.

@elfmimi
Forked from a1ad/SimpleTcpRedirector.py
Created March 6, 2021 03:10
Show Gist options
  • Save elfmimi/f265d72db7874cc522444a5158b16335 to your computer and use it in GitHub Desktop.
Save elfmimi/f265d72db7874cc522444a5158b16335 to your computer and use it in GitHub Desktop.
A simple TCP redirector in python
#!/usr/bin/env python
# JR: made some very minor changes for python3
import socket
import threading
import select
import sys
terminateAll = False
class ClientThread(threading.Thread):
def __init__(self, clientSocket, targetHost, targetPort):
threading.Thread.__init__(self)
self.__clientSocket = clientSocket
self.__targetHost = targetHost
self.__targetPort = targetPort
def run(self):
print ("Client Thread started")
self.__clientSocket.setblocking(0)
targetHostSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
targetHostSocket.connect((self.__targetHost, self.__targetPort))
targetHostSocket.setblocking(0)
clientData = b""
targetHostData = b""
terminate = False
while not terminate and not terminateAll:
inputs = [self.__clientSocket, targetHostSocket]
outputs = []
if len(clientData) > 0:
outputs.append(self.__clientSocket)
if len(targetHostData) > 0:
outputs.append(targetHostSocket)
try:
inputsReady, outputsReady, errorsReady = select.select(inputs, outputs, [], 1.0)
except Exception as e:
print (e)
break
for inp in inputsReady:
if inp == self.__clientSocket:
try:
data = self.__clientSocket.recv(4096)
except Exception as e:
print (e)
if data != None:
if len(data) > 0:
targetHostData += data
else:
terminate = True
elif inp == targetHostSocket:
try:
data = targetHostSocket.recv(4096)
except Exception as e:
print (e)
if data != None:
if len(data) > 0:
clientData += data
else:
terminate = True
for out in outputsReady:
if out == self.__clientSocket and len(clientData) > 0:
bytesWritten = self.__clientSocket.send(clientData)
if bytesWritten > 0:
clientData = clientData[bytesWritten:]
elif out == targetHostSocket and len(targetHostData) > 0:
bytesWritten = targetHostSocket.send(targetHostData)
if bytesWritten > 0:
targetHostData = targetHostData[bytesWritten:]
self.__clientSocket.close()
targetHostSocket.close()
print ("ClienThread terminating")
if __name__ == '__main__':
if len(sys.argv) != 5:
print ('Usage:\n\tpython SimpleTCPRedirector <host> <port> <remote host> <remote port>')
print ('Example:\n\tpython SimpleTCPRedirector localhost 8080 www.google.com 80')
sys.exit(0)
localHost = sys.argv[1]
localPort = int(sys.argv[2])
targetHost = sys.argv[3]
targetPort = int(sys.argv[4])
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.bind((localHost, localPort))
serverSocket.listen(5)
print ("Waiting for client...")
while True:
try:
clientSocket, address = serverSocket.accept()
except KeyboardInterrupt:
print ("\nTerminating...")
terminateAll = True
break
ClientThread(clientSocket, targetHost, targetPort).start()
serverSocket.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment