1. 概要

このチュートリアルでは、SSHセッションに接続しているときにクライアントのIPアドレスを見つけるいくつかのシナリオを確認します。

2. 問題の紹介

SSHセッションを介してリモートマシンに接続する場合、セッションを切断せずにクライアントのIPを検索したい場合があります。

セッションを閉じると、バックグラウンドで実行されているプロセスが中断されたり、作業中のディレクトリや変数に格納されている情報などの情報が失われる可能性があります。

次のシナリオでは、セッションを閉じずに、リモートセッションからクライアントIPアドレスを取得する方法を説明します。

3. whoおよびwコマンド

whoコマンドは、ログインデータベースファイル(デフォルトでは / var / run /utmpまたは/var / log / wtmp )を解析し、有用な情報を取得するツールです。ログオンしているユーザーに関する情報:

user1$ who
user1  pts/0 2020-12-25  05:19  (189.137.157.229)
ale    pts/1 2020-12-25  05:20  (189.249.25.155)
...

ここで、クライアントIP アドレスは、レジストリの最後のフィールドです。

さらに、パラメーター amおよびi:を使用してユーザーを指定できます。

user1$ who am i
user1  pts/0  2020-12-25 05:19 (189.137.157.229)

wコマンドは、 / var / run / utmp ファイルを解析して現在ログオンしているユーザーを表示し、 /procファイルを解析してユーザー:

user1$ w
05:35:08 up 1450 days, 7:07, 1 user, load average: 0.00, 0.01, 0.05
USER   TTY    FROM             LOGIN@  IDLE   JCPU   PCPU   WHAT
user1  pts/0  189.137.157.229  05:19   0.00s  0.03s  0.00s  w
ale    pts/1  189.249.25.155   05:20   0.00s  0.03s  0.00s  -bash
...

このシナリオでは、クライアントIPアドレスは3番目の列にあります。

4. fingerおよびpinkyコマンド

fingerおよびpinkyコマンドは、システムにログオンしているユーザーに関する同様の情報を表示します。

user1$ finger
Login  Name  Tty   Idle  Login Time    Office             Office Phone
user1        pts/0       Dec 25 06:04  (189.137.157.229)

user1$ pinky
Login  Name  TTY    Idle  When              Where
user1        pts/0        2020-12-25 06:04  189.137.157.229

2つのコマンドのいずれかを使用すると、最後のフィールドにクライアントのIPアドレスが表示されます。

5. lastコマンド

lastコマンドは、デフォルトで / var / log / wtmp ファイルを解析してファイルが作成されてから、最後にログインしたユーザーのリストを表示します。

このコマンドの結果をheadコマンドにパイプして、最後にログオンしたユーザーの情報のみを取得してみましょう。

user1$ last | head
user1  pts/0  189.137.157.229  Fri Dec 25 06:29   still logged in
ale    pts/1  189.249.25.155   Fri Dec 25 06:19 - 06:20 (00:00)
...

ここで、3番目のフィールドにクライアントのIPアドレスが表示されます。

6. netstatおよびssコマンド

netstatssは、ソケットを使用してプロセスに関する情報を取得する2つの非常に便利なツールです。

grepでフィルタリングされたnetstatを使用して、クライアントのIPアドレスを取得しましょう。

user1$ sudo netstat -tpn | grep "ESTABLISHED.*sshd"
tcp  0  60  10.128.0.2:22  189.137.157.229:18068  ESTABLISHED  29446/sshd: user1 [pr
...

ここ、 5番目のフィールドにクライアントIPアドレスが次の形式で表示されます

netstatパラメーターを詳しく見てみましょう。

  • -t は、TCPプロトコルを使用するソケットのみを一覧表示します
  • -p は、ソケットを使用するプログラムのプロセスIDと名前を表示します
  • -nはアドレスを数値で表示します

grep パターンを使用すると、接続が確立されたsshdデーモンを使用してプロセスのみをフィルタリングできます。

ssnetstatと同じように使用してみましょう。

user1$ sudo ss -tp | grep "ESTAB.*sshd"
ESTAB  0  92  10.128.0.2:ssh  189.137.157.229:18068  users:(("sshd",pid=29863,fd=3),("sshd",pid=29861,fd=3))
...

ここ、 5番目のフィールドにIPアドレスが次の形式で表示されます

ssコマンドで使用されるパラメーターをもう一度見てみましょう。

  • -tはTCPソケットを表示します
  • -p は、ソケットを使用するプロセスを示します

grep コマンドを使用して、netstatの例と同じ方法でフィルタリングしました。

netstat は非推奨であるため、ssツールを使用する必要があります。

7. lsofコマンド

もう1つの強力なツールは、lsofコマンドです。 このコマンドは「開いているファイルのリスト」の略です。

このプログラムを使用することにより、開いているファイルとそれらを使用しているプロセスに関する情報を取得できます。 ファイルはソケットになる可能性があるため、それを使用して接続情報を見つけることができます

user1$ sudo lsof -i TCP -s tcp:established -n | grep ssh
sshd  29448  user1  3u  IPv4  63825743  0t0  TCP  10.128.0.2:22->189.137.157.229:18068 (ESTABLISHED)
...

ここでは、9番目のフィールドにクライアントのIPアドレスが次の形式で表示されます。 ->

それでは、lsofパラメーターを確認しましょう。

  • -i TCP は、TCPプロトコルを使用してファイルを選択します
  • -s tcp:established は、「tcp」状態が「established」のネットワークファイルのみを一覧表示します
  • -n は、lsofがネットワーク番号をホスト名に変換するのを防ぎます。 これにより、数値のIPアドレスを確認できます

8. 結論

このチュートリアルでは、SSHセッション中にクライアントのIPアドレスを取得するためのいくつかの戦略を確認しました。

who w finger pinky last netstat[を使用しましたX100X]、 ss 、およびlsofコマンド。