通配符 DNS 记录是不好的做法吗?

pro*_*cer 27 domain-name-system wildcard subdomain

我让我的托管商添加三个子域,所有子域都指向 A 记录的 IP。似乎他只是添加了一个通配符 DNS 记录,因为任何随机子域现在都解析为我的 IP。从技术角度来看,这对我来说没问题,因为没有子域指向其他任何地方。再说一次,我不喜欢他不做我要求的事情。所以我想知道是否还有其他理由告诉他改变这一点。有吗?

我发现的唯一负面影响是有人可以使用http://i.dont.like.your.website.mywebsite.tld.

Mic*_*ton 23

如果您曾经将一台计算机放在该域中,您会遇到奇怪的 DNS 故障,当您尝试访问 Internet 上的某个随机站点时,您反而会到达您的站点。

考虑:您拥有域example.com。您设置了工作站并为其命名。......让我们说,yukon.example.com。现在你会注意到/etc/resolv.conf它有一行:

search example.com
Run Code Online (Sandbox Code Playgroud)

这很方便,因为这意味着您可以进行主机名查找,例如www,它将www.example.com自动为您搜索。但它有一个阴暗面:如果你访问,比如说,谷歌,那么它会搜索www.google.com.example.com,如果你有通配符 DNS,那么它会解析到你的站点,而不是到达谷歌,你会在你自己的站点上结束。

这同样适用于您运行网站的服务器!如果它不得不调用外部服务,那么主机名查找可能会以同样的方式失败。因此api.twitter.com,例如突然变为api.twitter.com.example.com,直接路由回您的站点,当然会失败。

这就是我从不使用通配符 DNS 的原因。

  • [我实际上写了关于 Windows 环境的博客](https://web.archive.org/web/20190313031110/www.mdmarra.com/2012/11/why-you-shouldnt-use-local-in-你的.html)。更不用说至少有三个团体竞标了 .local TLD,因为 ICANN 将它们出售给任何拥有足够大钱包的人。`.local` 不是保留的,不应使用。这样做违反了 RFC,完全没有必要。最佳实践是为内部资源(如“internal.company.com”)使用委派的第三级子域。仅仅因为你看到很多东西并不能使它正确。 (6认同)
  • @ChrisLively 责怪现代 Linux 系统“有用”并添加它。顺便说一句,使用“.local”确实是不好的做法,而不仅仅是在 Windows 环境中。 (3认同)
  • @Zypher 它实际上从未被微软推荐过(这在我的博客文章中也被揭穿了。去阅读它,这是一个很好的),但是 SBS 默认使用`.local` 发货的事实确实让 MS 看起来像一团糟看待。SBS 附带该配置,因为它适用于技术知识较低的非技术客户。这是阻力最小的路径,但实际的 AD 文档在 W2K 时代一直推荐三级子域。 (3认同)
  • 哦,在几年内[将很难获得 .local 的证书](http://blog.schertz.name/2013/01/lync-server-certificate-cliff/),这意味着 UCC/SAN Lync/Exchange 的证书必须由内部 CA 签名,如果您有外部非域加入用户,这会很痛苦。 (3认同)
  • 能否请您指出 RFC 2606 中保留“.local”的部分?我已经和在这个论点中使用它的人一起阅读了这个 RFC 至少十几次,我可以肯定地告诉你它不存在。 (2认同)

Dam*_*nal 16

通配符 DNS 记录是不好的做法吗?

就个人而言,我不喜欢它。特别是当该域中有机器时。错别字不加检查,错误不那么明显……但它从根本上没有任何问题。

我发现的唯一缺点是有人可以使用http://i.dont.like.your.website.mywebsite.tld链接到我的网站。

让您的 http 服务器将所有此类请求重定向到正确的规范地址,或者根本不响应。对于 nginx,这将类似于

server {
    listen 80;
    server_name *.mywebsite.tld;
    return 301 $scheme://mywebsite.tld$request_uri;
    }
Run Code Online (Sandbox Code Playgroud)

然后是常规

server {
    listen  80;
    server_name mywebsite.tld;
    [...]
    }
Run Code Online (Sandbox Code Playgroud)


Ped*_*ira 8

这都是见仁见智的问题。对我来说,这不是坏习惯。

我正在创建一个多租户应用程序,它为每个租户使用一个数据库。然后它根据子域选择要使用的数据库。

例如milkman.example.com将使用tenant_milkman数据库。

像这样的我已经分居表为每个租户一样,tenant_milkman.userstenant_fisherman.userstenant_bobs_garage.users,这在我看来是一个巨大的很多更容易维护,而不必在同一表中所有公司的所有用户对于此特定的应用程序。

[edit - Michael Hampton has a good point]

话虽如此,如果您没有像我一样接受任何(可变)子域的特定理由,那么您不应该接受它们。

  • 您有一个很好的技术理由来使用通配符 DNS。大多数人不会。 (5认同)
  • @sleske 不是,因为用户必须针对该子域(对于该数据库)进行身份验证。如果他切换,他将需要再次进行身份验证,因为它被视为一个完全不同的“站点”。 (2认同)