综合实践
学习目标
这一节,我们从网络实践、文件实践、小结三个方面来学习。
AWK 语言在系统运维中的综合应用,涵盖网络访问日志分析、IP 频率统计及恶意 IP 拦截策略。内容包含基于数组功能的站点信息统计、TCP 连接状态监控以及日志文件的格式化合并处理。通过实际案例演示如何利用 AWK 结合 ss 命令和 Nginx 日志完成服务器安全与性能数据的自动化采集。
这一节,我们从网络实践、文件实践、小结三个方面来学习。
所谓的网络实践,主要是借助于 awk 的数组功能,进行站点的信息统计操作。
# 安装软件
yum install nginx -y
systemctl restart nginx.service
# 重置网站首页
echo 'hello nginx' > /usr/share/nginx/html/index.html
# 测试访问
curl localhost
# 输出:hello nginx
curl localhost/nihao -I -s | head -1
# 输出:HTTP/1.1 404 Not Found
# 模拟外网访问
curl http://10.0.0.12/ -s -I -H "X-Forwarded-For: 2.2.2.2" | head -1
# 输出:HTTP/1.1 200 OK
# 查看日志
tail -n1 /var/log/nginx/access.log
# 准备 IP 地址文件
cat ip.txt
# 内容示例:
# 112.64.233.130
# 114.101.40.170
# ... (省略部分)
# 准备站点访问测试脚本
cat curl_web_site.sh
#!/bin/bash
# 功能:模拟外网访问网站
while true do
cat ip.txt | while read ip
do
NUM=$(echo $ip | cut -d"." -f 4)
for i in $(seq $NUM)
do
curl http://10.0.0.12/ -s -I -H "X-Forwarded-For: $ip" >> /dev/null
curl http://10.0.0.12/$NUM/ -s >> /dev/null
done
sleep 1
done
done
# 查看当前系统的链接状态数量
ss -ant
# 统计当前主机的连接状态信息
ss -tan | awk '!/State/{state[$1]++}END{for(i in state){print i,state[i]}}'
# 输出示例:LISTEN 5 ESTAB 4 TIME-WAIT 3960
# 发现异常 IP 地址,进行杜绝恶意 IP 地址访问
ss -nt | awk -F'[ :]+' '!/State/{ip[$(NF-2)]++}END{for(i in ip){print i,ip[i]}}' | while read line; do
ip=$(echo $line | awk '{if($2>1)print $1}')
[ -z "$ip" ] || echo "iptables -A INPUT -s $ip -j REJECT"
done
# 输出:iptables -A INPUT -s 10.0.0.1 -j REJECT
# 注意:这里为了演示成功,故意将恶意 IP 的频率降低了
# 如果不小心真的添加了防火墙策略,则执行下面的命令实现功能恢复
iptables -vnL INPUT
iptables -D INPUT 1
# 获取客户端 IP 地址信息
awk -F '"' 'NR==403 {print $(NF-1)}' /var/log/nginx/access.log
# 输出:114.101.40.170
# 统计访问网站的地址信息
awk -F '"' '{ip[$(NF-1)]++}END{for(i in ip){print i,ip[i]}}' /var/log/nginx/access.log
# 输出示例:60.211.218.78 624 ...
# 统计站点的访问页面信息
awk '{a[$7]++}END{for(v in a)print v,a[v]|"sort -k1 -nr|head -n10"}' /var/log/nginx/access.log
# 输出示例:/nihao 3 /img/html-background.png 1 ...
# 查看脚本内容
cat net.sh
#!/bin/bash
# 功能:脚本统计主机网络信息
# TCP 连接数量
TCP_Total=$(ss -s | awk '$1=="TCP"{print $2}')
# UDP 连接数量
UDP_Total=$(ss -s | awk '$1=="UDP"{print $2}')
# Listen 监听状态的 TCP 端口数量
Listen_Total=$(ss -antlpH | awk 'BEGIN{count=0} {count++} END{print count}')
# ESTABLISHED 状态的 TCP 连接数量
Estab_Total=$(ss -antpH | awk 'BEGIN{count=0}/^ESTAB/{count++}END{print count}')
# TIME-WAIT 状态的 TCP 连接数量
TIME_WAIT_Total=$(ss -antpH | awk 'BEGIN{count=0}/^TIME-WAIT/{count++}END{print count}')
# 显示主机连接相关信息
echo "TCP 连接总数:$TCP_Total"
echo "UDP 连接总数:$UDP_Total"
echo "LISTEN 状态的 TCP 端口数量:$Listen_Total"
echo "ESTAB 状态的 TCP 连接数量:$Estab_Total"
echo "TIME-WAIT 状态的 TCP 连接数量:$TIME_WAIT_Total"
所谓的文件实践,主要是借助于 awk 的数组功能,实现文件的合并格式化等工作。
默认日志格式:10.0.0.12 - - [19/Jun/2022:18:13:51 +0800] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "114.101.40.170"
期望统计信息:
--------------------------------------------
| ip 地址 |访问次数 |访问 url|访问次数 |
--------------------------------------------
| 60.211.218.78| 1248| / | 1248|
| 222.217.125.153| 2448| / | 2448|
# 获取 IP 地址
awk -F '("| )' 'NR==404 {print $(NF-1)}' /var/log/nginx/access.log
# 输出:114.101.40.170
# 获取访问页面
awk -F '("| )' 'NR==404 {print $(NF-13)}' /var/log/nginx/access.log
# 输出:/170/
awk -F '("| )' '
BEGIN{
printf "--------------------------------------------\n|%-14s|%-4s|%-4s|%-4s|\n--------------------------------------------\n"," ip 地址","访问次数","访问 url","访问次数"
}
{
a[$(NF-1)][$(NF-13)]++
}
END{
# 遍历数组,统计每个 IP 的访问总数
for(ip in a){
for(uri in a[ip]){
b[ip] += a[ip][uri]
}
}
# 再次遍历
for(ip in a){
for(uri in a[ip]){
printf "|%16s|%8d|%7s|%8d|\n", ip, b[ip], uri, a[ip][uri]
}
}
printf "--------------------------------------------\n"
}
' /var/log/nginx/access.log

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online