【问题标题】:nginx behind haproxy to static html ssl getting real IP addressnginx背后的haproxy到静态html ssl获取真实IP地址
【发布时间】:2019-11-27 15:10:12
【问题描述】:

我的问题是在 nginx 级别从网络获取“真实”IP 地址,通过 ssl 为静态 vuejs 站点提供服务。

我想阻止某些IP地址,如果我不能使用代理通行证,我怎样才能获得真实的IP地址,因为我只链接到一个静态位置?

haproxy (tcp) (port: 443) ==> 加密请求 ==> nginx (port: 8085) 请求传递到 ==> '/' 位置获取真实 IP 以进行范围阻塞。

另请参阅 nginx vhost 文件中的问题/cmets。我是在正确的轨道上还是需要完全不同的方式?

haproxy 设置:

frontend ssl_front_433 xx.xx.xx.xx:443
    mode tcp
    option tcplog
    use_backend ssl_nginx_backend_8085

backend ssl_nginx_backend_8085
    mode tcp
    balance roundrobin
    option  tcp-check
    server  srv-2 127.0.0.1:8085  check  fall 3 rise 2 inter 4s

nginx 设置:

server {
   listen 8085 ssl;
   server_name mydomain;

   access_log /var/log/nginx/access.log;
   error_log  /var/log/nginx/error.log;

   ssl_certificate      ./fullchain.pem;
   ssl_certificate_key  ./privkey.pem;
   include include.d/ssl.conf;

   // I want to only allow certain ip addresses
   // haproxy of course always returns 127.0.0.1 thus this is not working 
   include include.d/ip_range.conf;  

   location / {
        //how to get the proxy headers to be applied here?
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        // do I need a proxy pass and if so where should I pass to,
        // in order to use it with static html/js?
        // can I use an upstream to a static location?
        //proxy_pass http://;
        try_files $uri $uri/ /index.html;
   }
}

【问题讨论】:

标签: linux vue.js nginx haproxy


【解决方案1】:

在 nginx 端,您可以使用deny allallow 范围来控制允许哪些 IP 地址或范围到您的服务器块,如下所示:

allow  192.168.1.0/24;
deny   all;

注意:nginx 文档总是一个很好的起点,这里是restricting access by IP addresses 和范围的文档。

首先,我会挑战您重新考虑为什么需要一个带有 haproxy 的负载均衡器来处理像 html/css/js 静态站点这样简单的事情。更多的基础设施会带来更多的复杂性。

其次,仅当您想将请求指向本地 wsgi 服务器时才需要 nginx 中的上游,例如,在您的情况下,这是静态内容,因此您不需要指向上游 - 除非您有一些您要将请求转发到的某种 wsgi 服务。

最后,对于 haproxy 仅将请求转发为 127.0.0.1,首先确保 IP 在标头中(即X-Real-IP),然后您可以尝试将类似这样的内容添加到您的 haproxy 配置中(source),如果您确实想保留 haproxy:

frontend all_https
  option forwardfor header X-Real-IP
  http-request set-header X-Real-IP %[src]

haproxy 文档也是preserving source IP addresses 的一个很好的资源。

【讨论】:

  • 允许和拒绝是在我的包含 ip_range 中完成的,与问题无关。为了拒绝和允许,我需要真实的 IP 地址。 haproxy 不会触及 http 标头,因为它以加密形式处理请求并将其传递给 nginx。然后 nginx 将其解压缩并读取标题。此时所有请求都来自 haproxy 的 127.0.0.1。因此,我需要 nginx 将这些标头刮掉,并告诉我真实的 IP 和天气是否允许。
  • 在您的“第二”点上,上游用于各种后端服务/套接字,而不仅仅是 wsgi。
  • 您是否确认 IP 地址在标头中?例如,如果您在前端使用 PHP 之类的东西,您可能需要在配置中启用它。无论如何,一旦您确保您的标头确实存在,允许和拒绝仍然有用,它不会与您的解决方案无关。上游的事情是一个红鲱鱼,与IP转发无关,一个wsgi场景只是一个“例如”用例,但即使一个套接字被用于另一个你没有也不需要的服务,使用静态网站。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2011-09-02
  • 2012-09-26
  • 2019-02-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多