要查看哪些IP在访问服务器,核心方法是登录服务器执行ss、netstat或lsof命令查看实时连接,并结合Web日志(如Nginx的access.log)分析历史访问记录。这套组合拳能帮你定位每一个来源IP,无论它是正常用户、爬虫还是攻击者,下面我直接给你能落地的操作路径。
用一行命令快速查看当前活跃连接IP
登录服务器后,最先要跑的命令是查看实时连接,多数Linux服务器默认自带ss工具,它比老款的netstat输出更快、信息更全,直接在终端敲:
ss -tunap
这个命令会列出所有TCP和UDP连接,你要重点关注ESTAB(已建立)状态的记录,每一条的0.0.1:54321这类左侧地址代表客户端来源IP和端口,右侧是服务器的监听地址和端口,实际排查时,输出结果可能包含几十行到上百行,别慌,用管道配合排序就能快速找出高频来源:
ss -tunap | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
这条组合命令会把所有连接的对端IP提取出来,统计每个IP的连接次数,按从大到小排列,前20个就是当前最活跃的访客,如果某个IP的连接数明显超出其他IP,比如它独占了几十个ESTAB连接,那它不是在做高并发采集,就是在尝试连接你的数据库端口。
连接数统计有个前提:如果你的服务器前面挂了CDN或者负载均衡,那ss看到的清一色是CDN节点的IP,真实的用户IP被伪装在HTTP头部的X-Forwarded-For字段里,这种情况下,你需要在Web应用层去取真实IP,光看系统层连接是不够的。
查历史访问记录:日志文件里有完整谱系
实时连接只能反映当前这一秒的情况,想弄清楚“昨晚凌晨三点哪个IP在扫描我”,就得翻日志。
Nginx日志的过滤技巧
默认的Nginx日志路径是/var/log/nginx/access.log,每一行记录一个请求,包含IP、时间、请求路径、状态码,直接用tail查看最后几十行,能对当前访问者有直观感受,但要分析流量来源,得结合awk来统计:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -30
这会输出访问量最大的前30个IP,排在最前面的通常有两种情况:一种是搜索引擎的抓取爬虫,另一种是某个营销活动带来的真实访客,怎么区分?看User-Agent,日志里最后一列就是它,Googlebot的UA里必然带Googlebot字样,百度的带Baiduspider,如果是空UA或者随机UA且访问路径全是/wp-login.php或.env这类敏感文件,那就是恶意扫描者。
Apache日志同样值得关注
如果你用的是Apache,日志默认在/var/log/httpd/access_log或/var/log/apache2/access.log,字段格式和Nginx相近,第一条同样是客户端IP,统计逻辑和上面完全一样,多数情况下,你只要把路径换一下,

awk命令可以直接复用。
按接入层拆解:区分直连服务器与CDN回源
很多网站已经接入了云盾、高防IP、CDN,在这种架构下,你查服务器本机的ss连接只能看到源站出口IP,真实访客的IP被层层转发链路给掩盖了,这会影响排查精度,需要分场景来看。
裸奔直连(无CDN),服务器直接暴露在公网,ss显示的就是访客真实公网IP,这种情况最好办,所有命令都能直接生效。
接入CDN但日志可记录真实IP,Nginx配合CDN回源后,如果你在Nginx配置里设置了set_real_ip_from和real_ip_header,那么日志里的$remote_addr会直接显示访客真实IP,无需额外处理,这套配置在运维界属于标准做法,行业共识认为,凡是接CDN的源站都必须开启此功能,否则日志分析等于瞎了眼。
纯粹查看源站端口的连接,有时候你只想知道443端口上有多少IP在握手,不想看乱七八糟的UDP流量,对着443端口做过滤:
netstat -tn 43 | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq
注意,如果你的系统没有netstat,先安装net-tools包,或者直接换用ss -tn state established '( dport = :443 )',效果类似。
借助可视化工具监控IP流量趋势
手动敲命令适合临时排查,但如果你的服务器常年有人访问,建议部署一个监控面板。宝塔面板的“流量监控”模块就能按IP维度统计请求数、带宽占用,图形界面直接列出TOP 50的来源IP,适合不懂命令行的同学,它的原理和ss命令一致,但胜在持续记录、历史可回溯。
更专业的方案是Prometheus + node_exporter,node_exporter默认会暴露node_network_receive_bytes_total等指标,配合Grafana的仪表盘可以做出IP级别的流量排行,但说实话,对于大多数个人站长或中小团队,宝塔的IP统计功能已经够用了它能把昨天、上周、上个月的TOP IP排行全部拉出来,还能针对每个IP看它请求了哪些具体URL,这在排查“某个IP反复下载大文件”之类的问题时非常直观。
排查异常访问的命令排序与判断标准
当你发现服务器响应变慢、带宽被打满时,需要按照特定顺序排查,我先给你一个实操顺序表:
| 排查步骤 | 命令或动作 | 预期结果 |
|---|---|---|
| 确认CPU/负载 | top |
排除系统自身问题,比如日志清理脚本卡死 |
| 查看TCP连接状态 | ss -s |
看SYN_RECV数量是否激增,判断是否有SYN洪水攻击 |
| 实时连接来源统计 | ss -tunap | awk '{print $5}' | sort | uniq -c | sort -rn | head |
找出占据绝大多数连接的IP |
| 请求日志频率分析 | tail -n 10000 access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -30 |
对比实时连接,验证攻击持久性 |
| 防火墙处置 | firewall-cmd --add-rich-rule='rule family=ipv4 source address=1.2.3.4 drop' |
封禁确认的恶意IP |
这套顺序的核心逻辑是:先确认是系统故障还是流量攻击,然后从网络层找嫌疑IP,再从应用日志层验证行为,最后做动作。切忌一上来就在防火墙封IP,可能误伤正常访客或搜索引擎抓取,多数情况下,你是先看到某个IP在短时间内发起大量请求,然后去日志里核实它到底请求了什么URL,确认是暴力破解或爬虫后才动手封禁。
验证日志行为的黄金标准是看它访问的URL分布,正常访客的URL序列是杂乱的、跳转路径贴合页面链接;恶意爬虫则集中在某个目录或某个参数上,比如遍历?id=1到?id=10000,如果同一个IP在日志里重复请求/admin、/config.php.bak这种路径,那它就是在试探漏洞。
轻量级临时封禁与常规解封策略
处理确认恶意IP的方法很多,不必一上来就动用云服务商的黑洞封禁,Linux自带的firewalld或iptables足够解决99%的问题:
# 临时封禁单个IP 10分钟(RHEL/CentOS系)
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.100 drop'
firewall-cmd --reload
# 解封时删除规则
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=192.168.1.100 drop'
firewall-cmd --reload
Debian/Ubuntu系的ufw语法稍有不同:
ufw deny from 192.168.1.100
ufw delete deny from 192.168.1.100 # 解封
封禁是即时生效的,解封也同样是秒级,遇到那种扫端口的行为,可能几秒钟内就有上百个IP轮流转,手动封IP根本来不及,这时候你就要考虑在云服务商的控制台启用DDoS高防或安全组黑白名单,行业共识认为,手工封禁适合少量IP的精准处置,大规模扫描必须靠硬件防火墙或云安全服务拦截。
安全组层面的限制同样有效,在云控制台里把安全组的入方向规则临时改成只允许你自己的IP访问SSH端口(TCP 22),其余全部拒绝,就能从网络入口拦截掉绝大多数扫描流量,这是最暴力的方式,但也是最可靠的方式,因为安全组生效在你的云主机之前,流量根本不会到达你的系统,你的服务器CPU瞬间就会安静下来。
封禁后如何确认IP确实已断连
执行封禁命令后,别急着关终端,再跑一次之前的统计命令:
ss -tunap | grep 192.168.1.100
正常情况下输出为空,说明该IP的新建连接已经进不来,但旧连接可能还会存活一会儿,因为TCP连接有超时机制,等几十秒后再看,如果还有残留连接,可以手动kill掉对应的进程PID,或者直接重启Web服务的连接池,多数情况下,防火墙DROP规则会在新连接握手阶段直接丢弃SYN包,旧的ESTAB连接会在几分钟内自然断开。
如果你用的是宝塔面板,在面板“安全”菜单里添加IP规则后,同样可以回到“监控”页面看该IP的流量是否归零,这是最直观的验证手段流量图表直接变成一条直线。
Q&A:查服务器访问IP的常见疑问
怎么查看服务器连接ip命令Linux 和Windows的区别大吗?
Linux的查看命令集中在ss、netstat、lsof这三个工具,而Windows Server通常用netstat -no或者PowerShell的Get-NetTCPConnection,Windows没有ss直接对应的命令,但netstat -no的输出格式和Linux很相似,可以看到对端IP和PID,区别主要在于管道和文本处理的语法不同,Windows需要配合findstr做过滤,比如netstat -no | findstr 443筛选端口。
服务器被大量IP访问导致卡顿,如何确定是正常流量还是攻击?
先用ss -s看系统整体连接状态,如果SYN_RECV数量异常大,说明有TCP泛洪攻击,接着用ss -tunap | awk命令统计IP连接排名,然后把排名前5的IP的请求数除以时间差得到请求速率,正常用户每秒很难超过5个请求,如果单个IP的请求速率达到每秒几十甚至上百,且UA字段缺失或拼接了脚本特征,基本可以判定为攻击行为,日志里的URL分布是决定性证据,攻击者往往集中在某个动态接口疯狂拉取数据。
nginx访问日志查看用户IP时发现全是CDN节点IP,怎么还原?
这是CDN架构下的典型问题,你需要先查看回源请求是否携带了X-Forwarded-For头信息,然后在Nginx的http块中增加配置:set_real_ip_from 你的CDN回源IP段; real_ip_header X-Forwarded-For;,配置完成后重载Nginx,日志里的$remote_addr字段就会传递真实用户IP,注意,set_real_ip_from必须精确填写你的CDN服务商回源网段,否则会误判所有来源IP,这里也可以用real_ip_recursive on;来处理多层代理的情况,如果你没有权限改Nginx配置,可以在应用层(比如PHP的$_SERVER['HTTP_X_FORWARDED_FOR'])读取这个头部字段,但可信度略低,因为HTTP头可以伪造。
最终你想排查的IP访问问题,本质上就两步:先看实时连接找准当前活跃者,再翻应用日志确认真实身份和具体行为,命令是工具,判断逻辑才是核心每个IP背后的访问路径都会在日志里留下痕迹,顺着痕迹分析,恶意攻击者与正常访客一眼可辨。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/696113.html

