当网关不是ISP路由器时捕获ip数据包

当网关不是ISP路由器时捕获ip数据包

在我的家庭网络中,我有以下拓扑

          Internet
              |
     wifi     |
C ----------- A ---------- B

在哪里

  • A(静态 IP 192.168.0.254)是我的 ISP 提供的路由器/AP。
  • B(静态IP 192.168.0.1)是一台Linux机器,作为本地DNS和DHCP服务器(运行dnsmasq)
  • C 是连接到 AP 并由 DHCP 配置的任何客户端。

目前,B(作为 DHCP 服务器)提供的默认网关只是 A。

然后,假设我想在 B 中捕获来自任何客户端 C 的所有流量。以下是我在 B 上所做的操作:

  1. 激活 IP 转发

    # sysctl net.ipv4.ip_forward=1"
    
  2. 供应 B 作为网关。当然B本身使用A作为自己的网关

  3. 在 B 上运行 tcpdump 看看发生了什么

在客户端 C 上,我启动任何请求,例如

$ traceroute www.google.com

现在,我预计来自 C 的流量会路由到 B,然后路由到 A,最后路由到互联网。

什么有效。C 能够访问互联网

什么不起作用。除了第一个请求之外,似乎B完全被绕过:tcpdump没有显示任何东西; B 的地址不会出现在跟踪路由输出中。不过,我确信会发生重新路由,因为如果我禁用 B 上的 IP 转发,C 就会与互联网断开。

如果发生某种短路,我该如何避免?

免责声明:我知道更改网络拓扑可以解决“捕获所有流量”问题(例如通过端口镜像等),但我真的想了解我的设置发生了什么以及如何在不更改拓扑的情况下解决该问题。

答案1

您需要主机 B 进行 NAT 转换,以便 A 不会再次看到相同的数据包。相反,B 应该通过 A 发送数据包,就像它们源自 B 一样。要实现这一点,您可以添加iptables如下规则:

# iptables -t nat -A POSTROUTING -s ip-of-C -j MASQUERADE

根据该规则,从 B 发出的所有数据包都将被重写为好像源自 B,但保留反向转换表,以便可以反向转换相关响应并将其发送到 C。

请注意-s ...将规则限制为仅适用于源自 C 的数据包(或者可以将其设置为本地 LAN)的部分,例如不适用于响应数据包。

编辑(考虑@theuncle的评论):关于为什么它在没有NAT的情况下不起作用的解释是,主机B意识到数据包在同一接口上未经改变地传入和传出,因此它可以通过告诉C来改善网络直接与A洽谈相关交通事宜。

相关内容