Systemdプライベートネットワークの名前空間にアクセスできるようにする方法

Systemdプライベートネットワークの名前空間にアクセスできるようにする方法

0.0.0.0そのため、ポート(TCP)をバインドして受信するアプリケーションがあります。通信は暗号化されず承認されていないので、あまり深く入らずにこの問題を解決したいと思います。

127.0.0.1次のことができるようにバインドしたいと思います。SSH配信認証と暗号化に関するヒントを入手してください。

0.0.0.0しかし、プロセスが外部からバインドされてアクセス可能でなければならないという問題が残っています。

私のアイデアの1つはSystemdを使用することです。PrivateNetworkネットワークを分離します(他の方法でもアプリケーションをサンドボックスに適用したい)。しかし、SSHが動作し続ける方法がわかりません。たぶん実行sshdして参加するネットワークネームスペース?それでは、sshd「外部」から接続にどのようにアクセスできますか?

得るよりも簡単な方法はありますか?LD_予圧参加するかソケットいたずら?好ましくはsystemd、いかなる方法でもユニット/サービスを含む。このsocatの答え

答え1

したがって、最初に0.0.0.0にバインドされて構成できないWebアプリケーションは、私の本では致命的なエラーと見なされ、利用可能な場合は開発者が修正する必要がある問題になります。 (FOSSメンテナンス/開発者として、これは問題になったことはありません。最悪の場合は1行で直接解決できます。)

考えられる1つのオプションは、呼び出しをハイジャックする非常に小さなライブラリをプリロードし、TCPソケットを0.0.0.0にバインドすることを確認してから、実際の呼び出しを実際の関数にバインドすることによってバインドされるLD_PRELOADトリックです。希望のアドレス。libcbindbind

より簡単な方法は、パブリックインターフェイスでポート接続を許可しないファイアウォールルールを削除してループバック接続のみを機能させることです。

この問題を解決し、将来の移行/メンテナンス作業を減らすための高度にカプセル化された方法は、アプリケーションをLinuxコンテナ(たとえばで実行podman)に入れてから、ポートを内部的に公開することです。 (これらのコンテナと自動起動インフラストラクチャのシステム単位ファイルの作成をうまく活用でき、podman generate特別な権限なしでこれらのタスクを実行することもできます。これは正直に書かれていないネットワークに非常に役立ちます。 )。

すべてを網羅するこのシステムには、何も暗号化されていないソリューションがある可能性があります。ラインバッカーマニュアルを使用すると、デフォルトのネームスペースで実行されているすべてのプログラムからコンピュータの物理インターフェイスを取得し、別のネームスペースにプッシュし、VPNトンネル接続(ワイヤガードインターフェイス)のみがそのプログラムと対話することを許可できます。 SSHソリューションではありませんが、wireguardがシナリオに適している場合は、これがオプションになる可能性があります。

私が持っているアイデアの1つは、SystemdのPrivateNetworkを使用してネットワークを分離することでしたが(別の方法でアプリケーションをサンドボックスに適用したいのですが)、SSHが機能し続ける方法がわかりません。

それはい本当に素晴らしいアプローチです!悲しいことにPrivateNetwork=、隔離は非常に成功したと思いますみんなネットワークの場合は、一時ネットワークNS名を抽出して別のユニットに渡すプログラムを作成する必要があります。その後、ブリッジ(通常は:macvlanip link設定)を設定し、その名前空間に転送します。少しオーバーヘッド。

あなたが持っている設定を持つことができます

  1. ipネームスペースを作成し、デバイスを内部的に設定しlo、新しいネームスペースを自分にバインドするワンタイム単位です。次に、
  2. NetworkNamespacePath=あなたの疑わしいサービスがこの名前空間で使用されます。
  3. 別の使い捨てユニットの対応する名前空間にブリッジを追加します。

一つある私が見つけた記事それはそれをほとんど説明します。


iptables結論:シングル/ルールを使用するのが最も簡単だと思いますnftablesが、ブリッジネームスペースを設定する必要がある場合は可能です。しかし、人々が一般的にコンテナを投げるユースケースに非常に近いです。これはおそらく最も柔軟なソリューションです。

関連情報