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

SRo*_*mes 3 domain-name-system linux hosts

在 Linux 上,我希望特定进程应将主机“xyz.com”解析为 IP“10.1.2.3”。这很简单:只需在/etc/hosts.

但是,我只想为一个进程执行此操作;我希望所有其他进程将“xyz.com”解析到 DNS。

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

小智 5

假设您支持网络命名空间、iproute2 和 iptables,您可以完成此操作。首先你要创建一个命名空间

ip netns add NETNS
Run Code Online (Sandbox Code Playgroud)

并将您的自定义主机文件添加到目录中/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
Run Code Online (Sandbox Code Playgroud)

并启用 IPv4 数据包的转发

sysctl net.ipv4.ip_forward=1
Run Code Online (Sandbox Code Playgroud)

并配置 SNAT

iptables -t nat -A POSTROUTING -s 172.16.1.1 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

然后您可以在网络命名空间内运行任何命令

ip netns exec NETNS COMMAND
Run Code Online (Sandbox Code Playgroud)