/etc/resolv.conf
プログラムが特別なファイルを使用するようにだまされ、非標準のネームサーバーを使用するようにしたいと思います。
確実な解決策は、1つのファイルを除くファイルシステム全体を再作成し、chrootを使用することです。しかし、おそらくこれを行うより簡単な方法があります。
特定のプロセスに対してのみファイルの内容を変更するにはどうすればよいですか?多くの場合、動作しますが動作しないソリューションを提供します/etc/resolv.conf
。LD_PRELOAD
libc内のパーサーが開かれたときにそれを捕捉できず、/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