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获得标记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) 的所有包发送回本地,确保它们保持在本地lo0.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/50080DIVERT无论如何都会经过,并再次被标记)0x1被写了两次我对 TPROXY 目的的假设是:在不改变数据包的情况下重新路由数据包
小智 0
“在不改变的情况下重新路由”在技术上基本上是正确的,但是要理解它的用途,最好考虑“拦截” - 您通常只是“重新路由”到您编写的在同一台机器上运行的程序(应该成为客户的 wifi 接入点,或者位于他们和世界其他地方之间的类似位置)。这是一种在您的 C/C++/任何代码中获得看起来像普通 TCP 套接字的方法,您可以在其上发送()和接收(),但实际上让您模拟它们的预期目的地。
一种用途是通过一些非常奇特的设置透明地代理流量,甚至连精心配置的 Wireguard 都无法处理它,而是您需要编写自己的实际程序才能使其工作。
看看这个:https: //github.com/FarFetchd/simple_tproxy_example
这是您可以用它做的最简单有趣的事情的最小工作示例,这可能会让您对“为什么”有更好的直觉。
至于这些ip rule fwmark东西,我建议你找到一个适合你的例子,并将其视为黑魔法咒语,除非你试图在 Linux 网络堆栈本身上进行认真的开发工作。我的意思是,我认为自己基本上能胜任 iptables,并且已经用 TPROXY 做了一些认真有用的工作,但我仍然觉得这些ip rule fwmark东西完全神秘,哈哈。
| 归档时间: |
|
| 查看次数: |
13621 次 |
| 最近记录: |