我已经在 上设置了本地透明 TCP 代理localhost
。我想将所有 TCP 流量重定向到该代理,这样它就可以处理它,并且不会“泄漏”任何东西,从而绕过代理。我需要使用 IPTables 来重定向流量。我考虑过使用 TPROXY,但这需要应用程序支持,并且目前仅支持 REDIRECT 目标。
我使用了以下 IPTables 规则:
iptables -t nat -A OUTPUT -o lo -j RETURN
iptables -t nat -A OUTPUT -d 127.0.0.0/8 -j RETURN
iptables -t nat -A OUTPUT -d 192.168.0.0/16 -j RETURN
iptables -t nat -A OUTPUT -m owner --uid-owner proxy-owner -j RETURN
iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $PROXY_PORT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner proxy-owner -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j LOG
iptables -P OUTPUT DROP
他们似乎工作正常,但我很困惑为什么。
这里有两个问题我仍然不知道答案:
1)关于NAT表中的最后一条规则,为什么我只想将 SYN 数据包重定向到本地代理端口 ( --syn
)?
我想重定向所有 TCP 数据包。在当前配置中,似乎只有 SYN 数据包被重定向到本地代理,而所有其他数据包都被允许直接流向目的地,导致(理论上)完全混乱(或者除了 SYN 之外的所有数据包都被过滤器阻止)桌子)。但是,如果我删除该--syn
选项并将所有数据包重定向到本地代理,则代理根本无法工作。为什么?
2)关于过滤表中的第4条规则,为什么我需要明确允许传出已建立的连接?无论如何,代理是唯一允许将数据包发送到非本地主机目的地的应用程序,并且它已经被允许这样做(规则 3),那么我需要第四条规则做什么呢?似乎它允许非代理连接绕过代理。
谢谢你!
答案1
答案:
您只想匹配 SYN 的原因有两个。首先,所有后续建立的数据包都将通过 conntrack (您询问的第二行)传递。任何东西都是不是由 conntrack 匹配并且也不是 SYN 是一个未建立的数据包并且不属于。因此,此时它会被忽略,然后最终被过滤器表中的最后一条规则删除。这是保护代理进程免受用户活动影响的一种方法。例如,某些形式的网络探测开始发送 ACK 或 FIN 只是为了看看远程将如何反应,而某些应用程序在收到格式错误/意外的数据包时会严重死机。
为什么明确允许 conntrack-ed 流量?因为最后一行不加区别地丢弃了所有内容。离开丢弃并删除 conntrack 会丢弃代理与客户端通信的数据包。这里有一个非常细微的区别。基于 uid 所有者匹配的行仅匹配数据包生成的由代理所有者。从客户端发送到代理的传入数据包是不是由代理拥有。
考虑下图:
[ client ] <---traffic---> [ proxy ] <---traffic---> [ target ]
左边是客户端和代理之间的流量不是由代理拥有(它是由系统外部不受信任的源创建的),因此与过滤器第 3 行不匹配,这意味着如果没有过滤器第 4 行,它将被过滤器第 6 行丢弃。
右侧代理与目标之间的流量是由代理拥有(它是由在本地 UID 下运行的进程创建的),因此始终被 nat 第 4 行和过滤器第 3 行允许。
具体就您的情况而言,由于它全部在本地运行,这可能不是最好的方法。您可以通过多种方式来制定iptables
规则。归根结底,这应该仍然对您有用。如果您了解有关 iptables 的更多信息,您可以修改规则,但也可以保持原样。
我希望这有帮助。这是一个相当复杂的话题。
答案2
你的问题的两部分都是相互关联的。
第 (1) 部分捕获 SYN 数据包并按照您的建议重定向它。从此时起,conntrack (2) 接管并识别该流中的每个后续数据包都是同一连接的一部分,并以与原始 SYN 数据包相同的方式对其进行重定向。
连接跟踪的概述可以在以下位置找到:http://en.wikipedia.org/wiki/Netfilter#Connection_Tracking
答案3
我需要使用 iptables 来重定向流量
不 - 您只需设置网络,以便这是唯一可以访问互联网的主机,并告诉其他所有主机将其用作路由器。
您需要的其他东西只是 NAT/伪装 - 试图让它充当代理是愚蠢的。