V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
awanganddong
V2EX  ›  NGINX

反向代理提示该网站已被拦截,请教

  •  
  •   awanganddong · 35 天前 · 1666 次点击
    这是一个创建于 35 天前的主题,其中的信息可能已经有所发展或是发生改变。

    域名是在阿里云,服务器 a 也是在阿里云。 然后通过反向代理指向本地服务器 b 。

    如果在 nginx 配置中增加下边几项就报上边的错误。

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    

    如果去除这几项就正常了。

    所以想请问下,这种情况是怎么造成的。不理解。

    8 条回复    2024-11-21 16:14:37 +08:00
    jucelin
        1
    jucelin  
       35 天前
    拦截是不是未备案拦截?
    InDom
        2
    InDom  
       35 天前
    这几个 header 主要分两类,

    proxy_set_header Host $host; 指定了一个主机名, 检查是否正确指向目标服务器,以及目标服务器是否允许接受这个 host.

    剩下的都是关于“构造、伪造”客户端 IP 的流程, 不是说你在伪造, 而是有可能被目标系统认为你在伪造,所以检查到目标服务器(到程序)的链路中是否做了类似的判断.
    summerwar
        3
    summerwar  
       35 天前
    贴下 nginx 的完整配置和日志的完整信息,搞技术又不能靠猜,除非之前自己遇到过
    awanganddong
        4
    awanganddong  
    OP
       35 天前
    @jucelin 拦截是该网站已被拦截提示。
    没有其他的消息。

    这些 proxy_set_header 配置项主要是用于传递客户端的请求信息给后端服务器,不会直接检测或暴露后端服务器的相关信息,但可能会间接影响到访问。以下是这些配置项的作用和对后端服务器的影响:

    proxy_set_header Host $host;

    这个配置项会将客户端请求的域名信息传递给后端,目的是让后端服务器“认为”它正在直接接收来自用户的请求,而不是来自代理服务器。
    不会暴露后端信息:只是转发客户端请求的主机信息,对后端服务器的配置或 IP 没有直接暴露作用。
    proxy_set_header X-Real-IP $remote_addr;

    将客户端的真实 IP 地址传递给后端,以便后端服务器可以识别用户的真实来源 IP 。
    不会暴露后端信息:此头信息用于传递客户端 IP ,只影响后端获取的用户 IP 信息。
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    将用户的真实 IP 地址和代理链(经过的代理服务器 IP )传递给后端服务器,以帮助后端识别请求的来源链条。
    不会暴露后端信息:该头信息只是用来传递经过的代理链信息,不包含后端服务器的配置信息。
    proxy_set_header X-Forwarded-Proto $scheme;

    这个配置项传递了用户请求的协议( HTTP 或 HTTPS )信息给后端服务器,使后端知道客户端请求的原始协议。
    不会暴露后端信息:此配置仅包含客户端协议信息,对后端服务器没有信息泄露的风险。


    所以是很奇怪的
    mmdsun
        5
    mmdsun  
       35 天前
    做了校验不让反代 你把 hosts 设置你要代理的网址试试看。

    location /otherweb/ {
    proxy_pass https://test.com.cn/;
    proxy_set_header Host "test.com.cn";
    yinmin
        6
    yinmin  
       35 天前
    是这行命令造成的:proxy_set_header Host $host;
    awanganddong
        7
    awanganddong  
    OP
       35 天前
    @yinmin @mmdsun 我刚测试了,确实是 proxy_set_header Host $host; 造成的。
    giantreaper0
        8
    giantreaper0  
       35 天前
    $host 和 $http_host 基本等同于当前浏览器的主机名,那肯定是 a, 服务器 b 识别出来不是 b 所以提示拦截。
    有两种解决方式
    1. proxy_set_header Host "example.com"; // 写死被代理服务器的主机名
    2. proxy_set_header Host $proxy_host; // 自动根据 proxy_pass 的后端地址生成
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3406 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:18 · PVG 19:18 · LAX 03:18 · JFK 06:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.