web-dev-qa-db-ja.com

Linuxでのみ1つのプロセスにカスタム/ etc / hostsまたはリゾルバーを設定する

Linuxでは、特定のプロセスでホスト「xyz.com」をIP「10.1.2.3」に解決する必要があります。それは簡単です。/etc/hostsに行を追加するだけです。

ただし、これはoneプロセスに対してのみ実行します。他のすべてのプロセスで「xyz.com」をDNSに解決する必要があります。

プロセスごとにresolv.confまたは/ etc/hostsを設定する方法はありますか?たとえば、共有ライブラリや変数に対してこれを行うことができます-DNSに対してこれを行うにはどうすればよいですか?

1
SRobertJames

ネットワーク名前空間、iproute2、およびiptablesがサポートされていると仮定すると、これを実現できます。まず、名前空間を作成します

ip netns add NETNS

カスタムホストファイルをディレクトリ/etc/netns/NETNS/に追加します(このディレクトリを作成する必要があります)

次に、仮想イーサネットペアを作成して、新しく作成した名前空間をメインの名前空間に接続し、インターフェイスを構成します。

ip link add veth0 type veth peer name veth1
ip link set veth0 up
ip addr add 172.16.1.0/31 dev veth0
ip netns exec NETNS ip link set lo up
ip netns exec NETNS ip link set veth1 up
ip netns exec NETNS ip addr add 172.16.1.1/31 dev veth1
ip netns exec NETNS ip route add default via 172.16.1.0

iPv4パケットの転送を有効にします

sysctl net.ipv4.ip_forward=1

sNATを構成します

iptables -t nat -A POSTROUTING -s 172.16.1.1 -j MASQUERADE

その後、ネットワーク名前空間内で任意のコマンドを実行できます

ip netns exec NETNS COMMAND
2
Torin

最初:

ここで本当に達成しようとしていることを自問してください。これは、基本的なツールが処理する準備ができていない非常に非標準的な要求です。基本的なLinuxDNSリゾルバーはグローバル構成(/etc/resolv.confで既に知っている)を使用しており、NIC、ドメイン、プロセス、または接続ごとに実際に変更することはできません。

同じ最終結果を達成するために、より単純なものを設計できるかどうかを確認してください。未来-あなたは現在に感謝します-あなた

まだ読んでいる場合:

戻って、最初のセクションをもう一度読んでください。

まだここ?

????

私の存在のすべての繊維は、私が提案しようとしていることを嫌っています。

プロセスに固有のiptablesルールを使用して、それに応じてDNSトラフィックをリダイレクトできます。応答の変更に関心のあるドメインに応答する代替ローカルポートで別のDNSサーバーを実行できます。これは、dnsmasqでは比較的簡単なはずです。

1
Wesley

プロセスの名前空間をマウントし、ファイルをオーバーライドします。カーの答えは良いですが、ルートが必要な場合があります。バブルラップは、ルートなしでマウント名前空間を使用するためのツールです。

bwrap --dev-bind / / --ro-bind-data {FD} /etc/hosts sh -c "command args"

FDは、プロセスに提示するコンテンツを含むファイルを指すファイル記述子です。 (または、--bindの代わりに--ro-bindまたは--ro-bind-dataを使用します)

1
garywill

これを行う方法があります。PrivateTmpがyesに設定されている場合、systemdは/ tmpディレクトリに対してこれを行います。しかし、さまざまなファイルの独自のプロセスに実装する方法の詳細は見つかりませんでした。 ProvateTmpのsystemdソースを確認することをお勧めします。

0
RalfFriedl

基本的に「1つのコマンドで異なるバージョンのファイルを表示するにはどうすればよいですか」という質問

Linuxでの答えは、ファイルシステムの名前空間です。 unshareコマンドを使用して、独立したファイルシステム階層を持つ新しいセッションを起動できます。次に、mount -o bind/etc/hosts-special/etc/hostsを使用して、コマンドを実行できます。

これは非常に便利な場合があります(たとえば、インストーラーに/ dev/randomの代わりに/ dev/urandomを使用させて、システムに変更を加えずにエントロピーが不足しないようにします)。実際の動作を確認するには: https://distracted-it.blogspot.com/2017/03/installer-or-command-that-hangs-use.html

これは、Dockerがうまく機能することです。おそらく、問題を解決するためのより良い方法は、問題をコンテナに入れることです。

0
Cameron Kerr

あなたの場合、複雑なネットワーク設定をいじる代わりに、そのプロセスをLXCコンテナーに移動し、そのコンテナー内で/etc/hostsを好きなように編集できます。 LXD/LXCは軽量で、オーバーヘッドがあまり発生しないはずです。

0
nva