目前,我的 IPtable 会不加区分地将所有传入请求发送到我的 Squid 透明代理。但是,由于我需要 SSL 才能工作,因此我需要一种方法来避免拦截 SSL 流量。
主意
- example.com -> IP= 100.100.100.1
- http 访问 example.com -> 发送到 Squid 代理
- https 访问 example.com -> 拦截 100.100.100.1:443 的请求;不是将其发送到 Squid 代理,而是将其重定向回 example.com 的 IP 100.100.100.1
可以在 iptable 中执行此操作吗?谢谢!
编辑:我正在添加更多有关我的设置的信息。
- 最终客户
- DNS 服务器
- 鱿鱼盒
由于特定要求,我必须使用 DNS 重定向而不是典型的路由器/网关重定向将流量发送到 Squid 透明代理。
拦截方法
- 用户请求 www.example.com
- DNS 服务器将 www.example.com 指向 Squid 服务器
- Squid 服务器拦截 www.example.com 请求
现行 IP 表规则
- 将端口 80 转发到端口 3128(Squid 端口)
- 将端口 443 转发到端口 3128(Squid 端口)
显然,您正在使用典型的路由器/网关将流量转发到 Squid,您可以只转发端口 80 并忽略 443,因为 443 流量将直接通过,绕过 Squid。
不幸的是,使用我当前的设置,如果我不转发 443,任何 https 连接都会超时。
现在唯一的解决方案是拦截所有 443 请求,将每个域与每个唯一的 IP 地址映射,然后将请求发送回原始源 IP。
我尝试使用 Rinetd 将 443 转发到原始网站的 IP 地址。不幸的是,这种方法会将我所有的 443 流量转发到仅 1 个 IP 地址,因为它不会区分请求 IP。
例如,我将 443 映射到 Gmail.com 的 IP。当我访问https://gmail.com,它将正常工作。但是,如果我访问https://hotmail.com,它仍然会将我发送到 gmail.com 的 IP
我需要找到一种方法将每个 IP 与每个域进行映射,这样当我访问 gmail.com 时,它会转发到 gmail 的 IP;当我访问 hotmail.com 时,它会将我转发到 hotmail.com 的 IP
答案1
你所描述的是“透明 SSL 代理”,它实际上并不存在(因为向前这种情况;它可以用于 SSL 加速器)。让我们看看为什么:
- 客户端尝试解析serverfault.com。
- 您的“虚构 DNS”服务器返回 Squid 盒的地址。
- 客户端连接到 squidbox:443 并尝试启动 TLS 会话。
此时需要交换证书等等。
但是……Squid 机器如何知道真正被访问的站点是什么(即要连接到哪个远程主机)?客户端不会告诉 SSL 服务器它期望的站点是什么——它依赖于服务器已经知道这一点!这是 SSL 安全功能的一部分。
这与 iptables 存在同样的问题——它如何知道客户端真的想要吗?该信息根本无法获得(因为“虚构的 DNS”服务器已将其丢弃)。
我知道代理 SSL 的唯一方法是通过方法CONNECT
;为此,您需要指定 Squid 框作为明确的代理人。
老实说,问题出在 DNS 重定向上。我很困惑为什么不能使用 iptables 重定向端口 80 而保留 443 不变。
答案2
您不能使用 iptables 将 https 流量(443)重定向到任何端口。
例如:eth1 localnet 和 eth0 internet
你可以这样做:
重定向 http 流量 LAN (eth1)。在 squid.conf 中必须有规则:http_port 8080 拦截(透明代理)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
向localnet开放443端口,squid.conf必须是规则http_port 3128(非透明代理)
iptables -A INPUT -i eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp --dport 443 -o eth0 -j ACCEPT
你不可以做这个:
将 https 流量 LAN (eth1) 重定向到 squid 代理非透明端口 3128 (https)(假规则)。squid.conf 中是否存在规则并不重要:http_port 3128
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j REDIRECT --to-port 3128
备择方案:
- 中间的鱿鱼 SSL 碰撞
- 使用 DNS 过滤,而不是代理(例如pi 孔)但它比 squid 慢,并且不过滤协议通过 HTTPS 进行 DNS