---
layout: news
title: 本站访问日志现已公开发布
date: 2019-07-26
author: Miao Wang
category: news
---

我们始终认为，TUNA 开源镜像站的访问日志是一笔宝贵的数据。有若干上游向我们表示，希望能够获取对其镜像的访问数据，以便进行分析和统计。我们相信，这些访问日志也可以帮助到那些对于镜像站的运行有兴趣的研究者。基于上述愿意，我们一直以来有愿望公开这些访问日志，以便大家研究。但是在访问日志中，包含有能够追踪到用户的 IP 地址信息，我们不希望该信息能够被泄露出去。然而，完全抹除该信息，则会使得这部分数据的研究价值降低。

为了解决这一矛盾，我们对公开的日志中的 IP 地址信息进行了一定的变换，以确保用户的隐私不被泄露的同时，尽可能减少数据研究价值的减损。具体的变换规则是：保持 IPv4 地址的前 24 位或 IPv6 地址的前 48 位不变，将 IP 地址伪随机地映射至其他地址，该映射关系在 30 秒内保持固定，每隔 30 秒发生一次改变。

我们目前共有两个后端服务器，日志的访问地址分别是 [https://{{ site.hostname }}/logs/neomirrors/](/logs/neomirrors/) 和 [https://{{ site.hostname }}/logs/nanomirrors/](/logs/nanomirrors/)。日志的格式是：

```
$fake_remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$sent_http_content_type" "$http_referer" "$http_user_agent" - $scheme
```

#### FAQ

* Q: 这对于镜像站用户的使用有何影响？
  
  A: 没有任何影响。

* Q: 为何要保留 IP 地址的前若干位?

  A: 这样可以保留 IP 地址的大致的地理信息，以便用于分析。

* Q: 为何在一段时间内固定映射关系？

  A: 这样可以在这段时间内将同一个 IP 地址发送的请求映射至同一 IP 地址，以便用于分析。

* Q: 为何每隔一定时间改变映射关系？

  A: 由于 IP 地址（尤其是 IPv4 地址）空间有限，这样做可以避免产生长期固定的映射关系，以免通过枚举来获知该映射关系。

* Q: 具体变换算法是什么？

  A: 首先，该算法的全局参数如下：
  
  * `secret`：二进制秘密数据，作为密钥使用；
  * `mask_len`：保留的 IP 地址位数，对于 IPv4 地址，取 24；对于 IPv6 地址，取 48；
  * `step_time`：保持映射关系的时间（单位：秒），这里取 30。
  
  该算法的执行步骤可以描述如下：
  
  1. 令 `ip` 为访问者 IP 地址，`len` 为其位数；
  2. 取当前以秒为单位的 Unix 时间戳 `time`；
  3. 将 `time` 除以 `step_time`，商向下取整；
  4. 取缓冲区 `buf`，并将 `ip` 填入；
  5. 以无符号大端序 32 位整数的格式，向 `buf` 内追加写入 `time`；
  6. 以 `secret` 为密钥，对 `buf` 执行 `HMAC-SHA1` 算法，所得哈希值的前 `len` 位记为 `h`;
  7. 用 `ip` 的前 `mask_len` 位代替 `h` 的前 `mask_len` 位；
  8. `h` 即为变换后的 IP 地址。
