重定向特定传入 IP 地址的 443 流量?

重定向特定传入 IP 地址的 443 流量?

目前,我的 IPtable 会不加区分地将所有传入请求发送到我的 Squid 透明代理。但是,由于我需要 SSL 才能工作,因此我需要一种方法来避免拦截 SSL 流量。

主意

  1. example.com -> IP= 100.100.100.1
  2. http 访问 example.com -> 发送到 Squid 代理
  3. https 访问 example.com -> 拦截 100.100.100.1:443 的请求;不是将其发送到 Squid 代理,而是将其重定向回 example.com 的 IP 100.100.100.1

可以在 iptable 中执行此操作吗?谢谢!

编辑:我正在添加更多有关我的设置的信息。

  1. 最终客户
  2. DNS 服务器
  3. 鱿鱼盒

由于特定要求,我必须使用 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 加速器)。让我们看看为什么:

  1. 客户端尝试解析serverfault.com。
  2. 您的“虚构 DNS”服务器返回 Squid 盒的地址。
  3. 客户端连接到 squidbox:443 并尝试启动 TLS 会话。
  4. 此时需要交换证书等等。

    但是……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

备择方案:

  1. 中间的鱿鱼 SSL 碰撞
  2. 使用 DNS 过滤,而不是代理(例如pi 孔)但它比 squid 慢,并且不过滤协议通过 HTTPS 进行 DNS

相关内容