透明代理支援¶
此特性為當前核心添加了類似於 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