🔗 使用 Squid-2、TPROXYv2 和 WCCP 实现完全透明拦截
🔗 目录
这是一项进行中的工作(意思:Adrian 在撰写权威文档时记录 TPROXY 文档笔记的地方。)
以下文档适用于运行在 Linux 机器上的 Squid-2 WCCPv2 支持和 TPROXYv2 支持。如果您使用的是较新版本,具体的配置选项可能会有所不同。
Balabit 现在仅支持 TPROXY v4.1,它已集成到 3.1 squid 代码中(请参阅 Features/Tproxy4)
Squid-3.1 的配置与以下文档差异很大。
🔗 用法
(来自 Steve Wilton 的电子邮件内容)
内核和 iptables 需要使用 tproxy 补丁进行修补(并且 tproxy 头文件需要放置在 /usr/include/linux/netfilter_ipv4/ip_tproxy.h 或 squid 源树中的 include/netfilter_ipv4/ip_tproxy.h)。
iptables 规则需要使用 TPROXY 目标(而不是 REDIRECT 目标)将端口 80 的流量重定向到代理。即:
iptables -t tproxy -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j TPROXY --on-port 80
内核必须从传入的数据包中剥离 GRE 头(可以使用 ip_wccp 模块,或者在 Linux 中设置一个指向路由器的 GRE 隧道(路由器上不需要 GRE 设置)。)
wccp2_service dynamic 80
wccp2_service_info 80 protocol=tcp flags=src_ip_hash priority=240 ports=80
wccp2_service dynamic 90
wccp2_service_info 90 protocol=tcp flags=dst_ip_hash,ports_source priority=240 ports=80
强烈建议使用上述定义来配置两个 wccp 服务,否则如果您有多个缓存(特别是当一个 Web 服务器的名称解析为多个 IP 地址时),将会出现问题。
您重定向到的 http_port 必须启用 transparent 和 tproxy 选项,如下所示(根据需要修改端口):
http_port 80 transparent tproxy
必须定义一个 tcp_outgoing_address。这将需要有效,以满足任何非 tproxied 连接。
在路由器上,您需要确保所有进出客户的流量都将由*两个* wccp 规则处理。我们的实现方式是,将 wccp 服务 80 应用于从面向客户的接口传入的所有流量,并将 wccp 服务 90 应用于从面向客户的接口传出的所有流量。我们还将 wccp“exclude-in”规则应用于从面向代理的接口传入的所有流量。即:
interface GigabitEthernet0/3.100
description ADSL customers
encapsulation dot1Q 502
ip address x.x.x.x y.y.y.y
ip wccp 80 redirect in
ip wccp 90 redirect out
interface GigabitEthernet0/3.101
description Dialup customers
encapsulation dot1Q 502
ip address x.x.x.x y.y.y.y
ip wccp 80 redirect in
ip wccp 90 redirect out
interface GigabitEthernet0/3.102
description proxy servers
encapsulation dot1Q 506
ip address x.x.x.x y.y.y.y
ip wccp redirect exclude in
强烈建议在 squid conf 中启用 httpd_accel_no_pmtu_disc。
如果您有一些客户端设置了代理,建议为透明/tproxy 请求使用与已设置代理的客户端不同的 squid 端口。
(下一封电子邮件)
Squid-2.6 中的 tproxy 支持不需要以 root 身份运行。它始终为网络请求维护 root 权限(允许 tproxy 补丁工作),而无需维护所有 root 权限。
(下一封电子邮件)
我想在之前列出的 tproxy + wccpv2 的要求列表中添加以下内容:
-
您必须确保内核中的 rp_filter 已禁用
-
您必须确保内核中的 ip_forwarding 已启用
请检查您是否已在内核中启用了 ip_forwarding。如果不行,我不知道 squid 配置中的 http_port 行是否需要“vhost vport=80”(我们的代理未启用这些选项)。
我使用 ip_wccp 模块来让内核正确处理 GRE 数据包(其工作方式与 ip_gre 模块略有不同)。您是否在 Linux 中设置了 GRE 隧道?如果是,您正在运行什么命令来设置它?我这里没有示例,但我相信其他人正在使用 ip_gre 模块配合 wccp 来处理 GRE 数据包,应该能够提供帮助。
(用户的回复)
嗨,Steve
终于成功了……
我的步骤如下:
- 安装 squid-2.6.s1 + FD-patch_from_you + balabit 的 cttproxy-patch 用于内核和 iptables tproxy
-
创建 gre 隧道
insmod ip_gre ifconfig gre0 <use ip address within loopback0 router subnet> up -
禁用 rp_filter 并启用转发
echo 0 > /proc/sys/net/ipv4/conf/lo/rp_filter echo 1 > /proc/sys/net/ipv4/ip_forward -
iptables
iptables -t tproxy -A PREROUTING -p tcp -m tcp -i gre0 --dport 80 -j TPROXY --on-port 80 -
squid.conf
http_port 80 transparent tproxy vhost vport=80 always_direct allow all wccp2_router y.y.y.y wccp2_forwarding_method 1 wccp2_return_method 1 wccp2_service dynamic 80 wccp2_service dynamic 90 wccp2_service_info 80 protocol=tcp flags=src_ip_hash priority=240 ports=80 wccp2_service_info 90 protocol=tcp flags=dst_ip_hash,ports_source priority=240 ports=80 -
路由器配置 (cisco)
ip wccp 80 ip wccp 90 int fasteth0 -->ip wccp 90 redirect out (gateway to internet) int fasteth1 -->ip wccp 80 redirect out (my client gateway) int fasteth3 -->ip wccp redirect exclude in (squid-box attached here) - 检查 access.log -> 是的,它在增加;检查我的电脑:
- 打开 whatismyipaddress.com -> 是的,这是我电脑的 IP。
现在,我明天将尝试优化我的盒子和 squid.conf。
🔗 另一个示例
- 邮件列表帖子:https://squid.org.cn/mail-archive/squid-users/200705/0443.html 和 https://squid.org.cn/mail-archive/squid-users/200705/0447.html
🔗 参考资料
- Squid Features/Tproxy4
⚠️ Disclaimer: Any example presented here is provided "as-is" with no support
or guarantee of suitability. If you have any further questions about
these examples please email the squid-users mailing list.
类别: ConfigExample
导航:网站搜索、网站页面、分类、🔼 向上