LinuC Level1 v10.0 対策コース(パート2)20/29
システムの空いているポートについて
ここではデーモンやネットワークに関するコマンドについて解説します。
スーパーサーバー
Linuxシステムには、デーモン(daemon)と呼ばれる常駐プログラムがあります。
デーモンは、常にメモリ上でクライアントからのリクエストを待ち受けています。
しかし、クライアントからリクエストが無いにも関わらず、常に起動・待機状態にあるデーモンも存在します。その結果、リソースを無駄に多く消費してしまい、システムを圧迫することになってしまいます。
この問題を解決するために、 スーパーサーバー(super server) という機能(デーモン)があります。
スーパーサーバーは、クライアントからのリクエストを受け付けて、必要なデーモンのみを起動します。不要なデーモンは非起動状態となっており、必要なときだけスーパーサーバーによって叩き起こされる(起動される)ため、より効率的にリソースを使用することができるようになります。
ただし、スーパーサーバーを経由することにより、レスポンスが遅延してしまうというデメリットもあります。そこで、高速なレスポンスを必要とする場合には、スーパーサーバーを経由せず、デーモン自身がポートを監視する形式をとります。この形式のことを スタンドアローン(standalone) といいます。
スーパーサーバー('スーパーデーモン'とも呼びます)としては、 inetd
や xinetd
などがあります。
※ inetdやxinetdについては、Envader セキュリティコースの『Nmapを使ってみよう』の解説記事で詳しく説明しています。ぜひご覧ください。
ポート
先ほどから申し上げている通り、スーパーサーバーはクライアントからのリクエストを受け付けます。では、そのリクエストはどこに届くのでしょうか。
それは、ポート(port)といわれる通信の接続口です。各ポートにはポート番号とサービス(プロトコル)が対応付けられています。
まとめると以下のような流れになります。
- サーバー側ではいくつかのポートを開いておきます。このポートを開いてリクエストを待ち受けている状態をリッスン(LISTEN)しているといいます。
- スーパーサーバーやデーモン自身は、このポートを常に監視しています。
- そして、リクエストが届くと、スーパーサーバーがリクエストを受け付けて必要なデーモンを起動します。(スタンドアローンであれば、デーモン自身がリクエストを受け付けます。)
- 最後に、デーモンはレスポンスをポートに直接返します。
ここからは、ポートやソケットといった通信インターフェースを始めとした、ネットワーク情報に関するコマンドについて解説していきます。
ssコマンド
ss
(socket statistics)は、ネットワークソケットを確認するためのコマンドです。
ソケット(socket)とは、 ネットワーク通信の窓口(インターフェース) です。
例とオプション
$ ss -tuln
このコマンドは、現在のシステム上でリスニングしているTCP/UDPのソケットを表示します。
オプション | 説明 |
---|---|
-t | TCPソケットを表示 |
-u | UDPソケットを表示 |
-l | リスニングしているソケットを表示 |
-n | サービス名を解決せずに、数値のまま表示 |
netstatコマンド
netstat
(network statistics)は、ネットワークの状態などの統計情報を表示するコマンドでしたが、現在ではss
コマンドに取って代わられ、ssコマンドが一般的に利用されるようになっています。
※ なお、ファイルもしくはファイルシステムの状態を表示する場合には stat
(status)コマンド、メモリーやCPUの負荷率や使用状況を表示する場合には vmstat
(virtual memory statistics)コマンドを使用します。
オプション
オプション | 説明 |
---|---|
-a | 全てのソケット情報を表示する |
-i | ネットワークインターフェースの状態を表示する |
-n | アドレスやポートを数字表示する |
-r | ルーティングテーブルを表示する |
-s | プロトコルの統計情報を表示する |
-t | TCPポートを表示する |
-u | UDPポートを表示する |
# 開いている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) : ポートの状態(※ 以下に挙げるもの以外にもさまざまな状態があります。)
状態 説明 ESTABLISHED TCPセッションが確立された状態 LISTEN ポートが開いており、リクエストを待ち受けている状態 CLOSE_WAIT FINパケットを受信した状態 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の セキュリティ基礎コース では実際に手を動かしながらセキュリティが学べます。
今回の記事で少しでもセキュリティに興味をもたれた方は、ぜひ問題にトライしてみてください。
記事の内容は理解できましたか?