Squid 透明代理,用于已通过 DNAT 规则重定向的 HTTPS 请求

Squid 透明代理,用于已通过 DNAT 规则重定向的 HTTPS 请求

我想调查我的网络中可能受感染的 Web 应用程序的可疑活动。我想使用squid 来拦截带https_port指令的https 请求。

我的网络设置:http/https 请求通常发送到网关主机,无需在客户端设置任何代理。在网关上,它们通过 iptables 规则从原始目标 IP/端口重定向到代理主机:

iptables -t nat -A PREROUTING -p tcp --dport 80 -s CLIENT_IP -j DNAT --to-destination PROXY_IP:3128
iptables -t nat -A PREROUTING -p tcp --dport 443 -s CLIENT_IP -j DNAT --to-destination PROXY_IP:3130
iptables -t nat -A POSTROUTING -d CLIENT_IP -j MASQUERADE

在代理服务器上安装了版本 4.13 的鱿鱼,并包含以下选项:

...
 --with-gnutls \
 --with-openssl \
 --enable-ssl \
 --enable-ssl-crtd \

鱿鱼配置:

acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports

acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all

http_port 3128
http_port 3129 intercept

https_port 3130 intercept ssl-bump tls-cert=/etc/squid/cert/myCA.pem dynamic_cert_mem_cache_size=16MB generate-host-certificates=on 

sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 16MB

acl step1 at_step SslBump1

ssl_bump peek step1
ssl_bump bump all
ssl_bump splice all

coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
  • 我添加了另一个重定向规则,这次是在代理服务器上:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3128 -j REDIRECT --to-port 3129

这个固定的http拦截和我从客户端对http网站的curl尝试正在起作用。类似的设置没有修复 https 拦截,实际上它从未到达原始服务器,如果我尝试,访问日志上方的鱿鱼设置会打印这些行curl -v https://stackexchange.com/

1692864790.326      5 CLIENT_IP TCP_DENIED/200 0 CONNECT PROXY_IP:3130 - HIER_NONE/- -
1692864790.331      0 CLIENT_IP NONE/403 3791 GET https://stackexchange.com/ - HIER_NONE/- text/html

我知道它被拒绝,因为 http_access 规则不允许该端口,但它根本不应该转到 proxy_ip 。我测试了各种 ssl_bump 指令选项,但它们都无法使 ssl 通信正常工作。

例如,当允许 3130 端口时,它会在循环中结束

1692871715.986  60813 CLIENT_IP NONE/200 0 CONNECT PROXY_IP:3130 - ORIGINAL_DST/PROXY_IP -
1692871715.986  60807 PROXY_IP NONE/200 0 CONNECT PROXY_IP:3130 - ORIGINAL_DST/PROXY_IP -
1692871715.986  60807 PROXY_IP NONE/200 0 CONNECT PROXY_IP:3130 - ORIGINAL_DST/PROXY_IP -
1692871715.986  60807 PROXY_IP NONE/200 0 CONNECT PROXY_IP:3130 - ORIGINAL_DST/PROXY_IP -
1692871715.986  60806 PROXY_IP NONE/200 0 CONNECT PROXY_IP:3130 - ORIGINAL_DST/PROXY_IP -
1692871715.986  60806 PROXY_IP NONE/200 0 CONNECT PROXY_IP:3130 - ORIGINAL_DST/PROXY_IP -
1692871715.986  60806 PROXY_IP NONE/200 0 CONNECT PROXY_IP:3130 - ORIGINAL_DST/PROXY_IP -
1692871715.986  60805 PROXY_IP NONE/200 0 CONNECT PROXY_IP:3130 - ORIGINAL_DST/PROXY_IP -
1692871715.986  60805 PROXY_IP NONE/200 0 CONNECT PROXY_IP:3130 - ORIGINAL_DST/PROXY_IP -
1692871715.986  60805 PROXY_IP NONE/200 0 CONNECT PROXY_IP:3130 - 
...
...

https_port侦听器工作并且客户端到达目的地的唯一情况是当我使用 env 时。客户端变量:https_proxy=https://PROXY_IP:3130/https_port 处于默认转发代理模式/没有 intecept ssl-bump/但我不想使用 env。变量,我需要透明代理。

我对这个问题和疑问的分析:

网关主机上的 DNAT 重定向规则会更改 https 数据包的目标 IP,而鱿鱼无法将原始 IP 设置回原来的位置,并不断将它们发送到代理 IP,这导致了上面奇怪的 access.log 记录。我知道鱿鱼能够通过附加重定向规则修复http数据包,但不能修复https。

我在各个论坛上阅读了很多类似的问题,并尝试调整他们的配置,但没有解决方案解决我的问题,我认为这是因为所有教程都希望客户端将请求发送到代理作为其默认网关,而不是在第三个方面使用 DNAT 规则主机就像我的情况一样。

请您知道鱿鱼中是否有解决方案,可以使用 https 数据包标头中的原始目标 IP,插入“欺骗”一个或其他选项来修复数据包?

感谢您的任何见解。

相关内容