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

通过 tcpdump

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

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

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

tcpdump -i eth0 icmp

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:31:28.108613 IP 10.10.1.12 > 10.10.1.11: ICMP echo request, id 655, seq 0, length 64
12:31:28.108655 IP 10.10.1.11 > 10.10.1.12: ICMP echo reply, id 655, seq 0, length 64
12:31:29.113509 IP 10.10.1.12 > 10.10.1.11: ICMP echo request, id 655, seq 1, length 64
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 指定端口即可:

# 这里以 80 为例
telnet 10.10.1.11 80

然后在服务端运行:

netstat -nat | grep ESTABLISHED

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

tcp        0      0 10.10.1.11:80        10.10.1.12:2540        ESTABLISHED

通过 ssh

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

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

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

last | head