You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

结合DNSmasq智能DNS场景,实现无SSL终止的HTTP/HTTPS流量转发至外部Squid代理的配置方案咨询

结合DNSmasq智能DNS场景,实现无SSL终止的HTTP/HTTPS流量转发至外部Squid代理的配置方案咨询

首先肯定地告诉你,这个需求完全可以实现!结合你已经配置好的DNSmasq(把指定域名解析到你的服务器),我们可以用HAProxy或者Nginx来完成无SSL终止的流量转发,核心思路是让你的服务器作为中间转发层,把HTTP请求转换成代理格式发给Squid,HTTPS流量则直接做TCP透传(让客户端和Squid直接建立SSL隧道,你的服务器完全不碰加密内容)。下面是具体的配置方案和关键细节:

一、核心原理梳理

你的场景核心是:

  • 客户端请求特定域名 → DNSmasq解析到你的服务器
  • 服务器收到80/443请求后,不需要解密HTTPS(因为没有证书),直接把流量转发给外部Squid代理
  • Squid作为代理完成实际的请求处理(包括HTTPS的SSL握手)

针对HTTP和HTTPS的不同特性,我们需要分开处理:

  • HTTP(80端口):客户端发送普通HTTP请求,我们把它转换成标准的HTTP代理请求(即让服务器向Squid发送GET http://目标域名/路径 HTTP/1.1格式的请求)
  • HTTPS(443端口):客户端会先发送CONNECT 目标域名:443 HTTP/1.1请求建立隧道,我们只需要把这个请求透传给Squid,后续的SSL加密流量完全不处理,直接转发即可

二、使用HAProxy实现完整配置

HAProxy的TCP模式天生适合做无终止的流量转发,同时HTTP模式也能轻松完成代理请求转换。

1. HTTP(80端口)转发配置

把客户端的普通HTTP请求转换成代理格式发给Squid:

frontend http_front
    bind *:80
    mode http
    # 关键:将客户端的请求路径拼接成完整的代理URL(比如把 /index.html 改成 http://目标域名/index.html)
    http-request set-path %[req.hdr(Host)]%[req.path]
    # 保留原请求方法(GET/POST等),不需要强制GET的话可以删除下面这行
    # http-request set-method GET
    default_backend squid_http_backend

backend squid_http_backend
    mode http
    # 指向你的外部Squid代理IP和端口
    server squid_proxy 111.22.32.11:3323
    # 传递客户端真实IP给Squid
    http-request set-header X-Forwarded-For %[src]

2. HTTPS(443端口)TCP透传配置

直接转发客户端的CONNECT请求和后续SSL流量,完全不处理加密内容:

frontend https_front
    bind *:443
    mode tcp
    # 可选:开启ssl_preread可以获取SNI信息,但如果不需要做路由判断的话可以不用
    # ssl_preread on
    default_backend squid_https_backend

backend squid_https_backend
    mode tcp
    server squid_proxy 111.22.32.11:3323

三、使用Nginx实现完整配置

Nginx的stream模块处理HTTPS的TCP透传,http模块处理HTTP的代理请求转换。

1. HTTP(80端口)转发配置

将普通HTTP请求转换成代理格式转发给Squid:

http {
    server {
        listen 80;
        location / {
            # 转发到Squid的代理端口
            proxy_pass http://111.22.32.11:3323;
            # 传递客户端请求的Host头,让Squid知道目标域名
            proxy_set_header Host $host;
            # 传递客户端真实IP
            proxy_set_header X-Forwarded-For $remote_addr;
            # 关键:让Nginx构造完整的代理请求URL
            proxy_set_header Request-URI http://$host$request_uri;
        }
    }
}

2. HTTPS(443端口)TCP透传配置

stream模块直接转发流量,无需SSL终止:

stream {
    server {
        listen 443;
        # 直接转发到Squid代理端口
        proxy_pass 111.22.32.11:3323;
        # 优化TCP传输延迟
        tcp_nodelay on;
        # 可选:开启ssl_preread获取SNI信息,无需证书
        # ssl_preread on;
    }
}

四、关键测试与注意事项

  1. 验证Squid支持CONNECT请求:确保你的外部Squid代理允许CONNECT请求(默认Squid是允许443端口的CONNECT请求的,如果你不确定可以联系Squid管理员确认)
  2. 测试命令
    • HTTP测试:curl -v http://你的目标域名 --dns-servers 你的DNSmasq服务器IP
    • HTTPS测试:curl -v https://你的目标域名 --dns-servers 你的DNSmasq服务器IP
  3. 不需要SSL证书:因为HTTPS流量是透传的,你的服务器不需要持有目标域名的SSL证书,完全由客户端和Squid完成SSL握手
  4. 防火墙配置:确保你的服务器开放80和443端口,并且允许出站访问Squid的3323端口

备注:内容来源于stack exchange,提问作者loxtic

火山引擎 最新活动