麒麟V11系统中实现基于Squid的内网上网审计系统
实验条件:两台虚拟机,一台作为Squid代理服务器,一台为客户端主机。
实验目的:Squid代理服务器上部署上网审计系统,能够监管客户端主机。
一、Squid 代理基础配置(放行内网、开启日志)
1. 修改 squid 配置放行内网网段,开启完整日志
# 取消内网放行注释 sed -i 's/# http_access allow localnet/http_access allow localnet/' /etc/squid/squid.conf # 写入全局拒绝规则(放在最后) echo 'http_access deny all' >> /etc/squid/squid.conf # 开启完整访问日志(防止日志缺失) echo 'access_log /var/log/squid/access.log combined' >> /etc/squid/squid.conf # 重载配置生效 systemctl reload squid # 验证放行规则 grep 'http_access allow localnet' /etc/squid/squid.conf2. 放行防火墙 3128 代理端口
firewall-cmd --add-port=3128/tcp --permanent firewall-cmd --reload # 验证端口放行 firewall-cmd --list-ports二、安装网页服务(用来展示审计页面)
yum install -y httpd # 开机自启并立即运行 systemctl enable --now httpd # 验证网页服务是否启动 systemctl status httpd三、审计自动生成脚本 web_audit.sh(最终版:有序号、最多 100 条、无状态码、标准数字时间)
1. 清空旧脚本,新建完整脚本
> /root/web_audit.sh vim /root/web_audit.sh2.写入网页代码
#!/bin/bash LOG="/var/log/squid/access.log" HTML="/var/www/html/audit.html" # 写入页面头部、分页样式 cat > $HTML <<END <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>内网上网审计</title> <style> *{box-sizing: border-box;margin:0;padding:0;font-family:Microsoft Yahei,sans-serif;} body{background:#f5f7fa;padding:30px;max-width:1300px;margin:0 auto;} h1{color:#2d3748;text-align:center;margin-bottom:25px;font-size:28px;} table{width:100%;border-collapse:collapse;background:#fff;box-shadow:0 2px 12px rgba(0,0,0,0.08);border-radius:8px;overflow:hidden;} th{background:#4299e1;color:#fff;padding:14px 12px;font-size:15px;} td{padding:12px 12px;border-bottom:1px solid #e2e8f0;color:#4a5568;font-size:14px;text-align:center;} td:nth-child(3){text-align:left;} tr:nth-child(even){background:#f7fafc;} tr:hover{background:#ebf8ff;} .no-data{text-align:center;padding:60px;color:#a0aec0;font-size:16px;} .footer{margin-top:20px;text-align:right;color:#718096;font-size:13px;} .page-tip{margin-bottom:10px;color:#666;} </style> </head> <body> <h1>内网上网访问记录审计平台</h1> <div class="page-tip">当前页面最多展示最近100条访问记录</div> <table> <tr> <th width="8%">序号</th> <th width="26%">访问时间</th> <th width="20%">客户端IP</th> <th width="46%">访问网址</th> </tr> END # 处理日志:过滤无效error日志、只取最新100条、生成自增序号、转换标准数字时间 if [ -f "$LOG" ];then grep "GET" "$LOG" | grep -v error | tail -n 100 | awk ' BEGIN{num=1} { raw_t = $4 " " $5 ip = $1 url = $7 # 清除时间开头多余的[符号 sub(/^\[/,"",raw_t) split(raw_t, tarr, /[:\/ ]/) day = tarr[1] mon = tarr[2] year = tarr[3] h = tarr[4] mi = tarr[5] s = tarr[6] # 英文月份转数字 if(mon=="Jan") m="01"; else if(mon=="Feb") m="02"; else if(mon=="Mar") m="03"; else if(mon=="Apr") m="04"; else if(mon=="May") m="05"; else if(mon=="Jun") m="06"; else if(mon=="Jul") m="07"; else if(mon=="Aug") m="08"; else if(mon=="Sep") m="09"; else if(mon=="Oct") m="10"; else if(mon=="Nov") m="11"; else if(mon=="Dec") m="12"; new_time = year"-"m"-"day" "h":"mi":"s # 输出4列:序号、时间、客户端IP、访问网址(已删除状态码列) printf "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",num,new_time,ip,url num++ }' >> $HTML else echo "<tr><td colspan=4 class=no-data>暂无上网访问日志</td>" >> $HTML fi # 页面底部闭合标签 cat >> $HTML <<END </table> <div class="footer">自动刷新任务:每分钟更新一次 · Squid代理审计系统</div> </body> </html> END echo "[$(date '+%Y-%m-%d %H:%M:%S')] 审计页面更新完成"2. 赋予脚本执行权限并手动测试生成页面
chmod +x /root/web_audit.sh # 手动执行一次,生成审计网页 /root/web_audit.sh四、配置定时自动刷新(无需手动执行脚本,每分钟自动更新页面)
# 编辑定时任务 crontab -e写入一行定时规则,保存退出:
五、客户端配置代理访问外网(这里在新建一台虚拟机)
临时生效(当前终端)访问百度
export HTTP_PROXY=http://192.168.3.71:3128 export HTTPS_PROXY=http://192.168.3.71:3128 # 强制测试访问,确保走代理 curl -v --proxy http://192.168.3.71:3128 http://baidu.com六、访问审计网页
浏览器打开地址(替换为你的 Squid 服务器 IP,我的是3.71):
http://192.168.3.71/audit.html
序号为22、23的是最新测试结果,能看到最新测试结果显示了客户机访问外网的时间,IP地址,以及访问网站的地址。
