2017-12-18 7 views
-1

Ich versuche Unit-Tests für meine Netzwerkskripte einzurichten. Da die Komponententests von einem Benutzer ohne Rootberechtigung ausgeführt werden (in der Regel "jenkins"), möchte ich in der Lage sein, eine Netzwerkschnittstelle einzurichten, die von jenkins zum Testen der Pakete verwendet werden kann, die von meinem Netzwerk gesendet werden Skripte. Das Programm, das ich teste, verwendet die Netzwerkschnittstelle im "Promiscuous" -Modus und wird letztendlich unter dem Root-Benutzer als Linux-Dienst ausgeführt. Ich möchte jedoch, dass die Funktionseinheit getestet wird, ohne dass eine root-Anmeldung oder interaktive Eingabe erforderlich ist. Der Benutzer "jenkins" ist kein interaktiver Benutzer auf dem System.Senden von Daten an eine Linux-Oberfläche ohne Sudo

Ich kann Set-up eine Anzapfung Schnittstelle (CentOS 7.x) auf die folgende Weise:

sudo ip tuntap add tap0 mode tap user jenkins 
sudo ifconfig tap0 promisc up 

Diese eine Schnittstelle bringt, die ich sehen kann ifconfig verwenden, aber es ist nicht "RUNNING" .

Ich kann Daten senden, indem Sie mein Programm mit sudo XXXX ausführen, damit mein Programm wie erwartet funktioniert. Wenn ich das Programm jedoch über den jenkins-Account laufe, passieren die Pakete nicht - ich kann das jenkins-Benutzerkonto vorübergehend auf "interaktiv" umstellen, um dies zu versuchen. Ich benutze Wireshark, um den Durchsatz auf dieser Schnittstelle zu sehen.

Ich habe dies mit meinem eigenen Benutzerkonto und anderen Konten versucht, aber nur das root-Konto funktioniert.

Ich glaube, es gibt einige Befehlszeilenaufrufe, die ich verwenden kann, um einem Nicht-Root-Benutzer die Verwendung einer (privaten, benutzereigenen) Netzwerkschnittstelle zu erlauben, aber ich kann nichts finden.

ich könnte möglicherweise ein System erarbeiten mit sudo und/oder suid (chmod 4755 XXX) Berechtigungen, den Unit-Tests erlauben würde, mit Root-Rechten laufen, aber es scheint, dass ich in der Lage sein sollte, ohne dass automatisierte Tests ausführen gehe durch diesen etwas gewundenen Prozess.

Weiß jemand, wie ich eine Tippschnittstelle von einem Benutzerkonto verwenden kann?

Hinweis: Letztendlich verwendet mein Programm libpcappcap_inject, um ein Paket in die Schnittstelle zu injizieren. Wenn jemand eine andere programmatische Lösung kennt, ist das ein anderer Weg, dieses Problem anzugehen.

Ich kann auch Pakete als Nicht-Root-Benutzer auf meine echte Netzwerkschnittstelle injizieren, und das funktioniert, aber es ist etwas gefährlich, meine Pakete (die fehlerhaft sein könnten) auf das reale Netzwerk loszulassen. Es scheint unpassend zu sein, dass ein Benutzer eine echte Schnittstelle verwenden kann, aber keine "Anzapf" -Schnittstelle zum Testen verwendet.

+0

Stack Overflow ist eine Website für Programmier- und Entwicklungsfragen. Diese Frage scheint off-topic zu sein, weil es nicht um Programmierung oder Entwicklung geht. Siehe [Welche Themen kann ich hier fragen?] (Http://stackoverflow.com/help/on-topic) in der Hilfe. Vielleicht [Super User] (http://superuser.com/) oder [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/) wäre ein besserer Ort, um zu fragen. – jww

+0

Ich versuche, ein Programm zu entwickeln und Komponententests für dieses Programm auszuführen, aber ich schätze, dass es * speziell * für Verwaltungsaufgaben relevanter sein kann. Könnte ich die Frage an eines dieser Bretter weitergeben? Ich verstehe, dass sie von demselben System betrieben werden. – user1738833

Antwort

0

Es scheint, dass die libpcap-Bibliothek den Zugriff auf ein Tap-Interface-Setup auf diese Weise nicht erlaubt.

Um dies zu beheben, musste ich die C/C++ Code in dem System schreiben direkt an die Netzwerk-Schnittstelle des Dateideskriptor wie dies unter Verwendung von Code schreiben:

#include <fcntl.h> 
#include <linux/if.h> 
#include <linux/if_tun.h> 
#include <sys/ioctl.h> 

... 

struct ifreq ifr; 
memset(&ifr, 0, sizeof(ifr)); 
ifr.ifr_flags = IFF_TAP | IFF_NO_PI; 
strncpy(ifr.ifr_name, "tap0", IFNAMSIZ); 
int fd = open("/dev/net/tun", O_RDWR); 
int err = ioctl(fd, TUNSETIFF, (void*) &ifr); 

... 

int rc = write(fd, packetData, length); 

Letztlich wurde dieser mit einem programmatischen gelöst Lösung. Ich glaube wirklich nicht, dass es eine sys-admin-Lösung gibt, um die libpcap-Bibliothek weiter zu verwenden.

Hinweis: Ich versuche zuerst, das Tippgerät auf diese Weise zu öffnen, bevor ich libpcap benutze (was für andere Situationen nützlich ist). Dies liegt daran, dass libpcap beim Versuch desselben Tests automatisch fehlschlagen kann und keine Fehler zurückgibt, aber einfach nicht funktioniert.