我一直在關註一些關於如何使用 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
記錄中- 對於 port
27017
,服務名稱是mongodb
,而不是mongo
(但是 Mongo 用戶端是否尊重SRV
記錄?) http
確實是為連接埠定義的,80
因此它是有效的服務名稱(https
對於連接埠 443)mqtt
被定義為有效的連接埠名稱,對於 port1883
。但與上面同樣的問題,客戶是否使用SRV
記錄?
也要注意的是,在野外存在著SRV
不符合上述內容的各種記錄。如果它們可以發布,那麼它們就可以“工作”,即使它們不使用上述註冊服務名稱,也沒有什麼可以阻止它們在 DNS 層級的解析,當然只要某些應用程式確實讀取它們即可。
例如,您可以在網路上找到很多_sip._tls
或 的範例_sipfederationtls._tcp
,它們都是錯誤的:tls
不是有效的協議,並且sipfederantiontls
是有效的服務名稱(實際上太長了,因為https://www.rfc-editor.org/rfc/rfc6335.html#section-5.1指定其長度最多為 15 個字元)。因此,某些工具/UI 可能會阻止在區域檔案中建立這些記錄,並且某些名稱伺服器可能會拒絕載入它們,但在大多數情況下它們會起作用(如果應用程式確實使用它們)。