S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

ホスト名とかドメイン名とかFQDNでアンダースコア

いろいろ問題があるらしい。
クッキーとアンダースコアを含むホスト名(IE5.01SP1以降ではRFCに準拠しないホスト名からクッキーはセキュリティの観点から保存しないようになっている)
RubyのURIがホスト名にアンダースコアがあるとparseできない件
RubyのAddressable::URIを使う
Oracle 11gでFQDNにアンダーバーが入っているとインスタンス作成でエラーが発生する?

ホスト名にアンダースコアはNG?

ホスト名の命名規則

RFC952で定義されRFC1123で修正されたホスト名の標準命名規則に従い、以下の文字で構成する。
・英字(a〜z,A〜Z)
・数字(0〜9)
・ハイフン(-)
・ピリオド(.)
 (*) ただしドメイン名の区切りでのみ使用可
その他、以下の制約がある。
・24文字以内
・大文字/小文字は区別されない
・最初の文字は英字または(RFC1123での修正に従い)数字のみ使用可
・最後の文字はハイフン(-)/ピリオド(.)以外の必要がある
・数字のみで構成されたホスト名は使用不可

RFC952(DOD INTERNET HOST TABLE SPECIFICATION)の記載が元ネタかな。

1. A "name" (Net, Host, Gateway, or Domain name) is a text string up
to 24 characters drawn from the alphabet (A-Z), digits (0-9), minus
sign (-), and period (.). Note that periods are only allowed when
they serve to delimit components of "domain style names". (See
RFC-921, "Domain Name System Implementation Schedule", for
background). No blank or space characters are permitted as part of a
name. No distinction is made between upper and lower case. The first
character must be an alpha character. The last character must not be
a minus sign or period.

ホスト名にアンダースコアはOK?

ところが、Wikipediaのホスト名にはこんなことが書いてある。

また、アンダースコアはWindowsで構築されたシステムで一般に使われるが、RFC 952によれば許容されない。

Windowsでは一般的?ということで調べると、「Microsoft NetBIOS コンピューター名前付け規則」では、アンダースコアなどいくつかの記号が使用可となっている。

コンピューター名は最大 15 文字の英数字をスペースなしですることができます。名前をネットワーク上で一意にする必要があり、次の特殊文字を含めることができます。
! @ # $ % ^ & ( ) - _ ' { } . ~

次の文字は使用できません。
\ * + = | : ; " ? < > ,

DNSの振る舞いは?

とりあえずBINDがどうなってるのか?
BIND 8 から BIND 9 への移行についてのノート#4. 制限のない文字集合によれば、BIND9(9.1.2?)では制限しない(amed.conf のcheck-names ignore;)の状態となっているらしい。

BIND 9 はドメイン名に使われる文字集合について制限しない。 RFC2181 の第11章にしたがい、完全に 8 ビットクリーンである。
DNS で広報されるホスト名は RFC952 の規則に従うことが強く推奨されるが、 BIND 9 ではそれを強制しない。

しかし、9.3.2ではデフォルトで制限している(amed.conf のcheck-names fail;)らしい。
BIND での "_" を含むホストの扱い

どうやらBIND9.3.1から、「check-names」がデフォルトでfailと設定されており、アンダースコア(_)をはじいてしまっていたようだ。

ならActiveDirectoryは?からドメイン名のアンダースコア?

Windows How-To - Windows 2000時代のDNS展開作法 > Chapter 9:既存DNSとの統合 〜BINDとの相互運用〜

Active Directoryは,Aレコードとして“gs._msdcs.active.dsl.local.”を登録する。しかしBINDは,この名前に問題があると判断する。なぜなら,このリソースレコードの名前に“_”(アンダースコア)が含まれているからである。ドメイン名について提唱しているRFC1033では,アンダースコアを使用してもよいことになっているが,ホスト名について提唱しているRFC952では,アンダースコアを使用してよいという記述はない。BINDはAレコードにアンダースコアが使用されていると,ホスト名が不正であると判断する。そのため,check-namesオプションでfailを設定している場合,ゾーン情報に問題があると,ゾーン全体が無効になってしまうので注意を要する。

あれ?ドメイン名はアンダースコアOKなん?と調べたら、RFC1033(DOMAIN OPERATIONS GUIDE)の記載は確かに使っていいことになってる。

NAMES

A domain name is a sequence of labels separated by dots.

Domain names in the zone files can be one of two types, either
absolute or relative. An absolute name is the fully qualified domain
name and is terminated with a period. A relative name does not
terminate with a period, and the current default domain is appended
to it. The default domain is usually the name of the domain that was
specified in the boot file that loads each zone.

The domain system allows a label to contain any 8-bit character.
Although the domain system has no restrictions, other protocols such
as SMTP do have name restrictions. Because of other protocol
restrictions, only the following characters are recommended for use
in a host name (besides the dot separator):

"A-Z", "a-z", "0-9", dash and underscore

結局

RFC上ではアンダースコアの扱いは、ホスト名はNG、ドメイン名はOK。
ってことでFQDNとしてもOKになるのか。
とすると、IEcookieにしても、RubyやらOracleの挙動もおかしいってことでええんかな?

補足:日本語ドメイン名の扱い

JPNIC > 国際化ドメイン名
(1) 入力された文字列の正規化(NAMEPREP)
(2) 7bit ASCII文字列への変換(Punycode)
(3) DNSへの問い合わせ
という流れで、「xn--」(国際化ドメイン名のプレフィックス)+ASCII文字列でドメイン名が表現されているとのこと。