Назад | Перейти на главную страницу

Настройка пользовательского / etc / hosts или преобразователя только для одного процесса в Linux

В Linux я хочу, чтобы конкретный процесс разрешал хосту «xyz.com» IP «10.1.2.3». Это просто: просто добавьте строку в /etc/hosts.

Однако я хочу сделать это только для один обработать; Я хочу, чтобы все другие процессы разрешали "xyz.com" в DNS.

Есть ли способ установить файл resolv.conf или / etc / hosts для каждого процесса? Я могу сделать это, например, для общих библиотек или для envariables - как я могу сделать это для DNS?

Предполагая, что у вас есть поддержка сетевых пространств имен, iproute2 и iptables, вы можете это сделать. Во-первых, вы хотите создать пространство имен

ip netns add NETNS

и добавьте свой собственный файл хоста в каталог /etc/netns/NETNS/ (вам нужно будет создать этот каталог)

Затем вы захотите создать виртуальную пару Ethernet для подключения вновь созданного пространства имен с основным пространством имен и настроить интерфейсы.

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

Первый:

Спросите себя, чего вы действительно пытаетесь здесь достичь. Это очень нестандартный запрос, с которым базовые инструменты не могут справиться. Ваш базовый DNS-преобразователь Linux использует глобальную конфигурацию (о которой вы уже знаете в /etc/resolv.conf), и вы не можете изменить это для каждой сетевой карты, домена, процесса или соединения.

Посмотрите, сможете ли вы разработать что-то более простое для достижения того же конечного результата. Будущее - благодаришь настоящего

Если вы все еще читаете:

Вернитесь и прочтите первый раздел еще раз.

Все еще здесь?

😑

Каждая фибра моего существа ненавидит себя за то, что я собираюсь предложить.

Ты можешь использовать iptables правила, относящиеся к процессу, а затем соответствующим образом перенаправляют трафик DNS. Вы можете запустить отдельный DNS-сервер на альтернативном локальном порту, который отвечает домену, для которого вы хотите изменить ответы. Это должно быть относительно тривиально с dnsmasq.

Смонтировать пространство имен и переопределить файл (ы) для процесса. Ответ Керра хорош, но может потребоваться root. Bubblewrap - это инструмент для использования пространства имен монтирования без корня.

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

FD - это файловый дескриптор, который указывает на файл, содержащий контент, который вы хотите представить процессу. (Или используйте --bind или --ro-bind вместо того --ro-bind-data)

Есть способ сделать это, systemd сделает это для каталога / tmp, если PrivateTmp имеет значение yes. Но я не нашел подробностей о том, как реализовать это в ваших собственных процессах для разных файлов. Вы можете посмотреть в systemd исходный код ProvateTmp.

В вашем случае, вместо того, чтобы возиться со сложными настройками сети, я бы переместил этот процесс в контейнер LXC, и внутри этого контейнера я мог бы редактировать /etc/hosts как хочу. LXD / LXC легкий и не должен вызывать много накладных расходов.

Ваш вопрос, по сути, «как я могу заставить одну команду видеть другую версию файла»

Ответ в Linux - это пространство имен файловой системы. Вы можете использовать команду unshare для запуска нового сеанса с независимой иерархией файловой системы. Затем вы можете использовать mount -o bind / etc / hosts-special / etc / hosts, а затем запустить свою команду.

Иногда это бывает очень полезно (например, пусть установщик использует / dev / urandom вместо / dev / random, чтобы он не истощался от энтропии без внесения каких-либо изменений в систему). Чтобы увидеть это в действии: https://distracted-it.blogspot.com/2017/03/installer-or-command-that-hangs-use.html

Это то, что Docker делает для вас хорошо; возможно, лучший способ решить вашу проблему - поместить ее в контейнер.