You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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和共享密钥):
    # 配置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 authenticated
    
    保存后重启Squid生效:
    sudo 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数据库。

  1. 先安装MySQL的Python驱动:
    sudo apt-get install python-mysqldb
    
  2. 创建脚本文件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()
    
  3. 给脚本添加执行权限:
    chmod +x squid_log_sync.py
    
  4. 用Cron定时执行脚本(比如每分钟执行一次,确保日志实时同步):
    打开Cron任务编辑:
    crontab -e
    
    添加一行:
    * * * * * /usr/bin/python /path/to/squid_log_sync.py
    
    替换/path/to/为你实际的脚本存放路径。

第四步:验证方案效果

  1. 让用户通过Squid代理访问Web资源
  2. 查看Squid的web_access.log,确认每条日志都包含用户名、源IP和URL
  3. 登录远程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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:09:51