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

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.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.