查看服务器上别人链接的IP,核心方法是使用netstat、ss或lsof命令实时查看活跃连接,并结合日志分析工具追溯历史记录。这篇文章直接给你可复制的命令和排查思路,全程实操导向,无论你是租了云服务器还是管理物理机,都能照着做。
先用这三条命令立刻看到连接IP
连接到服务器的方式分两种:别人主动连进来(入站),或者服务器主动连出去(出站),绝大多数情况下你要查的是前者,但后者同样是排查安全风险的重要线索,下面这些命令在CentOS、Ubuntu、Debian等主流Linux发行版上通用。
查看所有活跃连接:netstat和ss
netstat是传统工具,ss是它的现代替代品,处理大量连接时性能更好,推荐优先用ss,但两个都给你。
ss -antup
这条命令的输出里,你会看到每一行代表一个连接,关键看这几列:
- State:连接状态,ESTABLISHED表示正在通信,SYN_SENT表示正在发起连接,TIME_WAIT表示关闭等待中。
- Local Address:服务器自身的IP和端口。
- Peer Address:对方的IP和端口,这就是你要找的“别人链接的ip”。
- Process:占用这个连接的进程名和PID。
如果想知道某个具体端口上谁连着,加过滤条件,比如查SSH(22端口)的连入者:
ss -antup | grep :22
查所有外部IP,忽略本地回环:
ss -antup | grep -v 127.0.0.1
netstat用法类似,如果你的系统没装ss,用这个:
netstat -antup
按进程反查连接来源
当你看到异常连接但不知道是什么程序建立的,用lsof按PID反查,先通过ss或ps找到PID,
lsof -p PID -i
这会列出该进程打开的所有网络连接,如果你想直接看某个服务监听的端口和连入方:
lsof -i :22
抓包看实时建立的连接
如果连接是瞬时的,比如攻击者频繁短连接,ss可能来不及捕捉,这时候用tcpdump抓包:
tcpdump -i eth0 port 22
把eth0换成你的实际网卡名,用ip addr查看,这条命令会实时显示所有经过22端口的包,每行包含源IP、目标IP和端口,抓完按Ctrl+C停止。
从日志里挖出历史连接记录
实时命令只能看到当前状况,如果要追溯过去谁连过服务器,必须翻日志。
SSH登录记录
别人链接服务器,最常走的就是SSH,登录成功和失败的记录都在这里:
# 查看成功登录记录 grep "Accepted" /var/log/auth.log # 查看失败尝试记录 grep "Failed" /var/log/auth.log
CentOS系统的路径是/var/log/secure,Debian/Ubuntu是/var/log/auth.log,每条记录包含时间、登录用户名、来源IP。
查看当前登录的所有用户和来源IP:
who
查看最近所有登录历史(含IP):
last -i
last命令读取/var/log/wtmp文件,-i参数强制显示IP地址,有些系统默认显示主机名。
Web访问日志
如果你的服务器搭了网站,每个访客的IP都在访问日志里,Nginx的日志路径通常是/var/log/nginx/access.log,Apache是/var/log/apache2/access.log。
查看访问量最大的前10个IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
这条命令是运维排查高频IP的经典组合,含义就是统计每个IP出现的次数然后排序。
实战场景:发现异常连接后的排查流程
讲完命令,说一个具体场景,假设你的服务器带宽被占满,怀疑被入侵或者被人做代理,按照下面的流程一步步来。
第一步,确认异常连接的进程。
ss -antup | grep ESTABLISHED
仔细看Peer Address列有没有陌生IP,如果发现一个IP连着你服务器的某个高端口,记下这个连接的PID。
第二步,定位进程归属。
ps aux | grep PID
看到进程名是xmrig、kdevtmpfsi这类挖矿程序,基本可以判定服务器被入侵了。
第三步,查看进程的完整网络行为。
lsof -p PID -i
这条命令会显示这个进程跟哪些IP通信,往往是矿池地址或者C2控制端地址。
第四步,溯源入侵途径。
grep "Accepted" /var/log/auth.log | tail -20
看看有没有非授权IP成功登录过,如果攻击者改了SSH端口或者用了密钥登录,日志里同样有痕迹。
第五步,用IP信息辅助判断。
拿查询到的IP去网上搜一下归属地和是否在威胁情报库中,可以快速判断是普通访客、扫描器还是已知恶意IP。
多维度对比不同查看方式的适用场景
要应对不同的任务类型,比如排查故障、分析攻击来源、或者监控业务连接质量,选对工具能省不少时间。
| 需求 | 推荐工具 | 优点 | 局限 |
|---|---|---|---|
| 查看当前所有连接 | ss / netstat | 实时、信息全 | 抓不到瞬断连接 |
| 精确到进程的连接 | lsof | 直接对应PID和进程名 | 需要先知道PID |
| 抓取实时数据包 | tcpdump | 能捕捉瞬时扫描 | 输出量大,需要分析 |
| 查看历史SSH登录 | last / auth.log | 完整记录登录时间与IP | 仅覆盖SSH服务 |
| 分析Web访问来源 | access.log | 包含全部HTTP请求IP | 需要日志分析命令 |
针对Linux服务器,ss命令是综合效率最高的起手式,一次执行就能看到所有连接的IP、端口、状态和进程,需要回溯时,优先查SSH日志和Web日志这两类最常见入口。
服务器查看连接IP的常见疑问解答
ss命令显示很多TIME_WAIT状态的连接,这些IP是攻击吗?
不是,TIME_WAIT是TCP连接正常关闭后的状态,服务器主动断开连接后,内核会保留这个记录一段时间,防止迟到的数据包干扰新连接,大量TIME_WAIT通常说明服务器上有高频短连接服务,比如频繁请求外部API或数据库,只有配合SYN_SENT、SYN_RECV等异常状态和大量半开连接才值得警惕。
为什么查到的连接IP和自己本机公网IP不一样?
如果通过代理或负载均衡访问服务器,日志里记录的可能是代理服务器的IP,典型场景是使用了CDN或云WAF,访客先连到CDN节点,再由CDN回源到你的服务器,这种情况下需要开启X-Forwarded-For头来获取真实IP,Nginx配置set_real_ip_from和real_ip_header指令可以解决,服务器在NAT网关后面时,看到的来源IP是网关内网IP,并非客户端真实IP。
netstat命令提示command not found怎么办?
多数最小化安装的系统默认不带netstat,装上就行,Debian/Ubuntu执行apt install net-tools,CentOS执行yum install net-tools,ss命令属于iproute2包,几乎所有系统预装,优先使用ss可以避免依赖问题。
监控连接数用什么命令最直观?
持续观察连接数变化用watch配合ss,每两秒自动刷新:
watch -n 2 'ss -antup | grep ESTABLISHED | wc -l'
这比反复手动执行方便得多,要按IP统计连接数量排序,用:
ss -antp | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
统计结果会列出连接数最多的IP,一眼就能看出谁在频繁跟服务器通信。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/796985.html


