実際のネットワークを停止せずにオフラインモードでテストしたいプログラムがあります。このプログラムは、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ネットワークネームスペースの紹介
以下のスニペットでは、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
との間でトラフィックをリダイレクトする転送ルール 必要に応じて。