Вимкнути IPv6 в nginx proxy_pass


18

Мій сервер не має адреси IPv6.

Однак, коли я використовую Nginx proxy_pass для висхідного потоку з IPv4 та IPv6, іноді він намагається надсилати вихідні запити за допомогою 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"

Як я можу відключити IPv6 для вихідних запитів у 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

ОС: 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

Це відбувається після того, як ви зробите це sudo sysctl -w net.ipv6.bindv6only=0?
Flup

Flup, net.ipv6.bindv6only = 0 не допомагає
Антон

Це, безумовно, виглядає неправильно. Ви повинні мати принаймні локальні адреси IPv6 посилань. Які зміни ви або ваш постачальник внесли в конфігурацію цього сервера?
Майкл Хемптон

Ми додали лише net.ipv6.conf.all.disable_ipv6 = 1. Наш постачальник не призначає IPv6 за допомогою DHCP, тому його потрібно налаштувати вручну.
Антон

Чи потрібно вирішити це конкретно за допомогою nginx config, не змінюючи глобальних налаштувань системи?
Дмитро Полушкин

Відповіді:



1

Використання resolverне працювало для мене під час використання proxy_passURL-адреси https. Мені довелося змінити sysctl.

  1. Додайте в рядки наступні рядки /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. Перезавантажте систему з sysctl -p.
  3. Перезавантажте nginx за допомогою sudo nginx -s reload.

Вирішив мою проблему з Flickr.
GaryBishop

Це вирішило мою проблему, але тепер у журналі помилок відображаються скарги (99: Неможливо призначити запитувану адресу), хоча запит, очевидно, успішний. Я просто хотів би розібратися, як запобігти спробі адреси ipv6.
GaryBishop

Додавання ipv6 = off до резолютора в nginx разом з цим виправляє його та усуває повідомлення про помилки.
GaryBishop

0

Жодне з вищезазначених рішень не працювало для мене, схоже, що визначення роздільної здатності використовується в якомусь окремому випадку Nginx, і він зазвичай вирішує IP за допомогою системного резолютора.

Моїм остаточним рішенням було визначити єдиний IPv4 для мого проксі-хоста в / etc / hosts та перезапустити Nginx

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.