SSHセッションでクライアントのIPアドレスを見つける
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コマンド
netstatとssは、ソケットを使用してプロセスに関する情報を取得する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デーモンを使用してプロセスのみをフィルタリングできます。
ssをnetstatと同じように使用してみましょう。
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 、