透明代理支持¶
此特性为当前内核添加了类似于 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”传递给 configure,并在您使用 TPROXY iptables 目标将流量重定向到的 HTTP 监听器上设置“tproxy”选项。
有关更多信息,请查阅 Squid wiki 上的以下页面:http://wiki.squid-cache.org/Features/Tproxy4