在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 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命令
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
使用这两个命令中的任何一个,我们都可以在最后一个字段中看到客户端 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命令
netstat 和ss 是两个非常有用的工具,它们使用套接字检索有关进程的信息。
让我们使用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地址