Wyłącz IPv6 w nginx proxy_pass

18

Mój serwer nie ma adresów IPv6.

Jednak gdy używam Nginx proxy_pass do przesyłania z IPv4 i IPv6, czasami próbuje wysyłać żądania wychodzące przy użyciu IPv6:

2013/07/30 00:25:06 [error] 1930#0: *1482670 connect() to [AAAA:BBBB:C:DDD:E:F:GGG:HHH]:443 failed (101: Network is unreachable) while connecting to upstream, client: AA.BB.CC.DD, server: example.com, request: "GET /download/file HTTP/1.0", upstream: "https://[AAAA:BBBB:C:DDD:E:F:GGG:HHH]:443/download/file", host: "example.com"

Jak mogę wyłączyć IPv6 dla wychodzących żądań w proxy_pass?

nginx.conf:

upstream download {
  server download.example.com:443;
  keepalive 8;
}

location /download {
  proxy_set_header      X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_set_header      Connection "";
  proxy_ignore_headers  X-Accel-Redirect;
  proxy_http_version    1.1;
  resolver              8.8.8.8;
  resolver_timeout      5s;
  proxy_pass            https://download;
}

nginx -V:

nginx version: nginx/1.4.2
built by gcc 4.7.2 (Debian 4.7.2-5)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_spdy_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt=-Wl,-z,relro --with-ipv6

System operacyjny: Debian Wheezy

Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux

ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 6c:62:6d:7a:ea:af brd ff:ff:ff:ff:ff:ff
    inet XXX.XXX.XXX.XXX/27 brd XXX.XXX.XXX.XXX scope global eth0
Anton
źródło
Czy to się stanie po tobie sudo sysctl -w net.ipv6.bindv6only=0?
Flup,
Flup, net.ipv6.bindv6only = 0 nie pomaga
Anton
To zdecydowanie wygląda źle. Powinieneś mieć co najmniej adresy lokalne dla łącza IPv6. Jakie zmiany zostały wprowadzone przez Ciebie lub Twojego dostawcę w konfiguracji tego serwera?
Michael Hampton
Dodaliśmy tylko net.ipv6.conf.all.disable_ipv6 = 1. Nasz dostawca nie przypisuje IPv6 za pomocą DHCP, więc należy go skonfigurować ręcznie.
Anton
Czy istnieje sposób na rozwiązanie tego problemu przy pomocy konfiguracji nginx bez zmiany globalnych ustawień systemowych?
Dmitry Polushkin

Odpowiedzi:

1

Korzystanie z resolvernie działało dla mnie podczas korzystania proxy_passz adresu URL https. Musiałem zmodyfikować sysctl.

  1. Dodaj następujące wiersze /etc/sysctl.conf.
    net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 net.ipv6.conf.eth0.disable_ipv6 = 1 net.ipv6.conf.eth1.disable_ipv6 = 1 net.ipv6.conf.eth2.disable_ipv6 = 1 net.ipv6.conf.eth3.disable_ipv6 = 1
  2. Uruchom ponownie system za pomocą sysctl -p.
  3. Uruchom ponownie nginx za pomocą sudo nginx -s reload.
Gabriel
źródło
Rozwiązałem mój problem z proxy Flickr.
GaryBishop
Rozwiązało to mój problem, ale teraz dziennik błędów pokazuje skargi (99: Nie można przypisać żądanego adresu), nawet jeśli żądanie najwyraźniej się powiedzie. Chciałbym tylko dowiedzieć się, jak zapobiec próbowaniu adresu IPv6.
GaryBishop
Dodanie ipv6 = off do resolvera w nginx wraz z tym naprawia to i eliminuje komunikaty o błędach.
GaryBishop
0

Żadne z powyższych rozwiązań nie działało dla mnie, wydaje się, że definicje resolvera są używane w szczególnych przypadkach przez Nginx i zwykle rozwiązuje IP za pomocą resolvera systemowego.

Moim ostatecznym rozwiązaniem było zdefiniowanie pojedynczego IPv4 dla mojego hosta proxy w / etc / hosts i zrestartowanie Nginx

Ali Nadalizadeh
źródło