![SRV 记录的有效区域名称或有效服务名称是什么?](https://linux22.com/image/776400/SRV%20%E8%AE%B0%E5%BD%95%E7%9A%84%E6%9C%89%E6%95%88%E5%8C%BA%E5%9F%9F%E5%90%8D%E7%A7%B0%E6%88%96%E6%9C%89%E6%95%88%E6%9C%8D%E5%8A%A1%E5%90%8D%E7%A7%B0%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我一直在关注一些关于如何使用 A 记录和 SRV 记录将域映射到特定 IP 和端口的指南/问题,例如1.1.1.1:1889
:
https://stackoverflow.com/questions/11433570/how-to-use-srv-or-any-other-record-do-redirect-a-domain
https://stackoverflow.com/questions/19015138/how-to-redirect-dns-to-different-ports
对于上述问题,他们建议使用 SRV 记录。我唯一不清楚的部分是如何确定service
在我的 SRV 记录中使用的正确名称?例如,假设我有这些记录
mysql.example.com. 86400 IN A 1.1.1.1
mongo.example.com. 86400 IN A 1.1.1.1
www.example.com. 86400 IN A 1.1.1.1
mosquitto.example.com. 86400 IN A 1.1.1.1
_mysql._tcp.example.com. 86400 IN SRV 10 20 3306 mysql.example.com.
_mongo._tcp.example.com. 86400 IN SRV 10 20 27017 mongo.example.com.
_http._tcp.example.com. 86400 IN SRV 10 20 3306 www.example.com.
_mqtt._tcp.example.com. 86400 IN SRV 10 20 3306 mosquitto.example.com.
_mysql, _mongo, _http and _mqtt
我的 SRV 记录中使用的服务名称是否正确? 我完全猜测这些服务名称,因为我无法找到列出所有可用的可接受服务名称的网站。
答案1
首先,网络浏览器根本不遵循SRV
记录,所以即使你可以设计它们,它们也是无用的。
现在给出了解任何记录中包含哪些内容的通用过程,SRV
作为示例。
IANA 是事物的守护者,因此请访问https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4您可以看到SRV
它在 RFC 2782 中定义
它的定义如下:
以下是 SRV RR 的格式,其 DNS 类型代码为 33:
_Service._Proto.Name TTL Class SRV Priority Weight Port Target
然后分别:
服务
The symbolic name of the desired service, as defined in Assigned Numbers [STD 2] or locally. An underscore (_) is prepended to the service identifier to avoid collisions with DNS labels that occur in nature.
和
原始
The symbolic name of the desired protocol, with an underscore (_) prepended to prevent collisions with DNS labels that occur in nature. _TCP and _UDP are at present the most useful values for this field, though any name defined by Assigned Numbers or locally may be used (as for Service). The Proto is case insensitive.
[STD 2] 参考的是 RFC 1700,但是 RFC 3232 将其淘汰,以便在线建立可能值的数据库……该数据库再次由 IANA 管理。
它现在在那里:https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml请注意,它基本上就是您/etc/services
在任何 Unix 框中的文件中找到的内容。
因此,回顾你的例子(SRV
虽然你的端口号在所描述的多个记录中是错误的):
mysql
确实是为端口定义的3306
,因此它作为服务名称有效,因此在SRV
记录中- 对于端口
27017
,服务名称是mongodb
,不是mongo
(但 Mongo 客户端是否遵守SRV
记录?) http
确实是为端口定义的,80
所以它是一个有效的服务名称(并且https
对于端口 443 也是如此)mqtt
定义为有效端口名称,用于端口1883
。但与上述问题相同,客户端是否使用SRV
记录?
还请注意,实际上存在各种SRV
不遵循上述规则的记录。如果这些记录可以发布,它们就会“起作用”,也就是说,即使它们不使用上述注册的服务名称,只要某些应用程序确实读取它们,就没有什么可以阻止在 DNS 级别解析它们。
例如,你可以在网上找到很多带有_sip._tls
或 的例子_sipfederationtls._tcp
,它们都是错误的:tls
不是有效的协议,也不sipfederantiontls
是有效的服务名称(而且实际上太长了,因为https://www.rfc-editor.org/rfc/rfc6335.html#section-5.1指定其长度最多为 15 个字符)。因此,某些工具/UI 可能会阻止在区域文件中创建这些记录,并且某些名称服务器可能会拒绝加载它们,但在大多数情况下它们都会起作用(如果应用程序确实使用它们)。