Contents

在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地址是注册表的最后一个字段

此外,我们可以使用参数ami 指定我们的用户:

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             itcodingman@blogdemo  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 地址位于第三列

4. finger 和pinky命令

fingerpinky 命令显示有关登录系统的用户的类似信息:

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

使用这两个命令中的任何一个,我们都可以在最后一个字段中看到客户端 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)
...

在这里,我们可以在第三个字段中看到客户端 IP 地址

6. netstat 和ss命令

netstatss 是两个非常有用的工具,它们使用套接字检索有关进程的信息。

让我们使用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
...

在这里,我们在client IP address:client port格式的第 5 个字段中看到客户端 IP 地址。

让我们仔细看看netstat参数:

  • -t 仅列出使用 TCP 协议的套接字
  • -p 显示使用套接字的程序的进程id和名称
  • -n 以数字方式显示地址

grep模式允许我们仅过滤使用已建立连接的 sshd 守护进程的进程。

让我们以与netstat类似的方式使用ss

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))
...

在这里,我们可以看到格式为client IP address:client port的第 5 个字段中的 IP 地址。

我们再看一下ss命令中用到的参数:

  • -t显示 TCP 套接字
  • -p 显示使用套接字的进程

我们使用grep命令以与netstat示例中相同的方式进行过滤。

由于不推荐使用netstat我们应该使用ss工具

7. lsof命令

另一个强大的工具是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 地址,格式为server IP address:server port->client IP address:client port

现在,让我们回顾一下lsof参数:

  • -i TCP 使用 TCP 协议选择文件
  • -s tcp:  builted 仅列出具有“tcp”状态“已建立”的网络文件
  • -n 防止lsof将网络号转换为主机名。通过这个,我们可以看到数字IP地址