を使用してネットワークネームスペースを作成しますunshare --map-root-user --net --mount --keep-caps "do_stuff"
。
私は名前空間をインターネットに接続するために使用しますslirp4netns --configure --mtu=65520 $ns-id tap0
。これにより、名前空間内からアクセスできるため、ホストコンピュータ
でWebサーバーを実行して名前空間内で接続できます。localhost
10.0.2.2
Webサーバーの運用は可能ですか?名前空間で、ホストシステムから接続しますか?ポート転送のようなものですか?
答え1
これは、名前空間の制限を完全にバイパスしてTCPポートを転送する方法です。
socat
およびUNIXソケット
名前空間によって妨げられない通信タイプの1つは、標準(名前付き)UNIXソケットです。抽象的なUNIXソケットはネットワークネームスペースに依存します。socat
ホストからユーザー/ネットワークの名前空間への通信は、一対のコマンドを使用してUNIXソケットを介してTCPをプロキシすることによって簡単に実行できます。
OPの変数(正しい構文を持つように$ns_id
aに変更)に正しいPIDコンテンツがあるとします。_
以下は、2つの追加端末を使用して対話的に実行する例です。
term1: (ユーザー/ネットワークネームスペース部分)
socat
."do_stuff"
nsenter
ここでは、ホスト/初期名前空間で実行されます。
nsenter
最近作成した名前空間に参加してください。nsenter --preserve-credentials --user --mount --net -t $ns_id -- socat UNIX-LISTEN:/tmp/conduit,unlink-early,fork TCP4:127.0.0.1:80
term2(ホスト/初期名前空間部分):
socat TCP4-LISTEN:8080,reuseaddr,fork UNIX-CONNECT:/tmp/conduit
これで http://<host>:8080/ に接続して、ポート 80 でリッスンしている user/net 名前空間の Web サーバーに接続できるようになりました。トラフィックはUNIXソケットを通過します/tmp/conduit
。
ノート
ユーザー/ネットワーク名前空間がTCP / IPを使用可能にするコマンドを受け取る限り、この設定は
slirp4netns
まったく実行される必要はありません。ip link set dev lo up
どこかに。 Webサーバーを構成することを想像できます(おそらくnginx
その後、それ自体はTCPポート80の代わりにUNIXソケットから直接リッスンし、2番目のsocat
コマンドのみを保持します(どのコマンドの正しい処理も保証しませんが)。ソケット資格証明これが使用されている場合)。同様に、制限された方法でUDPトラフィックをプロキシできる必要がありますが、UDPの使用に応じてさまざまな注意があります。一部の用途では、単に
socat
コマンドのTCP部分をUDPに変更する必要があり、他の用途ではUNIXソケット部分をストリームソケットからデータグラムソケット(UNIX-LISTEN
->UNIX-RECVFROM
など)に変更する必要があります。タイムアウトオプションが必要な場合があります-T
。socat
検証されていません。
答え2
良いソケットボックス特別な設定なしで隔離されたネットワークネームスペース内でサービスを公開するように特別に設計されたツールですveth
。
たぶん私だけの道具かもしれないnetns_tcp_bridge同様の効果(効率が悪い)が得られますが、権限のないユーザーの名前空間で動作していることを確認していません。