在 Linux 中仅为一个进程设置自定义 /etc/hosts 或解析器

在 Linux 中仅为一个进程设置自定义 /etc/hosts 或解析器

在 Linux 上,我希望某个特定进程将主机“xyz.com”解析为 IP“10.1.2.3”。这很简单:只需在 中添加一行即可/etc/hosts

然而,我只想这样做进程;我希望所有其他进程都将“xyz.com”解析为 DNS。

有没有办法设置每个进程的 resolv.conf 或 /etc/hosts?我可以对共享库或变量执行此操作 - 如何对 DNS 执行此操作?

答案1

假设您支持网络命名空间、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

为进程挂载命名空间并覆盖文件。Kerr 的答案很好,但可能需要 root 权限。Bubblewrap 是一种无需 root 权限即可使用挂载命名空间的工具。

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

FD 是指向包含要呈现给进程的内容的文件的文件描述符。(或者,使用--bind--ro-bind代替--ro-bind-data

答案3

第一的:

问问自己,您在这里真正想要完成什么。这是一个非常不标准的请求,基本工具无法处理。您的基本 Linux DNS 解析器使用全局配置(您已经在 中了解了/etc/resolv.conf),并且您无法真正更改每个 NIC、域、进程或连接的配置。

看看你是否能设计一些更简单的东西来实现相同的最终结果。未来的你会感谢现在的你

如果你还在读:

回去再读一遍第一部分。

还在?

答案4

对于您来说,我不需要处理复杂的网络设置,而是将该进程移到 LXC 容器中,然后在该容器中我可以随意编辑/etc/hosts。LXD/LXC 是轻量级的,不会造成太多开销。

相关内容