特別なresolv.confを使用するようにプログラムに指示する

特別なresolv.confを使用するようにプログラムに指示する

/etc/resolv.confプログラムが特別なファイルを使用するようにだまされ、非標準のネームサーバーを使用するようにしたいと思います。

確実な解決策は、1つのファイルを除くファイルシステム全体を再作成し、chrootを使用することです。しかし、おそらくこれを行うより簡単な方法があります。

特定のプロセスに対してのみファイルの内容を変更するにはどうすればよいですか?多くの場合、動作しますが動作しないソリューションを提供します/etc/resolv.confLD_PRELOADlibc内のパーサーが開かれたときにそれを捕捉できず、/etc/resolv.confバインドマウントはシンボリックリンクを上書きできません(リンク先がないか、後でリンクが変更された場合)。

編集:関連する質問は壊れたシンボリックリンクにファイルをインストールする方法は?一般的な解決策が見つかりません

答え1

1つは利用可能ですoverlayfs重複を避けるため。一時的な場合は、を使用してすべての操作を実行できます/tmp。マウントネームスペースと組み合わせると、個々のアプリケーションに影響を与える可能性があります。 rootでの準備(通常のユーザーがrootにマップされているuser + mount名前空間で動作しますが、権限ヘルプおよび/または最新のpid変換カーネルがない場合、ユーザーマッピングは役に立ちません)。

  • 新しいマウントネームスペースの作成
  • overlayfs作る
  • このオーバーレイをバインドしてもう一度マウントしてください。/etc
  • コンテンツの変更(たとえば、/etc/resolv.confシンボリックリンクの削除とカスタムコンテンツを含む一般的なファイルの作成/etc/resolv.conf
  • このマウントされた名前空間でアプリケーションを実行し続けます。

例:

mkdir /tmp/upper /tmp/work /tmp/fake_etc
unshare -m

次のコマンドは、新しいマウントネームスペースで実行されます。

mount -t overlay -olowerdir=/etc,upperdir=/tmp/upper,workdir=/tmp/work overlay_etc /tmp/fake_etc

その後、/etcコンテンツを偽造するために使用されたものが上書きされます。

mount --bind /tmp/fake_etc /etc

変更します(マウントネームスペースのオーバーレイにのみ影響します)。

rm /etc/resolv.conf
echo nameserver 192.0.2.2 > /etc/resolv.conf

AFAIKをインストールできません参照を維持するための名前空間です。必要に応じて、マウント名前空間でPID参照を使用できます。

# echo $$
325304

同じシェルまたは別の(ルート)シェルで次のコマンドを実行します。

nsenter -t 325304 --mount

次に、前の例に従ってください(名前サーバー192.0.2.2に接続できません)。

# su - -c 'ping stackexchange.com' someuser 
ping: stackexchange.com: Name or service not known

他の場所ではいつものように仕事が行われますping

答え2

あなたはそれを使用することができますbubblewrapマウントネームスペースを作成します。 Flatpakが要求するので、ほとんどのディストリビューションに含まれています。

bwrap \
    --bind / / \
    --bind /home/user/resolv.conf /etc/resolv.conf \
    binary parameter1 parameter2d

関連情報