透明代理支持¶
此功能为当前内核添加了类似 Linux 2.2 的透明代理支持。要使用它,请在您的内核配置中启用套接字匹配和 TPROXY 目标。您还需要策略路由,因此请确保也启用它。
从 Linux 4.18 开始,透明代理支持也可在 nf_tables 中使用。
1. 使非本地套接字工作¶
其思路是识别目标地址与您计算机上的本地套接字匹配的数据包,将数据包标记设置为特定值
# iptables -t mangle -N DIVERT
# iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j DIVERT
# iptables -t mangle -A DIVERT -j MARK --set-mark 1
# iptables -t mangle -A DIVERT -j ACCEPT
或者,您可以使用以下 nft 命令执行此操作
# nft add table filter
# nft add chain filter divert "{ type filter hook prerouting priority -150; }"
# nft add rule filter divert meta l4proto tcp socket transparent 1 meta mark set 1 accept
然后使用策略路由匹配该值,以使这些数据包在本地传递
# ip rule add fwmark 1 lookup 100
# ip route add local 0.0.0.0/0 dev lo table 100
由于 IPv4 路由输出代码中的某些限制,您必须修改您的应用程序以允许它从非本地 IP 地址发送数据报。您所要做的就是在调用 bind 之前启用 (SOL_IP, IP_TRANSPARENT) 套接字选项
fd = socket(AF_INET, SOCK_STREAM, 0);
/* - 8< -*/
int value = 1;
setsockopt(fd, SOL_IP, IP_TRANSPARENT, &value, sizeof(value));
/* - 8< -*/
name.sin_family = AF_INET;
name.sin_port = htons(0xCAFE);
name.sin_addr.s_addr = htonl(0xDEADBEEF);
bind(fd, &name, sizeof(name));
netcat 的一个简单的补丁在这里可用:http://people.netfilter.org/hidden/tproxy/netcat-ip_transparent-support.patch
2. 重定向流量¶
透明代理通常涉及“拦截”路由器上的流量。这通常使用 iptables REDIRECT 目标完成;但是,该方法存在严重的局限性。主要问题之一是它实际上修改了数据包以更改目标地址 - 这在某些情况下可能是不可接受的。(例如,考虑代理 UDP:您将无法找到原始目标地址。即使在 TCP 的情况下,获取原始目标地址也是有竞争条件的。)
‘TPROXY’ 目标提供类似的功能,而不依赖于 NAT。只需像这样在上面的 iptables 规则集中添加规则
# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY \
--tproxy-mark 0x1/0x1 --on-port 50080
或在 nft 中添加以下规则
# nft add rule filter divert tcp dport 80 tproxy to :50080 meta mark set 1 accept
请注意,要使其正常工作,您必须修改代理以启用 (SOL_IP, IP_TRANSPARENT) 用于侦听套接字。
作为一个示例实现,tcprdr 在这里可用:https://git.breakpoint.cc/cgit/fw/tcprdr.git/ 此工具由 Florian Westphal 编写,在 nf_tables 实现期间用于测试。
3. Iptables 和 nf_tables 扩展¶
要使用 tproxy,您需要为 iptables 编译以下模块
NETFILTER_XT_MATCH_SOCKET
NETFILTER_XT_TARGET_TPROXY
或为 nf_tables 编译以下模块
NFT_SOCKET
NFT_TPROXY
4. 应用程序支持¶
4.1. Squid¶
Squid 3.HEAD 内置了支持。要使用它,请将 ‘--enable-linux-netfilter’ 传递给配置,并在您使用 TPROXY iptables 目标将流量重定向到的 HTTP 侦听器上设置 ‘tproxy’ 选项。
有关更多信息,请参阅 Squid wiki 上的以下页面:http://wiki.squid-cache.org/Features/Tproxy4