ByteScope

5900

ポート 5900 · VNC

TCPIANA 割り当てありリモート接続

VNC が話す RFB プロトコルのベースポート。ビューアがつながらないのに、サーバーは 5901 で平然と動いている——その理由もここにあります。

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

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

外側から確かめる

打つ価値があるのは `nmap -Pn -p 5900-5910 host.example.com` のほうです。単一のポートを見ても問いの半分にしか答えられません——サーバーはディスプレイ `:1` のために 5901 にいるかもしれないからです。`-Pn` はホスト探索を飛ばすので、ping を無視するホストもスキャンされます。nmap の状態には正確な意味があります。`open` は対象上のアプリケーションが待ち受けている、`closed` はホストは答えたがそこには誰もいない、`filtered` はファイアウォールやフィルタ、その他のネットワーク上の障害物がプローブを塞いでいて nmap にはどちらか判断できない、です。VNC では `closed` の 5900 と `open` の 5901 が並んだ 1 行が、そのまま診断結果になります。`--reason` で各状態を決めたパケットが分かり、`-sV` を付ければ RFB のバナーを読んでプロトコルバージョンと実装まで報告します。スキャンは自分が責任を持つホストにだけ。

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

出ているもの意味
The viewer reports connection refused on 5900 while the VNC server is definitely runningほぼ確実にディスプレイ番号の計算です。RFC 6143 はサーバー N を 5900+N に置くので、`vncserver :1` は 5901 にいて、5900 には何もいません。ホスト名だけを渡されたビューアは 5900 を叩き、正しく拒否されます。ビューアの書式に応じて `host:1` か `host::5901` と入力し、単一ポートではなく範囲でスキャンして確認してください。
The viewer hangs and eventually times out instead of failing immediately何も答えていないので、拒絶ではなく破棄です。ホストのファイアウォール、クラウドのセキュリティグループ、あるいは経路上の ACL。拒否は即座に返り、破棄は接続タイムアウトいっぱいかかります。`nmap --reason` が名前を付けてくれます——破棄なら `filtered`、拒否なら `closed`。そしてこれは、サーバーを正しくループバックにバインドしたうえで SSH トンネルを忘れたときにも出る、想定内の結果です。
The server will not start: the display or port is already in use, or bind fails with Address already in use5900+N での `EADDRINUSE` です。そのディスプレイの前の `Xvnc` がまだ生きているか、kill されたものが残したロックファイルのせいでポートは空いているのにディスプレイだけ埋まって見えるかのどちらかです。エラー文だけでは二つを見分けられないので、まず自分の環境のコマンドでポートを確認してください。別のディスプレイ番号で起動すれば回避でき、正しいプロセスを kill すれば解決します。
No matching security typesTCP の接続は成功し、RFB のハンドシェイクもセキュリティのネゴシエーションまで進んで、そこでサーバーの一覧とビューアの一覧に共通するものが一つもありませんでした。よくあるのは、サーバーが VNC Authentication しか提示していないのにビューアが暗号化されたベンダー拡張を必須に設定されているケースや、このビューアが実装していない独自タイプをサーバーが出しているケースです。二つのプログラム間の設定のずれであってネットワークの障害ではないので、ポートには触るところがありません。
A long password is accepted, and so are its first eight charactersサーバーのバグではありません。VNC Authentication は DES の鍵を、パスワードを 8 文字に切り詰めるか右側にヌルバイトで詰めて作るので、9 文字目以降は両側で捨てられます。セッションを攻撃する側が探索すべきなのは常に 8 文字ぶんだけで、だからこそ RFC 6143 自身がこの方式を暗号学的に弱く、信頼できないネットワークには不適切だと呼んでいます。
lsof or ss prints nothing, yet the port is clearly busy権限のケースです。どちらのツールも `sudo` なしでは自分が所有するプロセスしか出さないので、別のユーザーが起動した VNC サーバー、macOS の画面共有のようなシステムサービス、あるいはコンテナの中のものは見えません。ポートが空いていると結論づける前に `sudo` を付けて再実行してください。そして持ち主が Docker のプロセスだと分かったら、プロセスではなくコンテナを止めてください。スーパーバイザーが公開し直すだけです。
The session connects, but the screen is blank or shows only a grey background and an X cursorポートも認証も通っているので、これはネットワークの問題ではまったくありません。単体の `Xvnc` のディスプレイは、ウィンドウマネージャーが起動されるまでデスクトップセッションが何も付いていない状態で始まります。それを起動するのはサーバーの起動スクリプトの仕事です。ポートではなく、そのディスプレイに対する VNC サーバー自身のログを見てください。

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

5900 は Remote Framebuffer プロトコルのベースポートで、RFC 6143 として標準化され、IANA には `rfb` として登録されています。全員が引っかかる計算について、RFC は明確です。「RFB クライアントは TCP ポート 5900 でサーバーに接続する。複数の RFB サーバーがあるシステムでは、サーバー N は通常ポート 5900+N で待ち受ける。X Window サーバーがポート 6000+N で待ち受けるのと同様である」。つまり Unix の `vncserver` がディスプレイ `:1` で起動したなら、待ち受けているのは 5901 であって 5900 ではありません。そして 5901 は IANA のレジストリには存在しません。登録されているのはベースの番号だけです。ビューアにホスト名だけを打ち込むと 5900 を叩きに行き、そのマシンではそこに何もいないことが非常に多い——「接続が拒否されました」が VNC で最もありふれた症状であり、しかもほぼ確実に思っているのとは違う意味である理由がこれです。実際に何がポートを持っているかはプラットフォームによって違い、探しに行くときに効いてきます。macOS では内蔵の画面共有と Apple Remote Desktop が 5900 を直接使い、Apple 自身のポート一覧も RFC 6143 を参照して `rfb` と記しています。Linux なら TigerVNC や TightVNC の `Xvnc`、あるいは既存のディスプレイに取り付く `x11vnc`。Windows なら TightVNC の `tvnserver` のようなサービスです。どれも同じハンドシェイクを話すので、あるプロジェクトのビューアが別のプロジェクトのサーバーにつながるのが普通です——両者がセキュリティタイプで折り合えなくなる、その一点までは。

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

5900 をインターネットに出さないでください。そして VNC のパスワードを防御と勘違いしないでください。RFC 6143 がコアプロトコルで定義しているセキュリティタイプはたった三つ、0 の Invalid、1 の None、2 の VNC Authentication だけです。タイプ 1 は認証がまったくないという意味で、インターネットに露出したサーバーの相当数が今もこれを提示しています。タイプ 2 もほとんど変わりません。サーバーがランダムな 16 バイトのチャレンジを送り、クライアントがパスワードを鍵として DES で暗号化するのですが、そのとき「パスワードは 8 文字に切り詰められるか、右側にヌルバイトで詰められる」のです。どれだけ長いパスワードを打っても、鍵空間は 8 文字ぶんしかありません。RFC 自身のセキュリティ考察も率直で、この方式は「暗号学的に弱いことが知られており、信頼できないネットワークでの使用は意図されていない。多くの実装は、IPsec や SSH が提供する暗号化されたチャネル上でセッションを走らせるなど、より強いセキュリティを使いたいと考えるだろう」と書いています。コアプロトコルにはセッションを暗号化する仕組みもないので、フレームバッファも、そこに打ち込むものも全部、平文でネットワークを渡ります。サーバーはループバックにバインドして、`ssh -L 5901:127.0.0.1:5901 user@host` のようなトンネル越しに `127.0.0.1:5901` へビューアを向けてください。ベンダー拡張で TLS や強い認証を足せますが、あくまで拡張なので、両端が同じものを実装している必要があります。実装していないときに出るのが、まさにセキュリティタイプのネゴシエーション失敗です。

サービス
VNC
トランスポート
TCP
登録状況
IANA 割り当てあり
カテゴリ
リモート接続

このサイトのツール

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

関連するポート

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

よくある質問

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

ほぼ権限の問題です。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 なのに届かないなら、次に疑うのはホストのファイアウォールかクラウドのセキュリティグループです。

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

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

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