GNU/Linux >> Linux の 問題 >  >> Linux

Linux – Linuxで子プロセスを「オフライン」(外部ネットワークなし)で実行するコマンド?

実際のネットワークを停止せずにオフラインモードでテストしたいプログラムがあります。このプログラムは、UNIXドメインソケットやループバックなどのローカルソケットに接続する必要があります。また、聞く必要があります ループバック時に、他のアプリに表示されます。

ただし、リモートマシンへの接続は失敗するはずです。

straceのようなユーティリティが欲しいのですが /unshare / sudo インターネット(およびLAN)を隠してコマンドを実行するだけで、他のすべてはまだ機能しています:

$ offline my-program-to-test

この質問には、答えのヒントがあります。プロセスのネットワークアクセスをブロックしますか?

別のユーザーとして実行してからiptablesを操作したり、unshare -nを操作したりするなど、いくつかの提案があります。 。しかし、どちらの場合も、UNIXドメインソケットとループバックをメインシステムと共有するための呪文はわかりません。その質問への回答は、全体の共有を解除する方法を教えてくれるだけです。 ネットワーク。

テストしているプログラムは、Xサーバーとdbusに接続する必要があり、システム上の他のアプリからの接続をループバックでリッスンすることもできます。

理想的には、chroot、ユーザー、VMなどを作成しないようにします。これは、ネットワークケーブルを抜くのと同じくらい面倒になるためです。つまり、問題のポイントは、これをsudoのように単純にするにはどうすればよいかということです。 。

非ローカルアドレスを指定するネットワーク呼び出しが失敗することを除いて、プロセスが100%正常に実行されることを望んでいます。理想的には、同じuid、同じhomedir、同じpwd、…オフライン以外のすべてを同じに保ちます。

私はFedora18を使用しているので、移植性のないLinuxの答えは問題ありません(予想通りです)。

Cプログラムを作成することでこれを解決することもできます。それが関係している場合は、Cを作成することを含む回答で問題ありません。ローカルネットワークを維持しながら外部ネットワークアクセスを取り消すために、Cプログラムがどのようなsyscallを実行する必要があるのか​​わかりません。

「オフラインモード」をサポートしようとしている開発者は、おそらくこのユーティリティを高く評価するでしょう!

承認された回答:

従来の答えは、プログラムを別のユーザーとして実行し、iptables -m ownerを使用することです。 。このようにして、ネットワーク構成が共有されます。ただし、名前付けの出現により、より簡単な方法があります。

名前名を使用すると、ネットワークの共有を解除し、ネットワークアクセスを制限する必要がある場合は、仮想ネットワークリンクを作成します。

UNIXドメインソケットを共有するには、この2010パッチ以降、2.6.36以降(RHEL / CentOSを除く現在のすべてのディストリビューションに当てはまります)のカーネルが必要です。

独自のIP名前空間でプログラムを実行します。プログラムを開始する前に、仮想イーサネットインターフェイスを確立します。ドキュメントはあまりないようです。いくつかのブログで正しい呪文を見つけました:

  • AristaのLinux名前空間
  • waldnerによるvethインターフェースに関する注意事項
  • ScottLoweによるLinuxネットワークネームスペースの紹介
関連:Centos – DNSMasq –特定のMACアドレスに対する異なる応答?

以下のスニペットでは、ns_execを使用しています setnsのこのラッパーです 制限された名前空間で実行されているプロセスからネットワークリンクのホスト側を起動するために、マニュアルページにリストされています。実際にはこれは必要ありません。制限された名前空間の外部からリンクのホスト側を設定できます。内部から行うと、フロー制御が容易になります。そうでない場合は、リンクが確立された後、プログラムを開始する前に、リンクを設定するための同期が必要です。

unshare -n -- sh -c '
  # Create a virtual ethernet interface called "confined",
  # with the other end called "global" in the namespace of PID 1
  ip link add confined type veth peer name global netns 1

  # Bring up the confined end of the network link
  ip addr add 172.16.0.2/30 dev confined
  ip link set confined up

  # Bring up the global end of the network link
  ns_exec /proc/1/ns/net ifconfig global 172.16.0.1 netmask 255.255.255.252 up

  # Execute the test program
  exec sudo -E -u "$TARGET_USER" "$0" "[email protected]"
' /path/to/program --argument

これらすべてをrootとして実行する必要があります。カーネル3.8にユーザー名義を導入すると、ネットワークリンクのグローバルエンドを設定する場合を除いて、特別な権限なしでこれを実行できるようになる可能性があります。

2つの名前空間間でローカルホストを共有する方法がわかりません。仮想イーサネットインターフェイスは、ポイントツーポイントブリッジを作成します。 iptablesを使用できます loとの間でトラフィックをリダイレクトする転送ルール 必要に応じて。


Linux
  1. Linux での kill コマンドの例

  2. Linux の nohup コマンド オプション

  3. Linux での renice コマンドの例

  1. Linux での dsniff コマンドの例

  2. Linux での pkill コマンドの例

  3. 「&」を使用して Linux シェル コマンドを実行するのはなぜですか?

  1. Linux –プロセスのネットワークアクセスをブロックしますか?

  2. Linux:コマンド ラインでプログラムを閉じます (強制終了ではありません)。

  3. Linux でスーパーユーザーとして cd コマンドを実行する