1. ホーム
  2. コース一覧
  3. LinuC Level1 v10.0 対策コース(パート2)
  4. システムの空いているポートについて

LinuC Level1 v10.0 対策コース(パート2)20/29

システムの空いているポートについて

ここではデーモンやネットワークに関するコマンドについて解説します。

スーパーサーバー

Linuxシステムには、デーモン(daemon)と呼ばれる常駐プログラムがあります。

デーモンは、常にメモリ上でクライアントからのリクエストを待ち受けています。

しかし、クライアントからリクエストが無いにも関わらず、常に起動・待機状態にあるデーモンも存在します。その結果、リソースを無駄に多く消費してしまい、システムを圧迫することになってしまいます。

この問題を解決するために、 スーパーサーバー(super server) という機能(デーモン)があります。

スーパーサーバーは、クライアントからのリクエストを受け付けて、必要なデーモンのみを起動します。不要なデーモンは非起動状態となっており、必要なときだけスーパーサーバーによって叩き起こされる(起動される)ため、より効率的にリソースを使用することができるようになります。

ただし、スーパーサーバーを経由することにより、レスポンスが遅延してしまうというデメリットもあります。そこで、高速なレスポンスを必要とする場合には、スーパーサーバーを経由せず、デーモン自身がポートを監視する形式をとります。この形式のことを スタンドアローン(standalone) といいます。

スーパーサーバー('スーパーデーモン'とも呼びます)としては、 inetdxinetd などがあります。

※ inetdやxinetdについては、Envader セキュリティコースの『Nmapを使ってみよう』の解説記事で詳しく説明しています。ぜひご覧ください。

ポート

先ほどから申し上げている通り、スーパーサーバーはクライアントからのリクエストを受け付けます。では、そのリクエストはどこに届くのでしょうか。

それは、ポート(port)といわれる通信の接続口です。各ポートにはポート番号とサービス(プロトコル)が対応付けられています。

まとめると以下のような流れになります。

  1. サーバー側ではいくつかのポートを開いておきます。このポートを開いてリクエストを待ち受けている状態をリッスン(LISTEN)しているといいます。
  2. スーパーサーバーやデーモン自身は、このポートを常に監視しています。
  3. そして、リクエストが届くと、スーパーサーバーがリクエストを受け付けて必要なデーモンを起動します。(スタンドアローンであれば、デーモン自身がリクエストを受け付けます。)
  4. 最後に、デーモンはレスポンスをポートに直接返します。

ここからは、ポートやソケットといった通信インターフェースを始めとした、ネットワーク情報に関するコマンドについて解説していきます。

ssコマンド

ss(socket statistics)は、ネットワークソケットを確認するためのコマンドです。

ソケット(socket)とは、 ネットワーク通信の窓口(インターフェース) です。

例とオプション

$ ss -tuln

このコマンドは、現在のシステム上でリスニングしているTCP/UDPのソケットを表示します。

オプション説明
-tTCPソケットを表示
-uUDPソケットを表示
-lリスニングしているソケットを表示
-nサービス名を解決せずに、数値のまま表示

netstatコマンド

netstat (network statistics)は、ネットワークの状態などの統計情報を表示するコマンドでしたが、現在ではssコマンドに取って代わられ、ssコマンドが一般的に利用されるようになっています。

※ なお、ファイルもしくはファイルシステムの状態を表示する場合には stat (status)コマンド、メモリーやCPUの負荷率や使用状況を表示する場合には vmstat (virtual memory statistics)コマンドを使用します。

オプション

オプション説明
-a全てのソケット情報を表示する
-iネットワークインターフェースの状態を表示する
-nアドレスやポートを数字表示する
-rルーティングテーブルを表示する
-sプロトコルの統計情報を表示する
-tTCPポートを表示する
-uUDPポートを表示する
# 開いているTCPポートを調べます。
netstat -at
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp6       0      0  2400:4153:c245:3.50203 2606:4700:4400::.https ESTABLISHED
tcp6       0      0  2400:4153:c245:3.50202 nrt20s18-in-x0e..https ESTABLISHED
tcp4       0      0  172.17.31.96.50157     52.139.250.209.https   ESTABLISHED
tcp4       0      0  172.17.31.96.50155     172.64.154.162.https   ESTABLISHED
tcp6       0      0  *.50143                *.*                    LISTEN     
tcp4       0      0  *.50143                *.*                    LISTEN     
tcp4      31      0  172.17.31.96.49715     170-114-10-79.zo.https CLOSE_WAIT
....

結果から、以下のようなことが分かります。

  • Active : アクティブなTCPポート

  • Recv-Q : 受信(recieve)パケットのうち、ポートに接続されているユーザーに送られなかったパケットのbyte数

  • Send-Q : 送信(send)パケットのうち、通信しているリモートからACKパケットが返ってきていないパケットのbyte数

  • Local Address : ローカルポートのアドレスとポート番号

  • Foreign Address : リモートポートのアドレスとポート番号

  • (state) : ポートの状態(※ 以下に挙げるもの以外にもさまざまな状態があります。)

    状態説明
    ESTABLISHEDTCPセッションが確立された状態
    LISTENポートが開いており、リクエストを待ち受けている状態
    CLOSE_WAITFINパケットを受信した状態
    TIME_WAIT接続を待っている状態

lsofコマンド

lsof(list open files)は、システムで開いている全てのファイルやプロセス、ネットワークソケット等を一覧表示するためのコマンドです。

オプション

オプション説明
-i開いているポート情報を表示する
-i: <port>指定したポートを調べる(<port>にポート番号を指定する)
-u表示したいユーザーを指定する
-p表示したいプロセスを指定する
lsof       
COMMAND     PID    USER   FD      TYPE             DEVICE   SIZE/OFF                NODE NAME
distnoted   766 envader  cwd       DIR               1,16        640                   2 /
distnoted   766 envader  txt       REG               1,16     357392 1152921500312788302 /usr/sbin/distnoted
distnoted   766 envader  txt       REG               1,16    2160656 1152921500312781597 /usr/lib/dyld
distnoted   766 envader    0r      CHR                3,2        0t0                 334 /dev/null
distnoted   766 envader    1u      CHR                3,2        0t0                 334 /dev/null
distnoted   766 envader    2u      CHR                3,2      0t165                 334 /dev/null
....

fuserコマンド

fuserコマンドは、指定したファイルやディレクトリ、またはネットワークソケットを開いているプロセスを特定するために使用します。

オプション

オプション説明
-iプロセスをkillする前にユーザーに確認する
-k指定したファイルを開いているプロセスをkillする
-m指定したファイルを開いているプロセスを表示する
-n名前空間を指定する
-uプロセスの所有者をPIDとともに表示する
# /tmpを利用しているプロセスをkillします
fuser -k /tmp

ネットワーク関連コマンドのまとめ

ネットワークに関するコマンドについて解説しました。

また、Envaderの セキュリティ基礎コース では実際に手を動かしながらセキュリティが学べます。

今回の記事で少しでもセキュリティに興味をもたれた方は、ぜひ問題にトライしてみてください。

記事の内容は理解できましたか?