获取访问 IP 的几种方式

 

2021-01-10

在排查网络故障时常遇到对方给出的 IP 并非实际访问 IP(比如 SNAT ),这时往往只能被动的等待,其实只要一些简单的方法便可以知道对方的访问 IP。

通过 tcpdump

tcpdump是 Linux 的抓包工具,可以获取所有经过网络接口的数据信息,其中就包括 ICMP:

Terminal window
1
# 安装,以 CentOS 7 为例
2
yum install -y tcpdump
3
# 运行,抓取网络接口 eth0 的数据
4
tcpdump -i eth0 icmp

然后让客户侧 ping 服务端的 IP 地址,服务端便会显示捕获的数据,其中就包含 IP:

Terminal window
1
tcpdump -i eth0 icmp
2
3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
4
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
5
12:31:28.108613 IP 10.10.1.12 > 10.10.1.11: ICMP echo request, id 655, seq 0, length 64
6
12:31:28.108655 IP 10.10.1.11 > 10.10.1.12: ICMP echo reply, id 655, seq 0, length 64
7
12:31:29.113509 IP 10.10.1.12 > 10.10.1.11: ICMP echo request, id 655, seq 1, length 64
8
12:31:29.113554 IP 10.10.1.11 > 10.10.1.12: ICMP echo reply, id 655, seq 1, length 64

参数说明:

  • -i:指定监听网卡为 eth0;
  • icmp:指定协议为 icmp

通过 telnet

telnet 对双方来说应该是最便捷的一种方式,只要让客户侧 telnet 指定端口即可:

Terminal window
1
# 这里以 80 为例
2
telnet 10.10.1.11 80

然后在服务端运行:

Terminal window
1
netstat -nat | grep ESTABLISHED

便可以在其中找到一条数据:

Terminal window
1
tcp 0 0 10.10.1.11:80 10.10.1.12:2540 ESTABLISHED

通过 ssh

类似 telnet,只要发起 ssh 请求,无需输入密码便能在服务端看到请求的实际 IP:

Terminal window
1
# grep 也可以用 ssh 端口和进程
2
netstat -anp | grep ESTABLISHED

还有一种情况时连接 ssh 后,想查看当前连接 IP,此时可以通过 Linux 内置命令查看:

Terminal window
1
last | head