ByteScope

53

ポート 53 · DNS

TCP/UDPIANA 割り当てありインフラ

名前解決のためのポートで、UDP と TCP の両方を使います。そして最近の Linux デスクトップでは既に systemd-resolved が握っているので、dnsmasq や Pi-hole が起動しません。

ポート 53 を使っているプロセスを特定する

自分の環境の行をそのまま実行してください。ポートを掴んでいるプロセス名と、バインドしているアドレスが出ます。たいていはそれだけで答えが分かります。

外側から確かめる

`nmap -Pn -sU -p 53 ns1.example.com` は UDP 側、つまり実際の問い合わせが流れる側を見にいきます。`-sU` は raw socket を使うので `sudo` が要ります。付けずに実行すると、パケットを 1 つも送らないまま `You requested a scan type which requires root privileges.` で止まります。TCP の 53 番を試すなら `-sU` を外し、そして両方試してください。片方だけ開いているファイアウォールは、典型的な「たまに失敗する」の製造機です。UDP の結果は TCP ほどはっきりしません。沈黙と破棄が区別できないので、nmap は断定せず `open|filtered` と報告し、`closed` になるのは ICMP の port unreachable が返ってきた場合だけです。実際に何が観測されたかは `--reason` で分かります。ただ、本当の答えが欲しいならスキャンより質問です。`dig @ns1.example.com example.com A` はレコードを返すか、タイムアウトするか、拒否されるかのどれかで、同じ情報がずっと曖昧さなく手に入ります。スキャンは自分が責任を持つホストにだけ。

53 につながらないときの読み方

出ているもの意味
dnsmasq: failed to create listening socket for port 53: Address already in usesystemd 系のディストリビューションなら、ほぼ確実に systemd-resolved の stub リスナーが 127.0.0.53:53 を既に持っています。上の Linux 用コマンドで確認したうえで、`/etc/systemd/resolved.conf` に `DNSStubListener=no` を書いて systemd-resolved を再起動するか、自分のリゾルバをワイルドカードではなく特定のインターフェイスアドレスにバインドしてください。プロセスを kill して張り合っても、再起動すれば戻ってきます。
;; communications error to 192.0.2.1#53: connection refusedホストは答えました。答えが「いいえ」だっただけです。そのアドレスの 53 番には何もバインドされていません。リゾルバが停止しているか、起動時に落ちたか、ループバックにしかバインドしていないのでサーバー自身以外からは見えないかのどれかです。リゾルバのホストでコマンドを実行し、プロセスの有無だけでなくバインドアドレスを見てください。
;; connection timed out; no servers could be reached何も返ってきていません。パケットフィルタが問い合わせを捨てているか——セキュリティグループ、ホスト上のファイアウォール、ネットワーク ACL のどれか——単にアドレスが違います。UDP はコネクションレスなのでリセットで教えてくれる相手もおらず、沈黙はタイムアウトいっぱい続きます。`dig +tcp` で TCP も試してください。TCP は通って UDP は通らないなら、遮断はプロトコル単位です。
;; Truncated, retrying in TCP mode. — then a timeout応答が UDP に収まる大きさを超えたので、サーバーは RFC 1035 の要求どおり TC ビットを立て、クライアントは TCP でやり直そうとして塞がれました。これは「UDP の 53 番だけ開けて TCP の 53 番を忘れた」ファイアウォールの壊れ方です。小さなルックアップは通り、DNSSEC 署名つきやレコード数の多い大きな応答だけ失敗するので、どの名前で壊れるかに気づくまではランダムな障害にしか見えません。
REFUSED status in a dig answer, or ;; got answer with no recordsポートもネットワークもデーモンも正常です。サーバーは問い合わせを理解したうえで断りました。たいていは権威専用のサーバーに再帰の質問をしたか、再帰を許可されたアドレス範囲の外から尋ねたかです。直すべきはネットワークではなくアクセスポリシーです。
bind: Permission denied binding port 53 as a normal user53 番は 1024 未満なので特権ポートで、他に誰が待ち受けていようがいまいが、カーネルは EACCES で bind を断ります。サービスマネージャー経由でリゾルバを起動するか、Linux なら `CAP_NET_BIND_SERVICE` を付与するか、`dig -p 5300 @127.0.0.1` のように高い番号でテストしてください。

ポート 53 で動いているもの

IANA は 53 番を TCP・UDP 両方で `domain` に割り当てていて、どちらも本当に使われています。通常の問い合わせを運ぶのは UDP です。1 回のルックアップは往復とも小さなパケット 1 つで済み、コネクションを張るほうが答えより高くつくからです。TCP は UDP では足りない場合のためにあります。RFC 1035 は「UDP で運ばれるメッセージは 512 バイトに制限される」と定めていて、収まらない応答は TC ビットを立てた切り詰め状態で返され、クライアントは TCP で同じ問い合わせをやり直します。EDNS(0)(RFC 6891)を使えばクライアントはより大きな UDP バッファを広告できるので、大きな応答の多くは UDP のまま運べますが、RFC 7766 は TCP 対応を任意のフォールバックではなく必須としています。UDP でしか届かないリゾルバは、制限があるのではなく壊れています。ゾーン転送(AXFR)は常に TCP です。暗号化された DNS はここにはいません。DNS over TLS は RFC 7858 が `domain-s` として登録した 853 番、DNS over HTTPS は 443 番に相乗りします。プリンタや AirPlay が使う `.local` の名前解決、つまりマルチキャスト DNS は 5353 番(RFC 6762)なので、出力に出てくる `5353` の行はあなたのリゾルバではありません。ローカルでいちばんよく起きる衝突は systemd-resolved で、マニュアルには stub リスナーが「IPv4 アドレス 127.0.0.53 と 127.0.0.54 のポート 53」を占有すると書かれています。UDP も TCP も含みます。素の Ubuntu で dnsmasq、Pi-hole、CoreDNS、BIND がどれも起動しないのはこれが理由で、`/etc/systemd/resolved.conf` に `DNSStubListener=no` を書くまで解決しません。Docker コンテナの中ではリゾルバのアドレスがまた別で、`127.0.0.11` になります。

ポート 53 を外部に開けてよいか

権威サーバーは届く必要があり、再帰リゾルバは届いてはいけません。インターネット全体からの再帰問い合わせに答えるリゾルバは、そのまま反射増幅の武器になります。攻撃者は送信元を標的のアドレスに詐称した小さな問い合わせを投げ、あなたのサーバーがずっと大きな応答を標的に送りつけます。RFC 5358(BCP 140)は、再帰ネームサーバーを開放したままにするなと運用者に伝えるためだけに存在しますし、オープンリゾルバは現れてから数時間で全世界スキャンに捕捉されます。再帰は自分のアドレス範囲に限定し、権威と再帰は別のサーバーに分けてください。そうすれば権威側は再帰せずに世界へ答えられます。AXFR も宣言済みのセカンダリに限定してください。制限のないゾーン転送は、内部の命名体系とホスト名、多くの場合ネットワークの構成まで、まとめて 1 回の要求で手渡します。応答にはレート制限をかけ、UDP はコネクションレスなので問い合わせの送信元アドレスは簡単に詐称できる、つまりそれを根拠にしたアクセス制御は見た目より弱いということを覚えておいてください。TCP の 53 番を開け忘れたまま放置するのも危険です。UDP だけ許可して TCP を塞ぐと、応答が UDP バッファに収まらなくなるまでは名前解決が動き、そこから先は「たまに、なぜか失敗する」という形で壊れます。

サービス
DNS
トランスポート
TCP/UDP
登録状況
IANA 割り当てあり
カテゴリ
インフラ

このサイトのツール

どれもブラウザ内で完結します。アップロードは発生しません。

関連するポート

53 を調べているとき、ついでに確認することになりがちなポートです。

よくある質問

明らかに使用中なのに、コマンドが何も表示しないのはなぜ?

ほぼ権限の問題です。lsofss はソケット自体は出しますが、他ユーザーのプロセスは所有者の列を伏せるので、システムアカウントやコンテナランタイム、launchd が起動したサーバーは sudo を付け直すまで持ち主不明のリスナーに見えます。Windows は逆で、netstat には何も出ないのに bind だけ失敗します。これは Hyper-V や WSL2、Docker Desktop が起動時に予約したポート帯に当たっている状態です。

ポートを掴んでいるプロセスは kill してよい?

何なのかを先に見てください。取り残された開発サーバーなら問題ありませんが、書き込み中のデータベースは別ですし、他が依存しているシステムサービスも同様です。持ち主がコンテナならコンテナごと停止してください。ホストから見えるプロセスを kill してもランタイムが再起動するだけです。どうしても止められないものなら、自分のサービスを別のポートへ移すほうが早く片付きます。

ローカルからは届くのに、別のマシンからは届かないのはなぜ?

0.0.0.0 ではなく 127.0.0.1 にバインドしているからです。各ページのコマンドがプロセス名と並べてバインド先アドレスを出しているのはこのためで、ループバックにバインドしたものはファイアウォールの設定に関係なく自分のマシンからしか届きません。最近は意図的にそれを既定にしているフレームワークも多いので、たいていはバグではなくフラグの問題です。すでに 0.0.0.0 なのに届かないなら、次に疑うのはホストのファイアウォールかクラウドのセキュリティグループです。

珍しいポート番号に移すと安全になる?

ほとんどなりません。インターネット全体を舐めるスキャナーはポート範囲を丸ごと走査し続けているので、稼げるのは数時間であって安全ではなく、代わりに関係者全員がその番号を覚える羽目になります。既定ポートを狙う無差別スキャンのログが減るという効果は確かにありますが、それだけです。結果を変えるのは認証と、送信元アドレスを絞ったファイアウォールと、そもそも外に出さないことです。

ポート 53 でまだ詰まっていますか。ポート一覧をすべて見る。あるいは上に戻って、実際に出たエラー文から追ってください。