Linuxサーバ初心者向けに、「ポートが開いてる」と「Listenしている」の違いをわかりやすく説明してみます。
まずはこちらをご覧ください
ロミオとジュリエットが窓越しに会話をしています。
HTTPで例えると、左のロミオがWebブラウザ(HTTPクライアント)、右のジュリエットがApache(HTTPサーバ)です。
ロミオがHTTPリクエストを送るとジュリエットはHTTP レスポンスを返してくれます。
この会話(=通信)が成り立つのは、
- 屋敷の窓が開いていて
- ジュリエットが聞く耳を持っている
ときだけです。
重要なのは、「窓が開いているかどうか」と「ジュリエットが聞く耳をもっているかどうか」は別々のことなのです。
ジュリエットが聞く耳を持っている | ジュリエットが聞く耳を持っていない | |
---|---|---|
窓が開いている | ○ | x |
窓が閉じている | x | x |
○のときだけロミオは会話ができます。
「ポートが閉じている」= 窓が閉じている
窓が閉じている場合は、ジュリエットがどれだけロミオを待ち構えていても、会話はできません。
技術的に言うと、「ポートを閉じる」とは、パケットを転送しないで捨ててしまうことです。
やり方は何通りかあって、よくつかわれるのは次の2つの方法です。
ルータ機器によるファイアーウォール機能でポートを閉じる
城門が閉まっていると、敷地内に入ることすらできません。
ルータ(城門)でポートを閉じると、サーバ(屋敷)にパケット(声)が到達できなくなります。
クラウドの場合は物理的なルータを扱えないことが多いですが、似たような機能がサービスとして用意されてたりります。
例えばAWS EC2の場合はSecurityGroups
という機能がファイアーウォールの役割を果たしてくれます。
サーバのパケットフィルタ機能でポートを閉じる
城門(ルータ)が開いていれば屋敷(サーバ)の前まで行くことができますが、部屋の窓が閉じていると、ロミオの声はジュリエットに届きません。
サーバにはパケットフィルタ機能というものがあって、外から入ってくるパケットを遮断することができます。
Linuxではfirewalldとかiptablesという名前で呼ばれている機能で、内部的にはカーネルモジュールとして実装されています。
「Listenしている」= なかのひとが聞き耳をたてている
"Listenする"とは、なかのひと(=プロセス)が聞く準備ができている状態をいいます。
たとえ窓(ポート)が開いていたとしても、なかのひとが眠っていたり死んでいたりすると、こちらから話かけても会話はできません。
netstat
やss
コマンドでポートのListen状態を調べることができます。これは、「聞き耳を立てているひと(プロセス)がいるかどうか」を調べるときに使います。逆に、netstat
やss
は窓の開閉を調べるのには使えません。
窓は複数ある
1つのサーバ(=家)には窓が複数あるのが普通です。
開いている窓と、中のひとが聞き耳をたてる窓は一致している必要があります。
例えば、80番目の窓しか開いてないのに、中の人が間違って8080番目の窓に聞き耳を立てても、会話は成立しません。
なかの人も複数人いる
ジュリエットが80番目の窓に聞き耳をたてているときに、ジュリエットの妹が22番目窓に聞き耳をたてる、というのは可能です。
webサーバの場合は普通sshdとhttpdの通信を許可しますので、そういう状態になっています。
一方、ジュリエットの妹が、既にジュリエットが張り付いている80番目の窓に聞き耳をたてにいこうとすると、エラーで失敗します。
1人が複数の窓に同時に聞き耳をたてることはできる
ジュリエットが80番の窓と443番の窓に聞き耳をたてる、ということは可能です。
よくあるのがApacheが80番ポートと443番ポートをListenしているケースです。