2017-07-24 2 views
0

Ich möchte einen Daemon schreiben, der auf einer großen Anzahl von AF_INET-SOCK_STREAM und AF_INET-SOCK_DGRAM Sockets für Netzwerk-Debugging-Zwecke verfügbar ist.Wie multipliziert man AF_INET-Sockets mit einem Daemon und erhält man die Informationen über den ursprünglichen Port in der Anwendung?

Um eine übermäßige Ressourcennutzung zu vermeiden, möchte ich vermeiden, eine große Anzahl von Ports auf der Anwendungsschicht zu öffnen, aber versuche die Verbindungen pro Socket-Typ auf unteren Schichten zu multiplexen. Die Kenntnis des ursprünglichen eingehenden Ports auf der Anwendungsschicht ist Voraussetzung.

Ich habe erfolgreich einen Daemon implementiert, der auf einem AF_INET SOCK_STREAM-Socket wartet, der von einer iptables-REDIRECT-Regel gemultiplext wird. Der ursprüngliche eingehende Port der Verbindung kann durch Aufrufen von getsockopt mit SO_ORIGINAL_DST abgerufen werden. Soweit ich weiß, funktioniert dies nicht mit AF_INET SOCK_DGRAM.

Ich habe auch erfolgreich einen Daemon implementiert, der auf einen AF_INET SOCK_DGRAM-Socket wartet, der durch eine iptables-TPROXY-Regel gemultiplext wird. Der ursprüngliche eingehende Port der Verbindung kann abgerufen werden, indem recvmsg() verwendet wird und die verfügbare Zusatznachricht mit Informationen über die Verbindung vor dem Multiplexen konsumiert wird. Soweit ich weiß, funktioniert das nicht mit AF_INET SOCK_STREAM.

Gibt es eine Transportschicht-agnostische Art des Multiplexens solcher Socket-Verbindungen und das Abrufen von Informationen über den ursprünglichen eingehenden Port? Möglicherweise sogar für Protokolle wie SCTP oder DCCP geeignet?

+0

"Gibt es eine Transportschicht-agnostische Möglichkeit, solche Socket-Verbindungen zu multiplexen und Informationen über den ursprünglichen eingehenden Port abzurufen?" Das klingt eher nach einer Frage für Superuser als nach Stackoverflow. Dinge wie Iptables-Regeln sind in der Regel hier nicht möglich. – xaxxon

+0

Sieht für SO angemessen aus, da es nicht so sehr um iptables geht, sondern um die Programmierung auf dem (Proxy-) Server, aber: etwas SOS-Verhalten zwischen SOCK_STREAM und SOCK_DGRAM ist etwas optimistisch, IMO. – ephemient

Antwort

0

Mit TCP haben Sie eine Verbindung. Der Zielport für diese Verbindung ist für alle Pakete innerhalb dieser Verbindung identisch. In diesem Fall entspricht jeder angeschlossene Socket (Ergebnis aus accept) einer einzelnen Verbindung und der eingehende Port ist eine Eigenschaft dieses Sockets. In diesem Fall spielt es keine Rolle, ob der abhörende Socket Verbindungen an mehreren Ports akzeptiert, alles, was zählt, ist der angeschlossene Socket.

Mit UDP haben Sie keine Verbindung. Stattdessen wird derselbe Socket verwendet, um Pakete von mehreren Clients und in Ihrem Fall von mehreren eingehenden Ports zu empfangen. Quell- und Ziel-IP und -Port sind somit eine Eigenschaft jedes Pakets und nicht des Sockets.

Aus diesem Grund benötigen Sie verschiedene Schnittstellen zum Abrufen des ursprünglichen eingehenden Ports: ein Socket für TCP und ein Paket für UDP.

Verwandte Themen