ホーム » コンピュータ » Linux » Debian » ネットワークサービスとポートスキャン

システム

最近の投稿

アーカイブ

カテゴリー

ネットワークサービスとポートスキャン

外部からネットワーク接続を受けて、どういった処理を実行するようになっているのかを知るための方法を説明する。

ポート番号

ネットワーク通信では、通信する相手を指定するために IP アドレスが用いられるが、サーバでは、複数のプログラムが動いており、どのプログラムと接続するのかを指定するには、ポート番号を用いる。

IPアドレスを電話番号に例えるならば、ポート番号は内線電話番号に相当する。

特に、サーバではクライアントからの通信を待つために、このサービスならばこのポート番号を使うという標準番号が決まっている

SSH    = 22   # リモート接続(暗号化)
TELNET = 23   # リモート接続
SMTP   = 25   # メール送信
DNS    = 53   # DNSサービス
HTTP   = 80   # Web サーバ
POP    = 109,110 # メール受信
IMAP   = 143  # メール受信
HTTPS  = 443  # Web サービス(暗号化)
SMTPS  = 465  # メール送信(暗号化)
IMAPS  = 993  # メール受信(暗号化)
POPS   = 995  # メール受信(暗号化)

ネットワークサービス

サーバでは、クライアントからの接続の受信を待つために、あらかじめプログラムを起動しておく必要がある。
こういうサーバプログラムは、Linux の世界では デーモン と呼ぶことも多い。

ネットワークサービスを起動する方式には、いくつかの方法がある。

スーパーサーバを使う場合

ネットワーク処理のプログラムは、複雑な処理を行うためそのプログラムを起動しておくと、メモリを大量に使用する。古いコンピュータでは、処理速度の低下となるため、利用頻度の低いサーバは、汎用的なサーバを起動しておき、必要に応じてプログラムを起動する。この方法には、inetd とか xinetd が用いられる。

$ vi /etc/inetd.conf
echo stream tcp nowait tsaitoh コマンド名

上記の例では、echo=7番ポート に tcp で接続すると、ユーザ名 tsaitoh の権限で、コマンド名を実行してくれる。

デーモンを起動しておく場合

Linux では ランレベル という状態が決められている。

  • シングルユーザモード(S) – 管理者が作業中で他のネットワーク接続とかを受け付けない状態
  • システム停止(0) – 他の状態からシステム停止に移るための仮想的なランレベル
  • マルチユーザモード(2) – 複数のユーザの接続ができる状態
  • GUI環境付きのマルチユーザモード(5) – X11ディスプレイマネージャが動く状態
((( /etc/inittab の中に以下の記載がある )))
$ cat /etc/inittab
:
# The default runlevel.
id:2:initdefault:
:

$ runlevel   # 現在のランレベルを確認する方法
N 5

sysv-rc 方式

Linux では、ランレベルを変更する init コマンド(init 0 を実行すると、システムを停止できる)を実行すると、

  • /etc/rc移行元ランレベル.d 配下のKで始まるプログラムをファイル名順に実行する。
  • /etc/rc移行先ランレベル.d 配下のSで始まるプログラムをファイル名順に実行する。
$ ls /etc/rc2.d
K01aprx                         S17sudo
K01onedrive                     S17unattended-upgrades
README                          S17uuidd
S01lvm2-lvmpolld                S18acpid
S01pulseaudio-enable-autospawn  S18amavis
S14nfs-common

$ sudo /etc/init.d/apache2 start   # apache2のサーバ起動
$ sudo /etc/init.d/apache2 stop    # 停止
$ sudo /etc/init.d/apache2 restart # 再起動

systemd 方式

上記の sysv-rc 方式は、プログラムの起動スクリプトが shell で書かれているので、(システムが単純な頃は)メンテナンスが容易だったが、(システムが複雑になると)起動処理に時間がかかるのが問題となった。このため、新しい Linux では、systemd というプログラムでサーバを起動する方式にかわった。

$ ls /etc/systemd
journald.conf  network        pstore.conf    sleep.conf  system.conf     user
logind.conf    networkd.conf  resolved.conf  system      timesyncd.conf  user.conf

$ sudo systemctl list-units        # systemd のユニット一覧

$ sudo systemctl list-sockets      # 使用中のソケット一覧

$ sudo systemctl status apache2    # systemd で起動している特定のサーバの状態確認

$ sudo systemctl start   apache2   # systemd でサーバ起動
$ sudo systemctl stop    apache2   # systemd でサーバ停止
$ sudo systemctl restart apache2   # systemd でサーバ再起動

起動中のプログラムの確認

システムが通常状態で起動しているプログラムを確認するには、ps ax を用いる。

$ ps ax    # a 全プロセス表示 x 端末を持たないプロセスも表示
    PID TTY      STAT   TIME COMMAND
      1 ?        Ss     2:57 /sbin/init
      2 ?        S      0:00 [kthreadd]
      :
2229038 ?        S      0:03 /usr/sbin/apache2 -k start
      :

PIDがプロセス番号、STATは、S:処理待ち状態、R:実行状態、TIME欄は、のべ実行時間を表す。

各プロセスの親プロセスと子プロセスの関係が知りたい場合には、pstree コマンドを用いる。

$ pstree
systemd-+-/usr/sbin/amavi---2*[/usr/sbin/amavi]
        |-/usr/sbin/apach---11*[/usr/sbin/apach]
        |-ModemManager---2*[{ModemManager}]
        |-NetworkManager---2*[{NetworkManager}]

ここで、見たことのないプログラムが動いている様なら、システムの進入を受けた可能性を疑わないといけない。

ネットワーク通信で受信待ちのプログラムの確認

Linuxで開いているポートを確認するためには、netstat コマンドを用いる。

$ sudo netstat -ltup4
  # -l Listenポート、-t TCP、-u UDP、-p ポートを開いている、-4 IPv4
稼働中のインターネット接続 (サーバのみ)
Proto 受信-Q 送信-Q 内部アドレス     外部アドレス  状態        PID/Program name    
tcp       0     0 localhost:3551  0.0.0.0:*  LISTEN      841/apcupsd         
tcp       0     0 0.0.0.0:imaps   0.0.0.0:*  LISTEN      418280/dovecot  
:

nmap でポートスキャン

netstat コマンドは、対象コンピュータを使っている時には有効だが、他のコンピュータを調べるには、ポートスキャン専用の nmap を使うのが一般的。
ポートスキャンとは、相手のコンピュータに接続するポート番号を変更しながら、通信可能か調べること。

$ sudo nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2020-02-17 14:45 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000090s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 982 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
25/tcp    open  smtp
:

nmap で調べるための様々なオプション

$ sudo nmap -A localhost  # OSなどを調べる

$ sudo nmap -p 1-1023 localhost # 1〜1023 までのポート番号を調べる

$ sudo nmap -sU localhost  # UDPのポートスキャン

$ sudo nmap -O localhost   # OSの検出

攻撃を受けているのであれば、wireshark などのパケットキャプチャを使って、パケットの中身を調べる必要がある。