TPROXY 的用途是什么,应该如何使用它以及内部发生了什么?

Gar*_*aro 5 firewall routing proxy iptables

在阅读了一些有关 TPROXY 的内容(例如在https://www.kernel.org/doc/html/latest/networking/tproxy.html)后,我现在有更多的问题然后得到答案。我实际上什至不知道 TPROXY 应该做什么......

关于我应该做什么以及内部发生的事情的一些假设。
你能纠正以下假设吗?

据我了解,这些是您应该运行的命令(尽管我不知道为什么):

  • iptables -t mangle -N DIVERT:
    • 一条名为的链DIVERT已创建。
    • 您可以选择名称。(只要所有命令都相同)。
    • 它必须是其中的一部分,mangle因为您将要做的事情比重定向、阻止和 NAT 更重要。
  • iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT:
    • PREROUTING链确保一旦 TCP 数据包从网络设备传递到内核,首先发生的事情就是将其发送到链DIVERT
    • -p tcp确保非 TCP 流量不会出现这种情况。
    • -m socket确保创建和关闭连接的数据包不会出现这种情况(例如SYN/ACK
    • 删除-p tcp -m socketTPROXY 将影响所有 IP(v4) 数据包。这将是一个不同但有效的设置。
  • iptables -t mangle -A DIVERT -j MARK --set-mark 1:
    • 内核将用编号标记这些数据包1。您可以选择其他号码。
    • 还可以向数据包添加多个标记。例如:通过添加命令,iptables -t mangle -A DIVERT -i eth0 -j MARK --set-mark 2您将确保所有 TCP 包都获得标记1,并且所有到达的 TCP 包都eth0获得标记12
    • “用数字标记X”只是意味着“分类为类别成员X,而不实际更改数据包中的任何内容”。
    • 内核和用户空间中的程序都可以读取数据包的标记
    • 只有内核可以标记数据包
  • iptables -t mangle -A DIVERT -j ACCEPT:默认情况下,内核会丢弃数据包,因此您现在要确保它不会丢弃。
  • ip rule add fwmark 1 lookup 100:
    • 1所有带有标记的数据包现在都使用名为 的表,而不是使用默认路由表100
    • 您可以选择其他号码,只要确保在其他地方使用相同的号码即可
  • ip route add local 0.0.0.0/0 dev lo table 100:
    • 如果表100尚不存在则创建
    • 添加一个路由规则,通过将来自我们系统 ( local) 的所有包发送回本地,确保它们保持在本地lo
    • 对于任何目的地的包都是这种情况0.0.0.0/0(每个 ipv4 地址都是该子网的成员)
    • 但对于未标记的包则不是这种情况1(否则它们不会最终出现在100
  • iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 50080:
    • 所有发送来tcp/80接收标记1并最终到达的数据包tcp/50080
    • 对于某些人来说,对我来说,未知的原因,它们被标记了。(在我看来,他们DIVERT无论如何都会经过,并再次被标记)
    • 对某些人来说,对我来说,未知的原因0x1被写了两次

我对 TPROXY 目的的假设是:在不改变数据包的情况下重新路由数据包

小智 0

“在不改变的情况下重新路由”在技术上基本上是正确的,但是要理解它的用途,最好考虑“拦截” - 您通常只是“重新路由”到您编写的在同一台机器上运行的程序(应该成为客户的 wifi 接入点,或者位于他们和世界其他地方之间的类似位置)。这是一种在您的 C/C++/任何代码中获得看起来像普通 TCP 套接字的方法,您可以在其上发送()和接收(),但实际上让您模拟它们的预期目的地。

一种用途是通过一些非常奇特的设置透明地代理流量,甚至连精心配置的 Wireguard 都无法处理它,而是您需要编写自己的实际程序才能使其工作。

看看这个:https: //github.com/FarFetchd/simple_tproxy_example

这是您可以用它做的最简单有趣的事情的最小工作示例,这可能会让您对“为什么”有更好的直觉。

至于这些ip rule fwmark东西,我建议你找到一个适合你的例子,并将其视为黑魔法咒语,除非你试图在 Linux 网络堆栈本身上进行认真的开发工作。我的意思是,我认为自己基本上能胜任 iptables,并且已经用 TPROXY 做了一些认真有用的工作,但我仍然觉得这些ip rule fwmark东西完全神秘,哈哈。