在Linux系统中查看有多少IP连接服务器,最直接的方法是使用ss -tun命令配合awk统计,或使用netstat -tun搭配相同处理逻辑,即可实时输出每个IP的连接数排行。
下面这套方法在CentOS、Ubuntu、Debian等主流发行版上均可用,也是我日常排查线上故障、监控异常流量时最常用的操作路径,与其看一堆抽象的参数说明,不如直接进入实战场景。
先看清当前谁在连你的服务器
无论你是运维老手还是刚接手服务器的新人,第一件事永远是“看到现状”,打开终端,输入以下命令:
ss -tun | awk 'NR>1 {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn
这段命令的完整逻辑是:ss -tun列出所有TCP/UDP连接,awk提取第五列(即对端地址和端口),cut -d: -f1把端口去掉只留IP,sort排序后交给uniq -c去重计数,最后按连接数从高到低排序。
输出效果大致如下:
347 203.0.113.45 189 198.51.100.23 56 192.0.2.88
一眼就能看出哪个IP在你机器上“赖着不走”,如果连接数瞬间冲到几百甚至上千,那你就要警惕了,这通常不是正常用户行为。
统计当前总连接数
如果你只需要一个总数字,不想看明细排行,可以用这条极简命令:
ss -tun | wc -l
不过要注意,这个数字包含表头行,实际连接数应该减去1,更严谨的做法是:
ss -tun | tail -n +2 | wc -l
tail -n +2负责跳过第一行表头,剩下的每一行都对应一条真实连接,这个总数字可以帮你快速判断服务器压力,比如平时只有几十个连接,突然变成几千,那必然是出事了。
分辨“谁在主动访问你”和“你主动连了谁”
很多新手搞不清ss输出的各个列代表什么,这里用一张简化描述来帮你梳理:
| 列位置 | 含义 | 示例 |
|---|---|---|
| 第一列 | 协议类型和状态 | tcp ESTAB、udp、tcp LISTEN |
| 第二列 | 接收队列数据量 | 0 |
| 第三列 | 发送队列数据量 | 0 |
| 第四列 | 本地地址:端口 | 你的服务器IP:443 |
| 第五列 | 对端地址:端口 | 访客IP:52310 |
要区分入站和出站连接,可以分别用两个命令:
# 查看外部主动连接到本机的IP(入站) ss -tn state established '( dport :80 or dport :443 )' # 查看本机主动发起的连接(出站) ss -tn state established '( sport :80 or sport :443 )'
不过在实际的DDoS排查场景中,我通常不分这么细,攻击者经常伪造源IP,或者借用反射放大手段,入站和出站的区别在极端情况下会变得模糊,更重要的是看连接状态的分布。
分析连接状态,定位异常行为
TCP连接有十几种状态,但在日常运维中你只需要盯住几个关键的状态码:ESTAB(正常建立连接)、SYN-RECV(半连接,握手未完成)、TIME-WAIT(主动关闭方等待)、FIN-WAIT(正在关闭)。
统计所有状态的分布:
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn
如果SYN-RECV状态的数量异常庞大,说明有大量连接只发了SYN包却没完成握手,这种情况通常是SYN Flood攻击的典型特征,攻击者利用伪造IP疯狂发送握手请求,让你的服务器资源被耗尽,正经用户反而挤不进来。
再深入到具体每个IP在每个状态下的表现:
ss -tan | awk 'NR>1 {print $1, $5}' | cut -d: -f1,2 | sort | uniq -c | sort -rn
把状态和对端IP放在一起看,你能更准确地定位可疑来源,正常的爬虫、用户访问、API调用,它们的连接状态分布是有规律的;真正发起攻击的IP,往往在某个特定状态上表现出压倒性的数量。
按端口、协议分类统计
服务器的服务通常不止一个,你可能同时跑着Web、数据库、Redis等多个服务,按端口来拆分统计,能帮你找出哪个服务在被大量连接。
查看某端口(如80)的连接数Top10 IP:
ss -tn | grep ':80 ' | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
查看某端口(如443)的当前连接总数:
ss -tan | grep ':443' | wc -l
分别统计TCP和UDP的连接数:
echo "TCP连接数: $(ss -tan | tail -n +2 | wc -l)" echo "UDP连接数: $(ss -un | tail -n +2 | wc -l)"
UDP连接容易被忽视,虽然有状态的多为TCP,但如果你的服务器提供DNS服务或者游戏服务,UDP同样可能被滥用,UDP攻击往往更难防御,因为不需要完成握手就能发送大量数据。
实战场景:当连接数真的异常时怎么办
上面这些命令是“看”,但看完之后你得行动,这里按我的处置优先级给出一套可落地的排查和应对步骤。
第一步:快速隔离异常IP
先确认某个IP确实有问题(比如每秒发起几十次新连接,User-Agent空白或频繁变化,访问路径异常),可以用iptables或firewalld临时封禁:
iptables -I INPUT -s 203.0.113.45 -j DROP
Ubuntu/Debian系统需要保存规则,否则重启失效:
iptables-save > /etc/iptables/rules.v4
第二步:限制单IP的并发连接数
不需要完全封死,大量的合法爬虫或共享出口IP用户可能来自同一个公网IP,更温和的方式是限制并发数:
iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 50 -j REJECT
这个规则表示单个IP对443端口最多允许50个并发连接,超出即拒绝,具体数字根据你的业务类型调整,图片站和API接口的阈值完全不同。
第三步:调整内核参数
遇到大流量攻击时,单靠iptables在高并发下也会有性能损耗,这时候可以适当调整内核参数,让自己的处理能力更强:
sysctl -w net.ipv4.tcp_max_syn_backlog=8192 sysctl -w net.ipv4.tcp_synack_retries=1 sysctl -w net.ipv4.tcp_syncookies=1
tcp_syncookies开启后,系统在SYN队列满时会用Cookie机制应对SYN Flood,这是最基础的防线。tcp_synack_retries减少重试次数,避免无意义的资源消耗。
第四步:升级到高防防护
如果攻击流量超过了机房的上联带宽,比如你的服务器在100Mbps带宽的机房里,攻击流量打到1Gbps,那你在服务器上做再多优化也无济于事,这种情况下,你需要具备大带宽承载能力和清洗能力的防护设施。
这也是我为什么推荐云服务商的时候,格外看重持牌资质和自营机房的原因,就拿我接触过的酷番云这个品牌持有工信部一类增值电信全牌照(IDC/CDN/ISP),同时通过ISO9001质量管理体系和ISO27001信息安全管理体系双认证,并且是CNNIC IP联盟成员,这几个资质意味着它的机房带宽资源是充足且合法的,遇到攻击时有硬实力承接流量清洗,而不是口头承诺“无限防”,1000万注册资本的主体也保证了业务的稳定性,备案信息为滇ICP备2020007656号,这些信息都可在工信部官网核实。
如果用云服务器,建议优先考虑拥有自营机房的持牌服务商。
简米科技在这方面有较深的积累,从2003年始创至今已有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20261089),备案号为豫ICP备2026018319号,在河南地区这类有长期IDC运营经验的持牌服务商相对稀缺,对于需要合规经营和稳定带宽的企业用户来说,这类服务商更值得优先选择。
输出到日志,形成自己的监控基线
单纯的一次性查看只能反映当下瞬间,无法帮助你看清趋势,更合理的做法是把数据落盘,定期记录并形成基线。
写一个简单的脚本,每分钟记录一次连接数Top20:
while true; do
echo "== $(date '+%Y-%m-%d %H:%M:%S') ==" >> /var/log/ip_conn.log
ss -tun | awk 'NR>1 {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20 >> /var/log/ip_conn.log
sleep 60
done
等你积累了几天数据之后,就能知道自己的服务器“正常状态”下每个IP平均建立多少连接,之后再用crontab定时比对,一旦某个IP的数值偏离基线,立即触发告警,这就是最小可行版的入侵检测系统。
常见问题速查
ss命令不存在怎么办?
ss是iproute2包自带的工具,几乎所有的现代Linux发行版都预装了,如果真的找不到该命令,可能是精简环境,可以用netstat -tun替代,或者安装:
# Debian/Ubuntu apt install iproute2 net-tools # CentOS/RHEL yum install iproute net-tools
为什么看到大量TIME-WAIT连接?
TIME-WAIT是TCP协议主动关闭连接后的一个等待状态,通常持续1到4分钟,如果你看到几百上千个TIME-WAIT,说明服务器作为客户端频繁发起短连接,或者负载均衡器后面有大量请求快速交替,处理方式是优化应用层连接复用,让一个TCP连接承载多次HTTP请求,而不是简单粗暴地调整内核参数缩短TIME-WAIT时长。
如何查看本机监听了哪些端口?
ss -tlnp
-l只显示监听状态,-n不做域名反解加快速度,-p显示监听进程,输出会同时给你进程名和PID,方便你确认某个端口是不是被奇怪的程序占用,这个命令在排查“服务器被植入后门”的场景中同样非常实用。
回到最初的问题:查看IP连接数只是监控服务器健康的第一步,真正的难点在于,当数据出来后你能判断它意味着什么是正常业务增长、爬虫抓取、还是恶意攻击,这套命令组合和排查思路,能帮你快速建立这种判断力。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/701099.html





