![在 Linux 中仅为一个进程设置自定义 /etc/hosts 或解析器](https://linux22.com/image/725560/%E5%9C%A8%20Linux%20%E4%B8%AD%E4%BB%85%E4%B8%BA%E4%B8%80%E4%B8%AA%E8%BF%9B%E7%A8%8B%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%AE%9A%E4%B9%89%20%2Fetc%2Fhosts%20%E6%88%96%E8%A7%A3%E6%9E%90%E5%99%A8.png)
在 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 是轻量级的,不会造成太多开销。