2017-12-18 15 views
-1

私はネットワークスクリプト用のユニットテストを設定しようとしています。単体テストは非ルートユーザー(通常は "jenkins")によって実行されるため、ネットワークから送信されているパケットをテストするためにジェンキンが使用できるネットワークインターフェイスを設定できるようにしたいスクリプト。私がテストしているプログラムは、ネットワークインターフェイスを "無差別"モードで使用し、最終的にはrootユーザーの下でLinuxサービスとして実行されます。しかし、rootログインや対話型入力を必要とせずに、機能ユニットをテストしたいと思っています.Jenkins "user"は、システム上の対話型ユーザーではありません。sudoを使わずにLinuxタップインターフェースにデータを送信

私はセットアップすることができ、次のようにタップインタフェース(CentOSの7.xのを):

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

これは私がifconfigを使用して見ることができるインタフェースを起動しますが、それは「RUNNING」されていません。

予想通り私のプログラムが動作しているので、私は、sudo XXXXを使用して私のプログラムを実行することによって、それにデータを送信することができます。しかし、私がjenkinsアカウントを通じてプログラムを実行すると、パケットは通過しません - 私は一時的にjenkinsユーザーアカウントを "インタラクティブ"にしてこれを試すことができます。私はWiresharkを使用して、このインターフェイスのスループットを表示しています。

私は自分のユーザーアカウントを使用して、これを試みたが、他のアカウントが、唯一のrootアカウントの作品ました。

私は(プライベート、ユーザー所有の)ネットワーク・インタフェースを利用するためにroot以外のユーザーを許可するために使用できるいくつかのコマンドラインからの呼び出しがあると感じるが、私は何も見つけることができません。

I はおそらくsudoおよび/またはSUIDを使用してシステムを出て仕事ができる(chmod 4755 XXX)ユニットテストは、root権限で実行できるようになる権限が、私がすることなく、自動テストを実行することができるはずと思われますこのやや曲がりくねったプロセスを経る。

私はユーザーアカウントからタップインターフェイスをどのように利用できるのか誰かが知っていますか?

注:私のプログラムは最終的にlibpcappcap_injectを使用して、パケットをインターフェイスに注入します。誰かが異なるプログラム的な解決策を知っていれば、それがこの問題に取り組む別の方法です。

また、実際のネットワークインターフェイスに非ルートユーザーとしてパケットを注入することもできますが、実際のネットワーク上にパケット(誤っている可能性があります)を緩和することはやや危険です。ユーザーが実際のインターフェースを利用することはできますが、テストのために「タップ」インターフェースを使用することはできません。

+0

スタックオーバーフローは、プログラミングおよび開発の質問のサイトです。この質問は、プログラミングや開発に関するものではないので、話題にはならないようです。ヘルプセンターの[ここではどのトピックを参照できますか](http://stackoverflow.com/help/on-topic)を参照してください。おそらく、[スーパーユーザ](http://superuser.com/)や[Unix&Linux Stack Exchange](http://unix.stackexchange.com/)の方が良いかもしれません。 – jww

+0

私はプログラムを開発しようとしていますが、そのプログラムの単体テストを実行していますが、特に管理タスクに関連性があるかもしれません。これらのボードの1つに質問を転送する方法はありますか?私は彼らが同じシステムによって運営されていることを理解しています。 – user1738833

答えて

0

libpcapのライブラリは、このようにタップインターフェイスのセットアップへのアクセスを許可しないことが表示されます。これを解決するには

は、私がこのようなコードを使用して、ネットワークインタフェースのファイル記述子に直接書き込むために、システム内のC/C++コードを書くために必要な:

#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); 

最終的には、これは、プログラムで解決されました溶液。私は本当にlibpcapライブラリを使い続けるためのsys-adminの解決策があるとは思わない。

注:私は(他の状況のた​​めに有用である)のlibpcapを使用するに行く前に、このよう最初のタップデバイスを開こう。これは、libpcapが同じことを試みるときに静かに失敗することができ、エラーを返さないが、単純に機能しないからです。

関連する問題