Двойные nginx в aws ec2 дают мне еще один ip

Задний план:
У меня AWS EC2 с эластичным IP. И у моего EC2 есть host-nginx, чтобы иметь дело с сертификатом ssl, не касаясь docker containers.

А в моем docker environment есть nginx, django, ...etc
nginx-container обслуживает media/static_files.

Я знаю, что nginx может настраивать header. Поэтому я добавляю префикс http перед его названием.

Мой host-nginx соответствует http_realip_module. Вот результат nginx -V

# nginx -V
nginx version: nginx/1.10.3
built with OpenSSL 1.1.0f  25 May 2017
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-2tpxfc/nginx-1.10.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-2tpxfc/nginx-1.10.3/debian/modules/nginx-auth-pam --add-dynamic-module=/build/nginx-2tpxfc/nginx-1.10.3/debian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-2tpxfc/nginx-1.10.3/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-2tpxfc/nginx-1.10.3/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-2tpxfc/nginx-1.10.3/debian/modules/ngx_http_substitutions_filter_module

хост-nginx.conf:

#
# UAT let everything serve through 8000. Development server
#
upstream app {
    server localhost:8000;
}

server {
    listen 80;
    server_name poink-dev.mycompany.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name poink-dev.mycompany.com;
    client_max_body_size 20M;
    add_header Strict-Transport-Security "max-age=31536000";
    ssl_certificate /home/admin/chained.crt;
    ssl_certificate_key /home/admin/wildcard.mycompany.com.key;
    real_ip_header      X-Forwarded-For;

    location / {
            proxy_pass_request_headers on;
            proxy_set_header           Host $host;
            proxy_pass                 http://app;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
    }

}

contianer-nginx.conf:

upstream app {
    server backend:8000;
}

server {
    listen       8000;
    server_name  localhost;
    client_max_body_size 20M;
    access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass_request_headers on;
        proxy_set_header           Host $host;
        proxy_pass                 http://app;
        proxy_set_header XX-Real-IP $http_x_real_ip;
        proxy_set_header XX-Forwarded-For $http_x_forwarded_for;
    }

    location /static {
        autoindex on;
        alias /var/www/static/;
    }

    location /media {
        autoindex on;
        alias /var/www/media/;
    }
}

разрешение.py:

def is_facebook_ip(client_address: str):
    """
    This one is faster than lookup on my own database
    """
    obj = IPWhois(client_address)
    results = obj.lookup_whois()
    asn_description = results.get('asn_description')
    return 'facebook' in asn_description.lower()

views.py:

@api_view(['GET', 'POST'])
@permission_classes(())
def read_header(request):
    remote_addr = request.META.get('REMOTE_ADDR')
    http_x_real_ip = request.META.get('HTTP_X_REAL_IP')
    http_xx_real_ip = request.META.get('HTTP_XX_REAL_IP')
    http_x_forwarded_for = request.META.get('X_FORWARDED_FOR')
    http_xx_forwarded_for = request.META.get('XX_FORWARDED_FOR')

    data = {
        'remote_addr': remote_addr,
        'http_x_real_ip': http_x_real_ip,
        'http_xx_real_ip': http_xx_real_ip,
        'http_x_forwarded_for': http_x_forwarded_for,
        'http_xx_forwarded_for': http_xx_forwarded_for,
    }
    return Response(data=data, status=status.HTTP_200_OK)

Вопрос:

http_x_real_ip = request.META.get('HTTP_X_REAL_IP')

Верните мне IP-адрес шлюза интернет-провайдера моей компании. Я не уверен, что мой код правильно получит IP-адреса Facebook. Поскольку моя программа показывает IP-адрес другого сайта myIP,

Ответ с моего сайта: 61.xxx.xxx.xxx
Ответ от других: 183.yyy.yyy.yyy

Где я не прав?

Установка X-Real-IP в качестве простого $ remote_addr будет подвержена ошибкам. Как правило, вы должны использовать его вместе с модулем real_ip в NGINX, который может просматривать IP-адреса источника X-Forwarded-For для доверенный, чтобы вернуться, пока не попадет на ненадежный IP-адрес. Так что, вероятно, некоторые сайты применяют XFF, а некоторые нет.

Joshua DeWald 11.04.2018 17:51

@JoshuaDeWald По этому поводу. Как я могу определить IP-адреса Facehook? Я обновил свой вопрос, чтобы показать свой permission на webhook api

joe 12.04.2018 05:56

Я думаю, вы захотите посмотреть, что находится в заголовке X-Forwarded-For, и увидеть там цепочку, а затем заглянуть в модуль real_ip для NGINX, который приблизит вас к тому, что вы пытаетесь сделать.

Joshua DeWald 13.04.2018 18:09

@JoshuaDeWald Я обновил свой вопрос в соответствии с вашим комментарием. К сожалению, у меня остался тот же IP-адрес. Я начал задаваться вопросом, может ли мой интернет-провайдер иметь несколько международных шлюзов.

joe 14.04.2018 13:21
0
4
70
0

Другие вопросы по теме