如何使用tcpdump获取所有连接的网站/服务器外部IP地址?及替代工具咨询
嘿,我来帮你搞定这个问题!你的思路是对的,但当前脚本确实有几个可以优化的地方,我一步步给你拆解:
先说说你当前脚本的问题
你用host "$myip"作为tcpdump的过滤规则,会捕获所有和本机IP相关的流量——这包括局域网内的设备(比如路由器、家里的其他电脑),这些都是私有IP,所以你看到的大多是内部地址。另外每次循环只抓1个包,不仅效率低,还容易漏掉很多连接。
改进后的tcpdump脚本
我调整了过滤规则,帮你只捕获公网IP的连接,同时去掉冗余信息、自动去重:
#!/bin/bash # 用ip addr获取本机IP(比ifconfig更可靠,Ubuntu新版默认没装ifconfig) myip=$(ip addr show wlp2s0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}') # 定义要排除的私有IP段(这些都是内部网络地址) private_nets="10.0.0.0/8 or 172.16.0.0/12 or 192.168.0.0/16 or 127.0.0.0/8" # 持续捕获公网流量,逐行处理输出 sudo tcpdump -nn -q -t host "$myip" and not net $private_nets | while read -r line; do # 提取所有IP,过滤掉本机IP,去重后写入文件 echo "$line" | grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' | grep -v "$myip" | sort -u >> IPaddress.txt done
关键改进点:
ip addr替代ifconfig:Ubuntu新版本默认没有ifconfig,ip addr是更现代的工具,兼容性更好。- 排除私有IP段:用
not net $private_nets过滤掉局域网和回环地址,只保留公网IP。 - 简化tcpdump输出:
-nn不解析IP到域名(避免延迟),-q精简输出内容,-t去掉时间戳,方便后续提取IP。 - 自动去重:
sort -u确保同一个IP不会重复写入文件,让结果更干净。
更高效的替代工具
如果只是想获取当前已建立的外部连接IP,tcpdump其实不是最方便的——这些工具更适合:
ss(推荐):Linux自带的套接字查看工具,快速列出活跃的公网连接:
ss -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | grep -vE '^(10\.|172\.1[6-9]\.|172\.2[0-9]\.|172\.3[0-1]\.|192\.168\.|127\.)' | sort -u这个命令直接提取所有已建立TCP/UDP连接的对端公网IP,自动去重,几秒钟就能出结果。
iftop:实时流量监控工具,安装后运行
sudo iftop,可以直观看到每个外部IP的流量情况,界面友好,适合实时观察。netstat:和ss功能类似,是传统的连接查看工具,命令如下:
netstat -ntu | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | grep -vE '^(10\.|172\.1[6-9]\.|172\.2[0-9]\.|172\.3[0-1]\.|192\.168\.|127\.)' | sort -u
补充小知识
- tcpdump的核心是监听网卡的所有数据包,然后根据你设置的规则过滤出符合条件的包。它能看到所有进出网卡的流量,所以必须通过规则排除掉内部IP才能得到外部连接。
- 如果想给IP加上对应的域名,可以用反向解析:
for ip in $(cat IPaddress.txt); do host $ip; done,不过有些公网IP没有绑定域名,可能会解析失败。
内容的提问来源于stack exchange,提问作者Silver Wolf2r




