
私のWebスクリプトの単体テストを設定しようとしています。単体テストは、rootではなくユーザー(通常は「jenkins」)によって実行されるため、jenkinsが自分のネットワークから送信されたパケットスクリプトをテストするために使用できるネットワークインタフェースを設定できるようにしたいです。私がテストしているプログラムは、「無差別」モードでネットワークインタフェースを使用し、最終的にrootユーザーの下でLinuxサービスとして実行されます。しかし、rootログインや対話型入力なしで機能単位をテストしたいと思います。 jenkins「ユーザー」はシステムの対話型ユーザーではありません。
以下を使用してTapインターフェイス(CentOS 7.x)を設定できます。
sudo ip tuntap add tap0 mode tap user jenkins
sudo ifconfig tap0 promisc up
これで を使用して表示できるインターフェイスが表示されますが、ifconfig
「実行中」ではありません。
を使用してプログラムを実行してデータを送信できるため、sudo XXXX
プログラムは期待どおりに機能します。ただし、 jenkins アカウントを介してプログラムを実行すると、パケットは通過しません。これを試すために、一時的にjenkinsユーザーアカウントを「会話型」に切り替えることができます。私はこのインターフェースのスループットを見るためにWiresharkを使用しています。
私のユーザーアカウントとは異なるアカウントでこれを試しましたが、rootアカウントのみが機能します。
root以外のユーザーが(プライベート、ユーザー所有)ネットワークインターフェイスを使用できるようにするために使用できるコマンドライン呼び出しがいくつかあると思いましたが、何も見つかりませんでした。
私できるsudo
root権限で単体テストを実行する権限および/またはsuid()権限を使用してシステムを設計することは可能かもしれませんが、これはややchmod 4755 XXX
難しいプロセスを必要とせずに自動化されたテストを実行できるはずです。
ユーザーアカウントのクリックインターフェースを使用する方法を知っている人はいますか?
注:最終的に私のプログラムはlibpcap
'を使用してpcap_inject
インターフェイスにパケットを注入します。
また、root以外のユーザーとして実際のネットワークインターフェイスにパケットを挿入することができますが、これは機能しますが、私のパケット(おそらく間違っている)を物理ネットワークに緩めるのは少し危険です。ユーザーが実際のインターフェイスを使用できますが、テスト用に「ポイントアンドクリック」インターフェイスを使用できないことは似合わないようです。
私は(他のプロジェクトの中で)ネットワーク名前空間を調べました。 AFAIK、役に立たないけど、修正させていただきます。
これはこの質問の変形かもしれませんが、残念ながらまだ答えはありません。タブインターフェイスがパケットを受信できない
答え1
これはユーザーとネットワークの名前空間に対する操作であり、カーネルの構成に応じて、呼び出しは仮想unshare -Urn
ネットワークインタフェースが別々のシステムにルートであるかのように作成できるプライベートネットワークの名前空間(デフォルトではシェル)を使用してプログラムを実行します。