ネットワークネームスペースとslirp4netns - ホストからネームスペースネットワークにアクセスする

ネットワークネームスペースとslirp4netns - ホストからネームスペースネットワークにアクセスする

を使用してネットワークネームスペースを作成しますunshare --map-root-user --net --mount --keep-caps "do_stuff"
私は名前空間をインターネットに接続するために使用しますslirp4netns --configure --mtu=65520 $ns-id tap0。これにより、名前空間内からアクセスできるため、ホストコンピュータ
でWebサーバーを実行して名前空間内で接続できます。localhost10.0.2.2

Webサーバーの運用は可能ですか?名前空間で、ホストシステムから接続しますか?ポート転送のようなものですか?

ベストアンサー1

これは、名前空間の制限を完全にバイパスしてTCPポートを転送する方法です。

socatおよびUNIXソケット

名前空間によって妨げられない通信タイプの1つは、標準(名前付き)UNIXソケットです。抽象的なUNIXソケットはネットワークネームスペースに依存します。socatホストからユーザー/ネットワークの名前空間への通信は、一対のコマンドを使用してUNIXソケットを介してTCPをプロキシすることによって簡単に実行できます。

OPの変数(正しい構文を持つように$ns_idaに変更)に正しい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など)に変更する必要があります。タイムアウトオプションが必要な場合があります-Tsocat検証されていません。

おすすめ記事