以下是Linux下查看网站访问IP的常用命令,涵盖实时监控、统计分析、日志分析等多种场景。
一、实时查看当前访问IP
1. 查看当前80/443端口的活动连接
# 查看所有HTTP/HTTPS连接的IP
netstat -tn | grep ':80\|:443' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
# 使用ss命令(更快,推荐)
ss -tn | grep ':80\|:443' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
2. 实时监控新连接
# 每2秒刷新一次,查看IP连接数
watch -n 2 'ss -tn | grep ":80\|:443" | awk "{print \$5}" | cut -d: -f1 | sort | uniq -c | sort -nr | head -20'
# 监控连接状态分布
watch -n 2 'ss -tan | grep ":80\|:443" | awk "{print \$1}" | sort | uniq -c'
3. 查看ESTABLISHED状态的连接(已建立的连接)
# 只看已建立的连接
netstat -tn | grep ':80\|:443' | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
# ss版本
ss -tn state established '( dport = :80 or dport = :443 )' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
二、Web日志分析(最常用)
1. 查看访问日志中的IP
# Nginx日志位置
tail -100 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# Apache日志位置
tail -100 /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 如果日志格式不同,可能需要调整字段位置
# 常见格式:$remote_addr(客户端IP)通常是第一个字段
2. 统计访问量TOP的IP
# Nginx - 统计所有IP访问次数,降序显示前20
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
# Apache
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -20
# 统计指定时间段(比如今天)
awk '{print $1}' /var/log/nginx/access.log | grep "$(date +%d/%b/%Y)" | sort | uniq -c | sort -nr | head -20
3. 统计指定时间段的IP访问
# 查看今天10:00到11:00的访问IP
awk '/10\/Mar\/2026:10:/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
# 查看最近10分钟的IP
tail -10000 /var/log/nginx/access.log | awk '{print $4, $1}' | grep "$(date +%d/%b/%Y:%H:%M -d '10 minutes ago')" | awk '{print $2}' | sort | uniq -c | sort -nr
4. 统计去重IP数量
# 统计总共有多少个不同IP访问过
awk '{print $1}' /var/log/nginx/access.log | sort -u | wc -l
# 统计今天的独立IP数
awk '/$(date +%d\/%b\/%Y)/ {print $1}' /var/log/nginx/access.log | sort -u | wc -l
三、按条件过滤IP
1. 排除内部IP,只统计公网IP
# 排除内网IP(192.168.x.x, 10.x.x.x, 172.16-31.x.x)
awk '{print $1}' /var/log/nginx/access.log | grep -v "^192\.168\|^10\.\|^172\.1[6-9]\|^172\.2[0-9]\|^172\.3[0-1]" | sort | uniq -c | sort -nr | head -20
2. 查看访问特定URL的IP
# 查看访问某个页面的IP
grep "/index.html" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 查看访问API接口的IP
grep "/api/" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
3. 查看返回特定状态码的IP
# 查看访问返回404的IP
grep " 404 " /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 查看返回500错误的IP
grep " 500 " /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 查看返回200成功的IP
grep " 200 " /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
4. 查看POST请求的IP(常用于攻击检测)
# 查看POST请求的IP
grep "POST" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 查看表单提交的IP
grep "POST.*login" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
四、高级统计与分析
1. 使用awk按小时统计IP访问频率
# 按小时统计每个IP的请求数
awk '{print $4, $1}' /var/log/nginx/access.log | awk -F: '{print $1":"$2, $NF}' | sort | uniq -c | sort -nr | head -30
2. 查看单IP的详细访问记录
# 查看指定IP的所有访问记录
grep "192.168.1.100" /var/log/nginx/access.log
# 统计指定IP的访问次数
grep "192.168.1.100" /var/log/nginx/access.log | wc -l
# 查看指定IP的访问URL分布
grep "192.168.1.100" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr
3. 使用GoAccess生成可视化报告
# 安装GoAccess
apt install goaccess # Debian/Ubuntu
yum install goaccess # CentOS/RHEL
# 终端交互式分析
goaccess /var/log/nginx/access.log --log-format=COMBINED
# 生成HTML报告
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED
4. 使用AWStats分析
# 安装AWStats
apt install awstats
# 配置后访问
# http://your-server/awstats/awstats.pl
五、快速检测DDoS/CC攻击
1. 检测高频访问IP
# 检测单IP请求频率(超过100次/分钟需警惕)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | awk '$1 > 100 {print}'
# 检测1分钟内的请求量(需要先确定时间范围)
tail -10000 /var/log/nginx/access.log | awk '{print $4, $1}' | awk -F: '{print $2":"$3, $NF}' | sort | uniq -c | sort -nr | head -20
2. 检测异常User-Agent的IP
# 查看没有User-Agent的请求(可能是攻击脚本)
awk '$12 == "-" {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
# 查看特定User-Agent的IP
grep -i "python" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
3. 检测异常请求的IP
# 检测大量404错误的IP
grep " 404 " /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
# 检测大量500错误的IP
grep " 500 " /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
六、实用脚本示例
1. 实时监控并自动封禁高频IP
#!/bin/bash
# 监控1分钟内请求超过200次的IP并封禁
while true; do
# 获取最近1分钟的IP统计
tail -10000 /var/log/nginx/access.log | \
awk -v now=$(date +%d/%b/%Y:%H:%M) 'index($4, now) == 1 {print $1}' | \
sort | uniq -c | sort -nr | while read count ip; do
if [ $count -gt 200 ]; then
# 检查是否已封禁
if ! iptables -L INPUT -n | grep -q "$ip"; then
echo "封禁IP: $ip (请求数: $count)"
iptables -A INPUT -s $ip -j DROP
fi
fi
done
sleep 60
done
2. 定时生成IP统计报告
#!/bin/bash
# 每天生成IP访问报告
DATE=$(date +%Y%m%d)
LOG_FILE="/var/log/nginx/access.log"
REPORT="/var/www/html/reports/ip_report_$DATE.html"
echo "<html><body>" > $REPORT
echo "<h2>IP访问统计报告 - $DATE</h2>" >> $REPORT
echo "<pre>" >> $REPORT
awk '{print $1}' $LOG_FILE | grep "$(date +%d/%b/%Y)" | sort | uniq -c | sort -nr | head -50 >> $REPORT
echo "</pre></body></html>" >> $REPORT
七、快速确认是否遭受攻击
首先执行快速诊断命令,判断服务器是否正在遭受攻击
1. 检查当前连接数
# 查看80/443端口的连接数(正常应在数百以内)
ss -tan state established | grep ":80\|:443" | awk '{print $4}' | cut -d':' -f1 | sort -n | uniq -c | sort -nr | head -20
# 检查SYN_RECV状态连接数(SYN Flood攻击特征)
ss -tan state syn-recv | wc -l
如果单个IP连接数异常高(数百甚至数千),或SYN_RECV连接数超过正常值,极有可能是DDoS攻击
2. 实时观察访问日志
# 实时查看Web访问日志
tail -f /var/log/nginx/access.log # Nginx
tail -f /var/log/apache2/access.log # Apache
# 过滤特定状态码(如大量404可能为扫描)
tail -f /var/log/nginx/access.log | grep " 404 "
3. 统计高频访问IP
# Nginx日志 - 统计访问量前20的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
# Apache日志
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -20
4. 检查带宽占用
# 安装iftop后实时查看带宽占用
iftop -i eth0 -nNP
# 按进程查看网络占用
nethogs
八、定位攻击类型与可疑来源
1. 按时间窗口聚合请求速率
bash
# 查看每秒请求量,识别突发流量
awk '{print $4}' /var/log/nginx/access.log | cut -d: -f2-4 | uniq -c | sort -nr | head
2. 定位被高频访问的目标URL
bash
# 查看被集中请求的路径
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
常见攻击目标包括:
-
登录接口(
/login、/admin) -
动态接口(
/api/*) -
静态资源被异常刷量
3. 识别恶意扫描与探测
bash
# 检查SQL注入特征
grep -i "union.*select\|select.*information_schema\|or.*1.*=" /var/log/nginx/access.log
# 检查路径遍历/文件包含
grep -i "\.\./\|/etc/passwd\|/proc/self" /var/log/nginx/access.log
# 检查Webshell上传扫描
grep -i "\.php\|\.jsp\|b374k" /var/log/nginx/access.log
4. 检查错误日志中的异常
bash
# 统计对不存在资源的请求(404扫描)
grep "File does not exist" /var/log/apache2/error.log* | awk '{print $NF}' | sort | uniq -c | sort -nr | head -20
九、网络层交叉验证
1. 查看当前所有连接的源IP
bash
# 查看每个远端IP的连接数
netstat -an | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -20
# 如netstat未安装,使用ss命令
ss -tun | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -20
2. 抓包分析攻击特征
bash
# 抓取80端口流量,分析请求频率
tcpdump -i eth0 -nn port 80 -c 1000 | grep -i "GET\|POST" | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -nr
# 检测SYN Flood特征
tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) == 0'
3. 识别SYN Flood攻击
bash
# 统计处于SYN_RECV状态的IP
ss -tan state syn-recv | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10
十、使用自动化分析工具
1. GoAccess - 可视化日志分析
bash
# 安装
apt install goaccess # Debian/Ubuntu
# 生成HTML报告
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED
# 终端实时分析
goaccess /var/log/nginx/access.log
2. FastNetMon - 高性能DDoS检测器
FastNetMon是一个高性能的DDoS攻击检测工具,支持NetFlow、IPFIX、sFLOW,能自动检测异常流量并触发告警或自动封禁
bash
# Debian/Ubuntu安装
apt install fastnetmon
# 配置检测阈值
# 编辑 /etc/fastnetmon.conf
threshold_packets = 10000 # 每秒包数阈值
threshold_mbps = 100 # 带宽阈值Mbps
3. Fail2ban - 自动封禁恶意IP
bash
# 安装
apt install fail2ban
# 配置Nginx/CC攻击防护
# /etc/fail2ban/jail.local
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
logpath = /var/log/nginx/access.log
maxretry = 100
bantime = 3600
findtime = 60
十一、应急处置措施
1. 临时封禁恶意IP
bash
# 使用iptables封禁单个IP
iptables -A INPUT -s 192.168.1.100 -j DROP
# 封禁IP段
iptables -A INPUT -s 192.168.1.0/24 -j DROP
# 保存规则
iptables-save > /etc/iptables/rules.v4
2. 启用速率限制
bash
# 使用iptables限制单个IP连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j DROP
# 限制新建连接速率
iptables -A INPUT -p tcp --dport 80 -m recent --update --seconds 60 --hitcount 100 -j DROP
3. Nginx速率限制
bash
# /etc/nginx/nginx.conf
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_req zone=mylimit burst=20 nodelay;
limit_conn addr 10;
}
}
十二、命令速查表
| 需求 | 命令 |
|---|---|
| 实时查看当前连接IP | `ss -tn |
| 统计日志中IP访问量TOP20 | `awk '{print $1}' /var/log/nginx/access.log |
| 统计独立IP总数 | `awk '{print $1}' /var/log/nginx/access.log |
| 查看特定IP的访问记录 | grep "IP地址" /var/log/nginx/access.log |
| 查看404错误的IP | `grep " 404 " /var/log/nginx/access.log |
| 查看POST请求的IP | `grep "POST" /var/log/nginx/access.log |
| 实时监控新连接 | `watch -n 2 'ss -tn |
| 生成可视化报告 | goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED |