如何将MikroTik Web Proxy日志存入远程MySQL数据库(Ubuntu环境)
解决方案:用Squid代理+自定义脚本实现FreeRADIUS关联的Web访问日志入库
首先得明确:FreeRADIUS本身并不负责记录用户的Web访问细节(比如URL、源IP)——它的核心是做认证、授权和计费(AAA),Web访问日志得靠前端的代理层来捕获。结合你的Ubuntu 14.04环境,我给你一套完全免费的开源方案,刚好匹配你的需求:
第一步:用Squid替代MikroTik Web Proxy,捕获完整Web访问日志
Squid是老牌开源HTTP/HTTPS代理,能完美对接FreeRADIUS做用户认证,还能自定义日志格式,把你需要的源IP、访问URL、用户名全记录下来。
- 先安装Squid:
sudo apt-get update && sudo apt-get install squid3 - 配置Squid和FreeRADIUS联动认证:
打开/etc/squid3/squid.conf,添加以下配置(替换成你的FreeRADIUS服务器IP和共享密钥):
保存后重启Squid生效:# 配置RADIUS认证 auth_param basic program /usr/lib/squid3/radius_auth -h 你的FreeRADIUS_IP -p 1812 -s 你的RADIUS共享密钥 auth_param basic children 5 auth_param basic realm "Squid 代理服务器" auth_param basic credentialsttl 2 hours # 只允许通过RADIUS认证的用户访问 acl authenticated proxy_auth REQUIRED http_access allow authenticatedsudo service squid3 restart
第二步:自定义Squid日志格式,包含所有需要的字段
默认Squid日志字段不全,我们定义一个包含时间戳、源IP、用户名、请求方法、访问URL、响应码、响应时间的日志格式:
在squid.conf末尾添加:
logformat custom_log "%ts %h %un %rm %ru %rs %rt" access_log /var/log/squid3/web_access.log custom_log
每个字段的含义:
%ts:Unix时间戳%h:用户的源IP地址%un:通过FreeRADIUS认证的用户名%rm:HTTP请求方法(GET/POST等)%ru:用户访问的完整URL%rs:HTTP响应状态码%rt:请求响应时间(毫秒)
再次重启Squid让配置生效。
第三步:编写脚本把Squid日志同步到远程MySQL
接下来写一个Python脚本(Ubuntu 14.04自带Python2.7,不用额外安装新版本),定时读取新增的日志条目,写入远程MySQL数据库。
- 先安装MySQL的Python驱动:
sudo apt-get install python-mysqldb - 创建脚本文件
squid_log_sync.py,内容如下(替换成你的数据库信息):import MySQLdb import os import time # 配置项,根据你的实际情况修改 LOG_PATH = "/var/log/squid3/web_access.log" POS_RECORD_FILE = "/var/log/squid3/last_read_position.txt" DB_HOST = "远程MySQL服务器IP" DB_USER = "数据库用户名" DB_PASS = "数据库密码" DB_NAME = "数据库名" def main(): # 连接数据库,不存在表则创建 db = MySQLdb.connect(DB_HOST, DB_USER, DB_PASS, DB_NAME) cursor = db.cursor() create_table_sql = """ CREATE TABLE IF NOT EXISTS user_web_activity ( id INT AUTO_INCREMENT PRIMARY KEY, timestamp INT NOT NULL, source_ip VARCHAR(45) NOT NULL, username VARCHAR(100) NOT NULL, request_method VARCHAR(10), url TEXT NOT NULL, response_code INT, response_time INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """ cursor.execute(create_table_sql) db.commit() # 获取上次读取日志的位置,避免重复写入 if os.path.exists(POS_RECORD_FILE): with open(POS_RECORD_FILE, 'r') as f: last_pos = int(f.read().strip()) else: last_pos = 0 # 读取新增的日志内容 with open(LOG_PATH, 'r') as log_file: log_file.seek(last_pos) new_lines = log_file.readlines() current_pos = log_file.tell() # 逐条写入数据库 for line in new_lines: line = line.strip() if not line: continue parts = line.split() if len(parts) != 7: print(f"跳过格式错误的日志行: {line}") continue ts, ip, user, method, url, code, rt = parts try: insert_sql = """ INSERT INTO user_web_activity (timestamp, source_ip, username, request_method, url, response_code, response_time) VALUES (%s, %s, %s, %s, %s, %s, %s) """ cursor.execute(insert_sql, (ts, ip, user, method, url, int(code), int(rt))) db.commit() except Exception as e: print(f"写入数据库失败: {line}, 错误信息: {str(e)}") db.rollback() # 保存本次读取的位置,下次从这里开始 with open(POS_RECORD_FILE, 'w') as f: f.write(str(current_pos)) # 关闭数据库连接 cursor.close() db.close() if __name__ == "__main__": main() - 给脚本添加执行权限:
chmod +x squid_log_sync.py - 用Cron定时执行脚本(比如每分钟执行一次,确保日志实时同步):
打开Cron任务编辑:
添加一行:crontab -e
替换* * * * * /usr/bin/python /path/to/squid_log_sync.py/path/to/为你实际的脚本存放路径。
第四步:验证方案效果
- 让用户通过Squid代理访问Web资源
- 查看Squid的
web_access.log,确认每条日志都包含用户名、源IP和URL - 登录远程MySQL,查询
user_web_activity表,就能看到同步过来的完整访问记录
额外补充
- 如果需要捕获HTTPS的访问URL,得配置Squid的SSL Bump功能(需要生成自签名SSL证书),这样可以解密HTTPS流量并记录URL
- 记得给远程MySQL服务器授权,允许Ubuntu服务器的IP访问(执行
GRANT ALL ON 数据库名.* TO '用户名'@'Ubuntu服务器IP' IDENTIFIED BY '密码';) - 定期清理Squid的旧日志,避免占用过多磁盘空间
内容的提问来源于stack exchange,提问作者Muhammad Faryad
相关产品推荐
相关产品推荐

