我们有一个运行 nginx 和 Rails 应用的 Web 服务器。我们的日志格式如下:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

但是,我希望能够区分具有相同 IP 的两个请求是来自不同的设备还是相同的设备。我怀疑一个人使用两个不同的用户在两个不同的浏览器中从同一设备进行连接,因此,用户代理和会话 cookie 也不同。

有什么方法可以记录设备 IP 或标识符吗?

4

  • 如果您有一些会话绑定,您可以设置这些,例如,在第一个会话运行时不允许建立第二个会话。否则,总有办法避免这种检测。


    – 


  • 我不明白你的意思,如果我无法检测他们是否已经在该设备上运行了一个会话,我该如何避免他们创建新的会话?@NikitaKipriyanov


    – 

  • 这背后的业务问题是什么?为什么会有这么奇怪的需求?


    – 

  • 我怀疑某个用户正在通过使用两个不同的配置文件登录来“刷积分”


    – 


最佳答案
1

一般来说不是。

有什么方法可以记录设备 IP

您已经记录了它 – 那是$remote_addr,通常这将是客户端设备的 IP 地址。

但是如果路由器启用了 NAT,即配置为用路由器自己的地址覆盖数据包中的设备地址,那么您得到的就是这些。NAT 之后,原始源地址不再存在于数据包中,因此您的服务器无论如何都看不到它。

(IP 在设计时并未考虑 NAT — — 它的设计方式是设备的原始地址将始终保持不变 — — 因此当路由器故意覆盖它时,没有任何“备份”字段可以将原始地址存储在任何地方。)

NAT 设备本身仍然知道原始地址是什么,所以如果它是您控制下的路由器,则可以查询其映射表(NAT 状态表),前提是您还记录了 $remote_port,但如果您无法控制路由器,那么您就无法知道它隐藏了一个设备还是两个或更多设备。

或标识符?

基于 IP 的网络上的唯一此类标识符是 IP 地址本身。

5

  • 我们在这里谈论的不仅仅是 TCP,还有 HTTP,所以原则上 cookie 标头中可以有一个标签,可以在不同的设备上进行不同的设置,但这很容易被规避(例如,通过在单个设备上使用不同的浏览器配置文件,显示为不同的浏览器),这正是正在发生的事情。


    – 


  • 我的意思是,是的,但是 OP 在要求标识符之前已经在他们的问题中解决了 HTTP cookie 问题。


    – 

  • 谢谢您的回答!NAT 通常会启用吗?它是当今路由器中常见的功能还是默认功能?


    – 

  • 并且 cookies 不起作用,正如 @NikitaKipriyanov 所说,我认为他们在同一设备中使用不同的浏览器(我知道他们对一个用户使用 Firefox,对另一个用户使用 Chrome)


    – 

  • 1
    取决于路由器的类型。家庭/小型办公室 wifi 路由器?几乎可以保证启用。另一方面,大型企业路由器?非常罕见。(更一般地说,NAT 是在整个网络的外部边界(即您与 ISP 会面的地方)执行的操作,但不是在网络内部执行的操作。因此,如果您有一个由许多路由器组成的大型企业或大学网络,那么这些路由器之间永远不应该进行 NAT(因为没有必要),除非有人购买了现成的家用 wifi 路由器并且没有正确配置它。)


    –