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.