V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
baobao1270
V2EX  ›  程序员

永远不要使用二级域名作为 Linux Hostname

  •  
  •   baobao1270 ·
    baobao1270 · 2023-06-15 10:17:28 +08:00 · 7557 次点击
    这是一个创建于 520 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近发现了使用二级域名作为 Linux Hostname 会有坑,甚至还会造成潜在的信息安全问题。因此写了一篇博客,总结如下,全文可以在 https://josephcz.xyz/technology/linux/never-use-2ld-as-hostname/ 阅读

    如果我们使用二级域名作为 Hostname

    倘若我们将服务器的 Hostname 切换为二级域名,例如 example[.]com 时,会发生什么呢?在这里我们假设一个没有被任何人注册的域名,例如 some-not-registered-domain[.]com;并假设 com[.]com 这一域名被恶意人士注册。

    接下来,我们使用 ping 命令,加上需要解析的域名,看看实际访问的域名时哪一个:

    ping 命令结果对比图

    是的,在使用二级域名作为 Hostname 的情况下,当 ping 一个尚未注册的域名 some-not-registered-domain[.]com 时,由于 Hostname 和 Search Domain 的配置,会自动 fallback 到 some-not-registered-domain[.]com[.]com 上!遗憾的是,不管是否使用 Search Domain ,这个问题都存在——而将 Hostanme 设置为 FQDN 让这个问题更加隐蔽了。

    这个问题不仅影响了 ping 、curl ,也影响了几乎所有使用 glibc 的程序:OpenSSL 、MySQL 、Nginx 、Apache……等等。如果它们的某个功能需要解析域名,则都会有同样的问题。

    未被注册的域名值得警惕,但是这一问题如果发生在你自己的域名上呢?

    如果我们使用已经被注册的域名作为 Hostname

    回到我遇到的问题上来。我刚刚设置了 api-v2023[.]josephcz[.]xyz 这一域名的解析。而 DNS 解析的生效需要时间,在递归 DNS 未获取到生效的记录的情况下,会返回一个空记录。而空记录和 NXDOMAIN 错误一样,会触发 Search Domain 的 fallback 机制。因此,服务器上对 api-v2023[.]josephcz[.]xyz 全部被发送到了 api-v2023[.]josephcz[.]xyz[.]xyz

    使用 tcpdump -i ens3 -nt -s 500 port domain 命令可以清楚地看到这一过程:

    IP 10.0.0.12.57943 > 1.1.1.1.53: 27244+ A? api-v2023[.]josephcz[.]xyz. (35)
    IP 10.0.0.12.57943 > 1.1.1.1.53: 19043+ AAAA? api-v2023[.]josephcz[.]xyz. (35)
    IP 1.1.1.1.53 > 10.0.0.12.57943: 19043 0/1/0 (106)
    IP 1.1.1.1.53 > 10.0.0.12.57943: 27244 0/1/0 (106)
    IP 10.0.0.12.46092 > 1.1.1.1.53: 51629+ A? api-v2023[.]josephcz[.]xyz[.]xyz. (39)
    IP 10.0.0.12.46092 > 1.1.1.1.53: 61104+ AAAA? api-v2023[.]josephcz[.]xyz[.]xyz. (39)
    IP 1.1.1.1.53 > 10.0.0.12.46092: 51629 3/0/0 CNAME xyz[.]xyz., A 52.9.36.254, A 54.241.183.58 (85)
    

    好在 XYZ 域名的注册局保留了 XYZ[.]XYZ。但是如果换成解析其他域名,例如 some-api-host[.]aws 或者 pki[.]goog,而相关域名的注册局又忘记保留了 awsgoog 之类的域名呢?

    结论

    在设置 Linux 的 Hostname 时,永远不要使用一个二级域名——无论是将 Hostname 设置为 FQDN 还是配置 Search Domain 。永远使用一个三级或以上的、受你自己控制的域名作为 Hostname 。

    此外,启用强制性的 TLS 并正确部署证书信任也可以在一定程度上缓解这一问题——由于对方无法获得正确的 TLS 证书,即使解析被 fallback 到恶意攻击者的域名上,也难以窃取你的机密信息。

    25 条回复    2023-06-16 07:35:52 +08:00
    EvineDeng
        1
    EvineDeng  
       2023-06-15 10:27:49 +08:00
    也曾遇到过这个问题,但从未深究,谢谢 op 。
    momocraft
        2
    momocraft  
       2023-06-15 10:30:11 +08:00
    用 HOSTNAME.local 是不是也没有这个问题
    xxx027
        3
    xxx027  
       2023-06-15 10:31:42 +08:00
    localhost.localdomain
    mozhizhu
        4
    mozhizhu  
       2023-06-15 10:41:32 +08:00
    我喜欢在二级设为区域名称;例如:hostname.(home|abcnet).aaa.com ;
    没想到还有这个坑;
    est
        5
    est  
       2023-06-15 10:43:29 +08:00
    所以 ICANN 就很鸡儿烦。搞那么一大堆 tld ,现在大家都猜不出哪些后缀是安全的了。
    summericy
        6
    summericy  
       2023-06-15 10:54:19 +08:00
    谢谢分享,之前还没注意过这个问题
    baobao1270
        7
    baobao1270  
    OP
       2023-06-15 10:55:51 +08:00   ❤️ 1
    @momocraft .local 可以避免这个问题

    @mozhizhu 你这个是四级域名了,没问题的,只有二级域名会有问题
    SingeeKing
        8
    SingeeKing  
       2023-06-15 11:00:16 +08:00
    没被 ndots 坑过的人生是不完整的 [手动狗头]
    feedcode
        9
    feedcode  
       2023-06-15 11:05:21 +08:00   ❤️ 1
    关于这个
    > 服务器上对 api-v2023[.]josephcz[.]xyz 全部被发送到了 api-v2023[.]josephcz[.]xyz[.]xyz
    大概率是服务器配置的问题, 估计有 options ndots:n (n>2) 或者你的发行版的不是 glibc

    glibc 默认 ndots 是 1,
    https://linux.die.net/man/5/resolv.conf
    Resolver queries having fewer than ndots dots (default is 1) in them will be attempted using each component of the search path in turn until a match is found.
    hyq
        10
    hyq  
       2023-06-15 12:41:47 +08:00
    ping some-not-registered.com. <-- 最后有个点
    是不是这种方式不会被影响到?
    newaccount
        11
    newaccount  
       2023-06-15 13:18:20 +08:00
    感谢分享,跟着博客去看了下 RFC 1178 ,确实挺有意思的
    hljjhb
        12
    hljjhb  
       2023-06-15 13:25:58 +08:00
    @SingeeKing hhh 人生经验
    ho121
        13
    ho121  
       2023-06-15 13:39:14 +08:00
    # man resolv.conf

    search Search list for host-name lookup.
    By default, the search list contains one entry, the local domain name. It is de‐
    termined from the local hostname returned by gethostname(2); the local domain name
    is taken to be everything after the first '.'. Finally, if the hostname does not
    contain a '.', the root domain is assumed as the local domain name.
    Keystroke
        14
    Keystroke  
       2023-06-15 14:08:52 +08:00
    ping 命令结果对比图的第 5 行,为什么 Search Domain 是 com ,Ping 域名 web 的时候实际 Ping 域名是 web.example.com
    baobao1270
        15
    baobao1270  
    OP
       2023-06-15 14:38:26 +08:00
    @feedcode
    @SingeeKing

    是的,我的 ndots 确实是 1 。但是无论 ndots 是多少,如果 absolute domain 的解析结果是 NXDOMAIN ,都会进行「添加 search name 的查询」

    所以这个问题上 ndots 不是主要问题

    ---


    @Keystroke 似乎上我从 Typora 里复制 Markdown 的时候复制错了。稍后会更新图片,但是 CDN 缓存刷新需要时间。

    ---


    @hyq 这种不会影响。但是在配置各种应用( nginx 、mysql )的时候很少会记得多加一个点吧。
    ecloud
        16
    ecloud  
       2023-06-15 14:46:16 +08:00
    什么人会用二级域名当主机名?难以理解这种需求……
    feedcode
        17
    feedcode  
       2023-06-15 15:04:33 +08:00
    @baobao1270 you are right
    hyq
        18
    hyq  
       2023-06-15 16:24:36 +08:00
    @baobao1270 是的,很少会记得加这个点。以前不太理解这个.到底有什么意义,看到你这个问题,就明白了这个点代表的含义
    alect
        19
    alect  
       2023-06-15 16:57:47 +08:00
    我有几十台主机,每个主机就是用的单独的二级域名区分,并没有觉得有问题。
    tril
        20
    tril  
       2023-06-15 19:33:17 +08:00
    这让我想到另一个原理类似的漏洞:
    某些硬路由的默认域使用了[.]host ,无法修改。而 cn[.]host 域名被黑产抢注,所有子域名全部跳转到恶意网站。结果就是该路由下访问任意一个不存在的[.]cn 域名(一种常见情况是拼写错误,例如 tsighua[.]edu[.]cn )会被尝试解析成[.]cn[.]host ,进而被跳转到恶意网站。
    baobao1270
        21
    baobao1270  
    OP
       2023-06-15 19:39:09 +08:00
    @alect 我感觉你可能误解了二级域名的含义
    root domain: .
    top-level domain: .com
    second-level domain: example.com
    third-level domain: www.example.com

    如果你用的是 third-level domain ,那么不会有问题
    如果你用的是 second-level domain ,这个坑我提醒过你了,并不是你不觉得有问题就代表问题不存在
    ncepuzs
        22
    ncepuzs  
       2023-06-15 20:28:01 +08:00
    offtopic:为什么会用二级域名做服务器的 hostname ?
    alect
        23
    alect  
       2023-06-15 20:47:49 +08:00
    @baobao1270 哦,我误解了,我其实用的是 sub.abc.com 这种
    Andim
        24
    Andim  
       2023-06-16 04:44:58 +08:00
    @alect 你这是标准的 FQDN ,不能算二级域名,
    baobao1270
        25
    baobao1270  
    OP
       2023-06-16 07:35:52 +08:00
    @Andim 又在这个帖子下看到概念错误的了
    FQDN 是相对的
    . 是 FQDN
    com 是 FQDN
    exemple.com 也是 FQDN
    www.example.com 还是 FQDN

    但是相对于 exemple.com ,www 不是 FQDN ,www.example.com 是 FQDN
    也就是说「 FQDN 」是类似「绝对路径」这样一个概念,就好比 Linux 上的根路径 / 也是一个绝对路径。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2768 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:43 · PVG 20:43 · LAX 04:43 · JFK 07:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.