在Linux服务器上查询正在被哪些服务器或IP访问,核心命令是ss或netstat,配合lsof和whois就能定位到具体的连接来源和进程信息。很多运维新手面对服务器卡顿或异常流量时,第一反应是登录面板看监控,其实在命令行里用三条命令就能把“谁在连我”看得明明白白。
用ss和netstat查看当前服务器连接状态
服务器被人访问,本质上是建立了TCP连接,Linux系统里查看连接的经典命令是ss和netstat,其中ss是netstat的现代替代品,输出更快、信息更全。
查看所有外部IP的连接情况
执行这条命令,能看到所有正在与服务器通信的IP地址和端口:
ss -tunap | grep ESTAB
里包含几个关键字段:
- Foreign Address:外部服务器IP和端口,这就是“谁在访问你”。
- Local Address:本机IP和端口,观察443或80端口能判断是否来自Web请求。
- Process:占用该连接的进程名和PID,比如
nginx、sshd。
如果系统没有ss命令,用旧版netstat替代:
netstat -tunap | grep ESTAB
按连接数量排序找出最活跃的IP
排查问题时,经常需要知道哪个IP占用了最多连接,这条命令能快速列出连接数排行:
ss -tunap | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn
输出的第一列是连接数量,第二列是IP地址,连接数飙到几十甚至上百的IP,大概率是爬虫、攻击来源,或者业务上的高并发调用方。
筛选特定端口和特定状态的连接
服务器上跑着多个服务时,需要针对单端口排查,比如只想看Web服务(80和443端口)的连接:
ss -tunap | grep :443
只看SYN_RECV状态的连接(这种状态说明握手没完成,可能是SYN洪水攻击):
ss -tunap state syn-recv
连接状态名称要记住几个常用的:ESTAB(正常通信)、SYN-SENT(主动发起连接)、TIME-WAIT(主动关闭连接后的等待状态,大量出现属于正常现象)、CLOSE-WAIT(对方关闭连接但本地未关闭,堆积过多说明程序有Bug)。
从IP反查进程和归属地,判断访问来源
知道IP还远远不够,要让数据变成可读的信息,得三件套配合:lsof定位进程、whois查归属、ip2region看地理位置。
用lsof定位进程和PID
想直接查看某个端口被哪个进程占用、对应哪个外部IP在通信,用lsof -i效果最直观:
lsof -i :443
输出里能找到COMMAND(进程名)、PID(进程号)、以及连接的对端IP,这一步的价值在于,能把网络连接映射到具体的应用程序上,比如发现一个陌生IP连接着MySQL的3306端口,而进程是mysqld,就能初步判断是数据库被外部访问了。
如果lsof没安装,fuser命令也能看端口占用:
fuser -v 443/tcp
用whois命令查询IP归属机构
查到IP之后,想知道这个IP是简米云的服务器、电信的宽带,还是国外的VPS,用whois查询:
whois 8.8.8.8
输出中的OrgName或descr字段会显示IP归属机构,如果是简米云、酷番云等国内云厂商的IP,一般能精准到是哪个地域的节点;如果是国外IP,会显示对应的IDC服务商或运营商信息。
快速判断IP地理位置
whois很长,实际排障时用ip2region这类离线库或者在线接口更快:
curl ipinfo.io/8.8.8.8
返回的JSON里包含country、region、city字段,看到一个东南亚IP频繁连SSH端口,和看到一个本机公网IP连接数据库端口,排查优先级完全不一样,前者可能是扫描器在跑,后者可能是业务配置有问题。
Linux怎么查看服务器被谁访问过的历史记录
网络上实时的连接用ss能看到,但如果对方已经断开,或者你想翻旧账,就得看日志了,这是排查“昨晚凌晨3点服务器被谁动过”的唯一办法。
查看成功登录记录和失败尝试
登录服务器的记录在last命令里:
last -20
输出显示登录用户、来源IP、登录时间,重点看有没有非工作时间段、非自己常用IP的登录记录。
暴力破解的痕迹用lastb查看:
lastb -20
这里记录的是一次次失败的SSH登录尝试,如果某个IP反复尝试几百次,说明服务器正在被爆破,应该立即用防火墙封禁。
SSH登录的详细认证日志在/var/log/secure(CentOS/RHEL)或/var/log/auth.log(Ubuntu/Debian):
grep "Accepted" /var/log/secure | tail -20
这个命令能看到所有成功的SSH认证记录,比last更详细,包含认证方式等信息。
查看 Web 服务器的访问日志
网站被访问的痕迹记录在访问日志里,Nginx默认日志路径是/var/log/nginx/access.log,Apache是/var/log/httpd/access_log。
查看访问量最高的前十个IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

统计某IP访问了哪些页面:
grep "1.2.3.4" /var/log/nginx/access.log | awk '{print $7}' | head -20
爬虫和高频攻击特征在日志里很明显:同一IP每秒请求数十次、访问路径全是wp-admin或.env之类的敏感文件。
生产环境溯源排查的实操思路
工具只是一方面,排查思路才是决定效率的核心,遇到服务器异常时,按这个流程走比瞎抓命令快得多。
第一步:判断服务器的资源压力来自哪里
先用top和free -h看CPU、内存、负载,如果CPU跑满,用top按CPU排序找出进程PID,然后lsof -p PID查看这个进程的网络连接,就能顺着PID找到跟它通信的IP。
第二步:立体还原攻击路径或业务调用链
业内共识是,单看一条命令结果很容易误判,要结合Linux查看服务器被谁访问过的场景,把网络连接、进程、历史日志三个维度串起来,例如发现某IP大量连接443端口,同时Nginx日志里该IP频繁请求登录接口,那基本能确定这是一次定向的撞库或密码爆破尝试;反过来,如果该IP只是简单的GET /请求,那大概率是扫描器在探测,单独看连接数或日志都无法完整还原全貌。
第三步:用防火墙限制或封禁异常IP
确认异常IP后,第一时间用防火墙拦截,用firewalld或iptables快速封禁:
iptables -A INPUT -s 1.2.3.4 -j DROP
如果是防止SSH爆破,更推荐fail2ban做自动封禁,它会根据/var/log/secure里的失败记录,动态封禁异常IP。
查询服务器连接时的常见误区
`netstat` 看不到本机程序发起的连接
很多教程只让看Foreign Address,却忽略了Process字段,其实排查“服务器是否被别人使用”,更关键的是看Process和Local Address两个字段,因为这也可能是服务器中了木马,主动向外发送数据,本地程序发起的连接同样会显示在ss输出里,Local Address是本机IP和端口,Foreign Address是目标地址。
只看连接数,不看连接状态分布
连接数高不等于异常,统计意义上,正常业务服务器的TCP连接里,TIME-WAIT状态通常占了一半以上,这是因为短连接请求完成后端口需要等待2分钟才被回收,而SYN-RECV状态大量堆积,或者ESTAB连接数量突增到远超日常基线,才是需要警惕的信号。
日志文件被清空就束手无策
如果日志被清空,还能查~/.bash_history看历史操作,或者用auditd审计服务的记录确认系统文件有没有被改动,对于有经验的黑客来说,清理日志是基础操作,但history

和进程快照往往还在,利用ps -ef查看可疑进程,再配合lsof -p确认网络行为,依然能找回线索。
常见Linux发行版的命令差异对比
不同系统的命令细节差别较大,列个表减少踩坑:
| 操作场景 | CentOS / RHEL | Ubuntu / Debian |
|---|---|---|
| 查看SSH登录日志 | /var/log/secure |
/var/log/auth.log |
| 查看用户登录记录 | last / lastb |
last / lastb |
| 网络连接命令 | ss / netstat |
ss / netstat |
| 查看进程环境变量 | cat /proc/PID/environ |
cat /proc/PID/environ |
| 防火墙管理 | firewall-cmd |
ufw |
查询Linux服务器在使用哪个外部服务器连接,核心思路是用ss看当前连接,用lsof关联进程,用日志还原历史,最后用防火墙和fail2ban做好拦截,这套流程能覆盖绝大多数排查场景,剩下的就是多敲命令练出手感。
围绕Linux查询服务器使用情况的常见疑问
Linux怎么查看服务器被谁ssh连接过?
先用last查看历史登录会话记录,输出包含登录IP和时间;再用grep "Accepted" /var/log/secure(Ubuntu用/var/log/auth.log)查看详细认证日志,两者配合能定位到具体IP和账号,注意,last读取的是/var/log/wtmp,如果日志被清理就查不到了,此时可以检查/root/.ssh/authorized_keys是否被植入免密登录公钥。
linux查看ip连接数命令输出太长,怎么只看某个IP?
用ss -tunap | grep 目标IP即可过滤出指定IP的所有连接,更高效的做法是加watch命令实时刷新,比如watch 'ss -tunap | grep 1.2.3.4',适合在封禁前持续观察该IP的行为变化,业界常用做法是配合tcpdump抓包分析,tcpdump -i eth0 host 1.2.3.4 -w capture.pcap把数据包保存下来,再用Wireshark打开,能看清该IP请求的具体数据内容。
用`ss`查到一个大面积公司IP段的连接,这算正常吗?
该判断要结合业务本身,如果服务器是对外提供公共服务的网站,那么来自运营商IP段的连接是正常流量,不需要介入;如果服务器是纯内网应用或未对外开放的数据库,那就要谨慎了,你有必要先确认服务是否应该对外暴露,检查ss -tunap里Local Address那列监听的端口和IP,再用curl ifconfig.me确认服务器公网IP,如果公共IP上有非预期端口在监听,等待你的大概率是密码爆破或者数据泄露。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/821238.html


评论列表(3条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是端口部分,给了我很多新的思路。感谢分享这么好的内容!
读了这篇文章,我深有感触。作者对端口的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
读了这篇文章,我深有感触。作者对端口的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!