セキスペの過去問を解いていたらポートスキャンに関する問題が出てきた。
synを送ってその反応を見る、というもので、
まず「それを何というか」という問題があり、「ポートスキャン」と回答したが、
正解は「SYNスキャン」であった。
SYNスキャンはポートスキャンの一種なので間違いではないが、
SYNだけ送って、そのあとSYNACKが返ってきてもセッションを確立しないので、
スキャン先に接続履歴を残したくないときに使うそうだ。
もう一つの問題は、「ポートが閉じているときにどういう反応があるか」というもので、
私は「応答なし」と答えたのだが正解は「RSTACK受信」および「応答なし」であった。
私は応答がないと思い込んでいたので、えっと思って
パソコンでwiresharkを起動して自分のサーバへのアクセスで試してみた。
接続できないはずのtelnetアクセスをしてみると応答がない。
しかしそれはポートが開いてるかどうか以前にiptablesで許可していないからだと気づき、
一時的にiptablesを無効にして、再度telnetしてみた。
RST,ACKが返ってくる。
なるほど。
以前nmapでポートスキャンしたときに、「ポートにアクセスできないがフィルターされているかもしれない」みたいな結果が出たことがあった。
これはsynに応答がなかった場合であろう。
サーバでtelnetサービスが動いていてもiptablesとかその前のFW装置で許可されていなければ応答が返ってこない。
だから応答が返ってこない場合はポートが開いているか閉じているかはわからない。
今書いていて思ったのだが、ポートが開いていないときにRSTを返さないような設定ができるんじゃないだろうか?
できないか?
まあいい。ふつうはRST ACKが返るということがわかった。
ところで、「ポートが開いている」という言い方をよくするが、
私はまだ若いころ、その確認方法がよくわからなかった。
どこかに設定ファイルがあって、開けるポート番号または閉じるポート番号を指定してあるのだと思っていた。
しかし、サーバ(RedHat9)設定のどこを探してもそのような設定はない。
そのサーバではiptablesは設定していなかった。設定方法も知らなかった。
検証環境のサーバだからだ。
調べていくうちにiptablesのこともわかってきたのだが、
iptablesは確かに通信を許可するポートを開けたり閉めたりするが、
いわゆる「ポートが開いている」というのはそのことを言うのではない。
まあ、ユーザや運用管理者にとっては「FWで閉じている=閉じている」
ということでよいだろう。
しかし、「FWで開いている=開いている」にはならない。
というか、そもそも「ポートが開いている」という言い方が不正確で誤解を生む。
開いているという言い方だとFWで開け閉めするのを想像するが、
正確には「そのポートをリッスンしているサービスが稼働している」
という状態である。
たとえばtelnetサービスを有効にしていてその使用ポートが23であれば、
「TCP23が開いている」となる。
使用ポートは変更できるので、telnetサービス(正確にはtelnetサーバサービス)が動いている=23番が開いているとも言えない。
そんな人はいないと思うが、telnetで80番を使うようにすることもできる(よね?)。
私のサーバではtelnetは動作していず、sshが動作していてポート番号は22でないものに変更している。
このとき、「TCP23は開いていず、SSH接続できるがTCP22は開いていない」という状態になる。
そして、iptablesでTCP23とTCP22は拒否しているので、
ポートスキャンするといずれも応答が返らない。
しかし、その結果だけからは、サーバの手前の別装置のFWやアクセスリストで拒否されているのか、
サーバのiptablesで拒否されているのか、サーバがダウンしているのか、はわからない。
アクセスしているIPアドレスが間違っている可能性もある。
pingは返ってくる、80番はアクセスできる、23番は応答がない、
であればFWかサーバのiptablesで拒否されているとわかる。