是否可以为不同的用户设置不同的DNS服务器?

是否可以为不同的用户设置不同的DNS服务器?

是否可以为不同的用户设置不同的DNS服务器?

假设用户test1使用 Google 的 DNS (8.8.8.88.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

...

相关内容