Linux服务器查看连接了哪些机器:从命令到实战
想知道你的Linux服务器上都有谁连过、正在连、试图连,核心答案是掌握ss、netstat、who、last这几个命令,并学会组合使用它们。 这不仅是排查安全问题的基本功,也是日常运维中判断服务状态、定位异常流量的第一道门槛,本文会直接给你能用的命令和判断思路,不讲虚的。
先分清你“看”的是什么连接
很多新手在服务器上敲完命令,看到一大堆IP直接懵了,连接分两种,你得先搞清楚自己到底要查什么。
- 当前活跃连接:指此时此刻,正有哪台机器的IP和你的服务器保持着TCP连接,比如用户正在访问你的网站,或者有人正在暴力破解你的SSH。
- 历史登录记录:指过去某个时间点,哪些IP成功登录过你的系统,这通常用于事后溯源,看是不是有陌生IP进来过。
业内专家指出,绝大多数服务器被入侵,都发生在管理员“看不见”的连接上,先看“当前”,再查“历史”,这个顺序别搞反。
查看当前活跃连接:两个核心命令
这是你日常用得最多的操作。netstat是老牌工具,但性能一般,且在新版Linux上可能需要额外安装。ss命令是netstat的现代替代品,速度快,信息全,是首选。
用ss命令查看所有连接
直接输入ss -tunap,拆解一下这几个参数:
-t:只看TCP协议,这是绝大多数应用用的协议。-u:也看UDP协议,比如DNS查询、视频流。-n:不解析主机名,直接显示IP地址,加了这个参数,命令执行速度会快很多,否则它会尝试反查DNS,卡半天。-a:显示所有状态的连接,包括监听(LISTEN)和已建立(ESTAB)。-p:显示是哪个进程(PID和程序名)在占用这个连接。这个参数非常关键,能帮你定位是Apache、MySQL还是某个可疑进程在通信。
执行后,你会看到类似这样的输出:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.168.1.10:22 203.0.113.5:52340 users:(sshd) ESTAB 0 0 192.168.1.10:80 198.51.100.2:61234 users:(nginx)
重点看Peer Address列,这就是连过来的机器IP。 如果看到一堆来自陌生国外IP的ESTAB连接且指向你的22端口,别犹豫,大概率是在被扫描或爆破。
用netstat命令兜底
有些老系统或者精简环境里可能没装ss,这时候用netstat -tunap,参数含义和ss类似,但输出格式略有不同,Foreign Address那一列就是对方IP。行业共识是,netstat因为遍历/proc/net文件系统,在高连接数(比如上万并发)下会非常卡,所以生产环境推荐用ss。
如何快速定位“谁在搞我”:场景化排查
光看命令输出还不够,你得知道怎么看懂这些数字代表什么威胁,这里给你几个实战场景。
发现大量SYN_RECV状态
如果ss -t state syn-recv输出很长,说明有机器在跟你“握手”握了一半就不动了。这极有可能是SYN Flood攻击,黑客伪造大量不存在的IP发起连接,把你的半连接队列塞满,导致正常用户进不来,这时候你查Peer Address会发现IP全是乱的、重复的,且无法Ping通。
SSH端口被爆破
执行ss -tn state established '( dport = :22 or sport = :22 )',只看22端口的连接,如果发现同一个IP在短时间内建立了多个连接,或者连接状态一直在变,那基本可以断定是字典在爆破你密码。应对策略不是手动封IP,而是立刻安装fail2ban,它会自动读取日志并封禁这些IP。
服务器主动向外连
服务器被入侵后会变成“肉鸡”,主动向外发送请求,这时候看ss -tnp,如果发现有进程(比如curl、wget或者奇怪的二进制名)在向非本机业务端口的IP发起ESTAB连接,要立刻警觉。 用ss -tnp | grep -v ':22|:80|:443'过滤掉正常端口,剩下的就是嫌疑对象。
查看历史登录记录:溯源与审计
当前连接是“现在时”,历史记录是“过去时”,排查入侵痕迹,这步不能少。
用last命令查看成功登录记录
last命令读取/var/log/wtmp文件,显示所有成功登录的用户、IP和时间,这是最直接的证据。
last -n 20
输出会显示pts/0(终端类型)、登录IP、时间。如果你发现某个IP在凌晨3点登录了你的root账号,而你当时在睡觉,那基本可以宣告服务器沦陷了。
用lastb命令查看失败登录记录
lastb读取/var/log/btmp,显示所有登录失败的尝试,这个文件经常被黑客清理,所以发现lastb报错说文件不存在,本身就是一个危险信号,说明攻击者已经具备修改日志的权限了。
实时监控新连接
都是事后查看,如果你想实时知道“谁连上了,可以用:
watch -n 1 'ss -tnp | grep ESTAB'
这条命令每一秒刷新一次当前连接,适合在排查故障时盯着屏幕看。
深入理解:内网IP和外网IP的区别
很多新手在查看连接时,看到一个168.x.x或x.x.x的IP就以为是内网攻击。这里有个常见误区:如果服务器部署在公网,但开启了NAT转发或者反代,那么看到的Peer Address可能是内网网关地址,而非真实用户IP。
- 如果你的服务器是单机公网IP,那
Peer Address显示的就是真实的公网客户端IP。 - 如果你的服务器前面有负载均衡器(SLB)或CDN,那所有连接都来自负载均衡器的内网IP,真实用户IP在HTTP头部的
X-Forwarded-For里。这时候你去查ss命令没意义,得去查Web服务器日志。
行业共识认为,排查连接问题前,先确认网络架构,否则你可能会对着一个内网IP查半天,结果发现是自家机房的路由器。
实用技巧:如何快速统计连接数量
想知道是不是有大量机器连过来,可以用awk管道命令统计。
ss -tn | awk '{print $5}' | sort | uniq -c | sort -rn
这条命令的作用是:列出所有TCP连接的对方IP,去重后按连接数排序。输出结果第一行就是连接数最多的IP。 如果第一名有几百个连接,而第二名只有几个,那这个第一名基本就是恶意来源,正常用户不会闲得没事用同一个IP开几百个TCP连接。
常见问题排查:为什么我查不到连接?
有时候你明明感觉服务器很卡,但ss命令查出来连接数很少,这可能是以下原因:
- 连接池复用:应用层(如Java的HTTP连接池)会复用TCP连接,表面上连接少,但QPS很高,这时候要结合
top命令看CPU占用。 - UDP连接:
ss -t只看TCP,如果走的是UDP协议(比如游戏服务器),要用ss -u。 - 权限不足:普通用户执行
ss -p看不到进程名,必须用sudo。如果ss输出里Process列全是空,说明你权限不够。
最后说一句:查看连接是防御的第一步,但更重要的是建立监控习惯。 建议把ss -tn state established和last -n 5写进你的每日巡检脚本里,用crontab定时执行并输出到日志文件,这样即使当时没发现异常,事后也能追溯。
Q&A:关于查看连接的常见疑问
为什么netstat显示连接数比ss少?
因为netstat默认不显示TIME_WAIT状态的连接,而ss默认全显示。TIME_WAIT是TCP断开后的残留状态,大量出现说明有短连接频繁建立和断开。通常不影响业务,但如果你用netstat -tunap看,会觉得服务器很干净。
如何区分正常爬虫和恶意扫描?
正常搜索引擎爬虫(如百度蜘蛛)的IP段是固定的,且会请求robots.txt,恶意扫描IP通常随机分布,且请求路径多为/wp-admin、/phpmyadmin等敏感目录。最简单的办法:用ss查出IP后,用whois命令查一下归属地,如果是云服务商(简米云、酷番云、AWS)的弹性IP,且行为异常,基本可以判定为恶意。
看到TIME_WAIT连接很多需要处理吗?
在Linux默认配置下,TIME_WAIT会持续60秒,如果量非常大(比如上万),会导致端口被占用。对于高并发Web服务器,可以开启net.ipv4.tcp_tw_reuse = 1和net.ipv4.tcp_tw_recycle = 0来优化,但注意tcp_tw_recycle在NAT环境下会引发问题,慎用。 大多数情况下,这属于内核参数调优范畴,业务不卡就不用管。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/725831.html





