根据源IP的Nginx TCP流路由

根据源IP的Nginx TCP流路由

我已经将 nginx 配置为 TCP(非 http)流的反向代理。我想对特定源 IP 地址应用不同的路由 - 可以这样做吗?如何做?我知道使用 http 模块的建议如果指令,但这对这些流似乎不起作用。

现有配置:

stream {
  server {
    listen 8000;
    proxy_pass staging;
  }
}

upstream staging {
    server 1.2.3.4:8000;
}

所需配置(不起作用):

stream {
  server {
    listen 8000;
    proxy_pass staging1;
    if ( $remote_addr ~* 4.5.6.7 ) {
        proxy_pass staging2;
    }
  }
}

upstream staging1 {
    server 1.2.3.4:8000;
}
upstream staging2 {
    server 1.2.3.44:8000;
}

这会出现错误‘24314#24314:“if”指令在这里不允许’,因为它不适用于流模块——还有其他功能可以帮助我实现类似的结果吗?

答案1

你可以使用指令map来实现这个行为。类似这样。

stream {
    upstream staging1 {
        server 1.2.3.4:8000;
    }

    upstream staging2 {
        server 1.2.3.44:8000;
    }

    map $remote_addr $upstream {
        4.5.6.7     staging2;
        default     staging1;
    }

    server {
        listen 8000;
        proxy_pass $upstream;
    }
}

相关内容