在排查网络故障时常遇到对方给出的 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 decodelistening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes12:31:28.108613 IP 10.10.1.12 > 10.10.1.11: ICMP echo request, id 655, seq 0, length 6412:31:28.108655 IP 10.10.1.11 > 10.10.1.12: ICMP echo reply, id 655, seq 0, length 6412:31:29.113509 IP 10.10.1.12 > 10.10.1.11: ICMP echo request, id 655, seq 1, length 6412: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