是否可以为不同的用户设置不同的DNS服务器?
假设用户test1
使用 Google 的 DNS (8.8.8.8
和8.8.8.8
),test2
会使用0.0.0.0
,并且两者test3
都会test4
使用127.0.0.1
。
这可能吗?
答案1
“是吗……”嗯,是的。
“如何”是事情变得复杂的地方。
基本上,我能想到两个真正的选择。假设您正在使用 Gnu libc,并且您有 nsswitch 支持(我隐约记得某些发行版可能已禁用该功能?),一种选择可能是将“正常”NSS DNS 模块(即/lib64/libnss_dns*
)替换为可能会检查的自定义版本~/.config/resolv.conf
。
笔记,我所说的“替换”是指添加另一个具有唯一名称的模块,然后您可以从/etc/nsswitch.conf
.人们可能会“简单地”分叉用于构建“正常”版本的代码,并添加一些内容来从中构建每用户版本。
resolv.conf
另一种选择可能是使用内核命名空间从每个用户进程的角度“安装”替换。 (请参阅评论中 IBM 的非常彻底的处理。)
不过,我不知道有任何现有工具可以促进这两者。
我想到的第三个选项是为每个用户构建一个chroot
监狱,其中大多数文件是硬链接或绑定安装的,以及一些选定的文件(例如resolv.conf
就地更改)。
答案2
DNS 服务器设置是为机器,不适合用户。
系统调用系列gethostbyname*()
尝试查找给定的主机名并返回 IP 地址。第一个位置通常是/etc/hosts
文件。然后他们通过 中设置的 DNS 服务器进行查找/etc/resolv.conf
。
答案3
虽然可以配置帐户,使每个帐户在自己的网络命名空间中运行,然后添加 iptables 规则以将 DNS 查询重定向到其他地方 - 但这无法解决已缓存在 nscd/sssd/resolved 中的数据问题。
虽然 @X Tian 已经建议更改主机文件,但这再次在主机级别进行更改 - 而不是用户级别。但大多数版本的 Linux 支持按会话覆盖地点通过 HOSTALIASES 环境变量获取主机文件。我已经很长时间没有理由使用它了,并且需要进行一些测试来确定它是否仍然可以在 systemd 的世界中工作。
答案4
不,DNS 并不是为此而设计的。但是,如果您正在进行测试,则可以使用/etc/hosts
多个测试域名并将其硬编码到特定的 IP 地址,然后为每个用户提供您希望他们使用的测试域名。
例如。/etc/hosts
IP address1 hosta.test2
IP address2 hostb.test2
IP address3 hosta.test3
IP address4 hostb.test3
...