10
votes

Transfert de port Python / serveur de multiplexage

Je voudrais faire du serveur qui écoute le port UDP 162 (Piège SNMP), puis transmet ce trafic à plusieurs clients. Il est également important que le port source et l'adresse restent les mêmes (entrepoofing d'adresse).

Je suppose que le meilleur outil pour cela serait torsadé ou Scapy ou peut-être des prises de vanille, Seulement, je ne trouve rien dans la documentation pour torsadée sur l'entrepooftage / forgeage de l'adresse source.

Toute solution pour cela?

Editer: Bounty ajouté, Mybe Toute solution avec iptables?


0 commentaires

3 Réponses :


6
votes

Je ne suis pas à l'aise avec torsadée ou attachée, mais c'est assez simple de le faire avec des prises de vanille Python. Un avantage supplémentaire de cela est qu'il sera encore plus portable. Ce code fonctionne dans mes tests limités:

#!/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)


12 commentaires

Une chose que j'oublie de mettre en première partie de la déclaration de questions que j'ai besoin d'une adresse source et d'un port à partir du serveur d'origine (afin que le serveur ait besoin de fausse adresse source), peut-il faire cela?


Non, non, ça ne peut pas. Je pense que le problème que vous essayez de résoudre ici pourrait être mieux résolu par certaines règles d'IPTABLES. Pourquoi voulez-vous le faire avec Python, exactement?


Incidemment, je serais très surpris si vous pouvez forger des en-têtes de paquets avec tordu; Scédy est probablement votre meilleur pari. Je vais jeter un coup d'œil et voir à quel point c'est difficile.


D'accord, alors la saveur va le faire. Je vais essayer d'obtenir un exemple de rédigé ce soir si je peux.


En fait, je ne suis en fait pas si connu avec les IPTables, j'ai donc besoin d'apprendre de nouvelles compétences pour faire cela dans les IPTables, car je suis plus trouvé hors python, je décide d'apprendre à le faire à Python, et pour l'instant, je ne vais pas très bien;)


Eh bien, le problème est que ce dont vous parlez de faire est de muniger des paquets. Python n'est pas un bon outil pour cette tâche. En fait, cela représente moins de défi de programmation et davantage d'un défi sysadminning. Bien que vous puissiez écrire un code de savon que Woudl le faites, ce serait inefficace et lent. Cela appartient à un jeu de pare-feu. Cela dit, je vais toujours voir ce que je peux trouver.


Vous pouvez essayer d'utiliser des prises brutes pour faire votre usurpation.


Un bon point. Je pourrais essayer de jeter un exemple de prise brute. Je dis toujours que cette question est basée sur l'hypothèse incorrecte selon laquelle c'est un problème de programmation - il devrait vraiment être fait avec le logiciel de pare-feu existant.


@Benson: Je viens de tomber dans un cas d'utilisation pour avoir besoin de cela dans "Software utilisateurpace" - je suis en cours d'exécution sur un VPS dans lequel je ne peux pas exécuter / configurer iptables - et seule l'adresse IP sur ce VPS est blanche répertoriée dans un système cible dont j'ai besoin accéder.


@jsbueno avez-vous une racine sur la machine? Je suis assez certain que vous auriez besoin de le faire avec des prises brutes que vous avez besoin de la racine.


Oui - J'en ai une racine, même s'il utilise une technologie VM (oublié qui maintenant), qui partage le noyau avec l'hôte et ne peut charger aucun modules. (Par conséquent, je ne peux pas utiliser iptables)


Ah d'accord. Dans ce cas, je pense qu'il est possible de résoudre ce problème avec un démon de prise brute. Malheureusement, je n'ai pas le temps d'écrire un exemple en ce moment. :-(



0
votes

une solution différente mais liée à transférer des ports, pas de multiplexage (ne répondant pas à la question spécifique, mais j'espérais associer des associés - c'est ce que je cherchais au moins):

http://www.linux-support.com / CMS / CMS-Network-connexions-avec-Python /


0 commentaires

1
votes

La réponse acceptée n'a pas fonctionné pour moi et je finis par utiliser Un simple redirecteur TCP à Python < / a>: xxx


0 commentaires