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 socket
TPROXY 将影响所有 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
获得标记1
和2
。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
东西完全神秘,哈哈。