tl;dr
foobarhogehoge.invalid
は絶対にリクエストが飛ばないのでおすすめ
あらすじ
書いていたコードは、とあるミドルウェア向けに内部利用するURLを環境変数で受け取るようになっていた。普段は実際の内部のURLが書かれているのだが、テスト時には以下のようにダミーを設定していた:
FOOBAR_EXTERNAL_URL="https://example.com/foobardummy"
テストではこのURLを利用しないのだが、内部で環境変数のバリデーションを行っている都合上、とりあえず適当なURLを指定しなければ起動してくれないから、こうなっていた。重ねて言うが、実際はこの環境変数を利用していないのでこれでいい。
しかしこれだと、うっかり内部の様子がおかしくなったりエンジニアが狂ってしまった場合に、example.com
に本当にアクセスしてしまう。なおかつ、セキュリティ上重要なミドルウェアやサービスを想定したURLだった場合には、あまりよろしくないデータが実在のホストに飛んでしまう。 これらが同時に発生する確率は低いものの、いずれにせよ意図しない形でのデータ送信の余地は減らしたい。
RFC 2606 / RFC 6761
RFC 2606: Reserved Top Level DNS Names では、いくつかのTLDを予約している。特殊な用途では、これらを使うのが賢い。
.test
.example
.invalid
.localhost
例えば、公共掲示物などでドメインの例として実在のドメインを書いてしまったら実在の持ち主に迷惑がかかるから、.example.com
などを使うべきである(ちなみに似た例として、RFC 5737では例示用のIPアドレスが定義されている)。
RFC 6761: Special-Use Domain Names では、これらの挙動がより詳細に定義され、従前のRFCを更新している。この中でも、.invalid
に注目する(拙訳は強調した)。
The domain "invalid." and any names falling within ".invalid." are special in the ways listed below. In the text below, the term "invalid" is used in quotes to signify such names, as opposed to names that may be invalid for other reasons (e.g., being too long).
ドメイン名「invalid.」とそのサブドメイン(「.invalid.」以下のすべての名前)には、以下に示す特別な取り扱いが適用される。以下の説明において、「invalid」という用語は引用符付きで使用されており、これは他の理由(例えば長すぎるなど)で無効となる可能性のある名前と区別するためのものである。
- Users are free to use "invalid" names as they would any other domain names. Users MAY assume that queries for "invalid" names will always return NXDOMAIN responses.
1. ユーザーは「invalid」という名前を、他のドメイン名と同様に自由に使用できる。「invalid」名に対するクエリは常にNXDOMAIN応答を返すものと想定してよい。
- Application software MAY recognize "invalid" names as special or MAY pass them to name resolution APIs as they would for other domain names.
2. アプリケーションソフトウェアは「invalid」名を特別なものとして認識してもよいし、他のドメイン名と同様に名前解決APIに渡してもよい。
- Name resolution APIs and libraries SHOULD recognize "invalid" names as special and SHOULD always return immediate negative responses. Name resolution APIs SHOULD NOT send queries for "invalid" names to their configured caching DNS server(s).
3. 名前解決APIおよびライブラリは「invalid」名を特別なものとして認識し、常に即時に否定応答を返すべきである。名前解決APIは「invalid」名に対するクエリを、設定されたキャッシュDNSサーバーに送信してはならない。
- Caching DNS servers SHOULD recognize "invalid" names as special and SHOULD NOT attempt to look up NS records for them, or otherwise query authoritative DNS servers in an attempt to resolve "invalid" names. Instead, caching DNS servers SHOULD generate immediate NXDOMAIN responses for all such queries. This is to avoid unnecessary load on the root name servers and other name servers.
4. キャッシュDNSサーバーは「invalid」名を特別なものとして認識し、NSレコードの検索を試みたり、その他の方法で「invalid」名の解決を試みるために権威DNSサーバーに問い合わせを行ってはならない。代わりに、すべての「invalid」名に対するクエリに対して即時にNXDOMAIN応答を生成するべきである。これは、ルートDNSサーバーやその他のネームサーバーに不必要な負荷をかけないためである。
- Authoritative DNS servers SHOULD recognize "invalid" names as special and handle them as described above for caching DNS servers.
5. 権威DNSサーバーは「invalid」名を特別なものとして認識し、前述のキャッシュDNSサーバーと同様の方法で処理しなければならない。
- DNS server operators SHOULD be aware that the effective RDATA for "invalid" names is defined by protocol specification to be nonexistent and cannot be modified by local configuration.
6. DNSサーバーの運用者は「invalid」名の有効なRDATAがプロトコル仕様によって定義上存在しないものであり、ローカル設定によって変更できないことを認識しておく必要がある。
- DNS Registries/Registrars MUST NOT grant requests to register "invalid" names in the normal way to any person or entity. These "invalid" names are defined by protocol specification to be nonexistent, and they fall outside the set of names available for allocation by registries/registrars. Attempting to allocate a "invalid" name as if it were a normal DNS domain name will probably not work as desired, for reasons 2, 3, 4, and 5 above.
7. DNSレジストリ/レジストラは、通常の手続きで「invalid」名の登録要求をいかなる個人または団体に対しても認めてはならない。これらの「invalid」名はプロトコル仕様によって定義上存在しないものであり、レジストリ/レジストラが割り当て可能な名前の範囲外にある。「invalid」名を通常のDNSドメイン名と同様に割り当てようとすると、上記の理由2、3、4、5により、期待通りに動作しない可能性が高い。
他の特殊なTLDとのおもな違いは以下の通りである:
応答 | |
---|---|
.invalid |
つねに NXDOMAIN |
.localhost |
つねに通常応答しループバックアドレスを返す |
.test |
デフォルトで不在応答するが、権威サーバはなんらかのアドレスを返すように設定してもよい |
example. |
普通に通常応答する |
このため、example.
ドメインは実在のホストにリクエストが飛ぶ可能性があるが、.invalid
はつねに「そういうドメインはないよ(NXDOMAIN
)」と応答することが決まっているため、安心してダミーの値として使うことができる。何らかの実際のアドレスを返す可能性があるならば.test
を利用する可能性も見えてくるが、ダミーの値であればその必要もないだろう。
.invalid
使いましょう
.invalid
は実際にどこかにリクエストが飛ぶ可能性が全くないので、テストで使うダミーの値としてはこれを使うのがよいと思う。