Python port forwarding/multiplexing server

前端 未结 3 1105
广开言路
广开言路 2021-02-03 11:02

I would like to make server that listen on UDP port 162 (SNMP trap) and then forwards this traffic to multiple clients. Also important is that the source port & address stay

相关标签:
3条回答
  • 2021-02-03 11:44

    I am not comfortable with twisted or scapy, but it's quite straightforward to do this with vanilla python sockets. An extra advantage of that is that it will be even more portable. This code works in my limited tests:

    #!/usr/bin/python
    from socket import *
    bufsize = 1024 # Modify to suit your needs
    targetHost = "somehost.yourdomain.com"
    listenPort = 1123
    
    def forward(data, port):
        print "Forwarding: '%s' from port %s" % (data, port)
        sock = socket(AF_INET, SOCK_DGRAM)
        sock.bind(("localhost", port)) # Bind to the port data came in on
        sock.sendto(data, (targetHost, listenPort))
    
    def listen(host, port):
        listenSocket = socket(AF_INET, SOCK_DGRAM)
        listenSocket.bind((host, port))
        while True:
            data, addr = listenSocket.recvfrom(bufsize)
            forward(data, addr[1]) # data and port
    
    listen("localhost", listenPort)
    
    0 讨论(0)
  • 2021-02-03 11:46

    The accepted answer didn't work for me and I end up using A simple TCP redirector in python :

    #!/usr/bin/env python
    
    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 = ""
            targetHostData = ""
            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, e:
                    print e
                    break
    
                for inp in inputsReady:
                    if inp == self.__clientSocket:
                        try:
                            data = self.__clientSocket.recv(4096)
                        except Exception, 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, 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()
    
    0 讨论(0)
  • 2021-02-03 12:01

    A different but sort of related solution to forwarding ports, not multiplexing (not answering the specific question but hopefully matching related ones - this is what I was looking for at least):

    http://www.linux-support.com/cms/forward-network-connections-with-python/

    0 讨论(0)
提交回复
热议问题