resolver: A vs AAAA

Ruslan Ermilov ru на nginx.com
Ср Дек 14 16:23:59 UTC 2016


On Wed, Dec 14, 2016 at 06:05:48PM +0300, Dmitry Sivachenko wrote:
> Добрый день,
> 
> Использую proxy_pass http://some.ip:80  (nginx 1.6.2)
> 
> some.ip имеет как A-запись, так и AAAA-запись.
> 
> На машине настроен приоритет IPv6 при резолвинге (ip6addrctl_policy="ipv6_prefer" для FreeBSD).
> Но nginx посылает запросы на IPv4-адрес, а не IPv6.
> 
> Как правильно это исправить? (не хочется к конфиг прописывать ip-адрес).

Сейчас после резолвинга сначала отдаются IPv4-адреса, а затем IPv6-адреса.
Впоследствии, если результат резолвинга закэширован, адреса ротируются.

С таким патчем становится возможным контролировать приоритет IPv6 над
IPv4 в выдаче адресов.

# HG changeset patch
# User Ruslan Ermilov <ru на nginx.com>
# Date 1481732592 -10800
#      Wed Dec 14 19:23:12 2016 +0300
# Node ID bfebe45e2dbb952a25655ead0c7a9a80a50b34e0
# Parent  7bb061c9e1dcc160d80b81c5b07ae5ff83ff221a
Resolver: allow controlling preference of IPv6 over IPv4.

diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -233,6 +233,12 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_
             } else if (ngx_strcmp(&names[i].data[5], "off") == 0) {
                 r->ipv6 = 0;
 
+            } else if (ngx_strcmp(&names[i].data[5], "primary") == 0) {
+                r->ipv6 = 2;
+
+            } else if (ngx_strcmp(&names[i].data[5], "backup") == 0) {
+                r->ipv6 = 3;
+
             } else {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                    "invalid parameter: %V", &names[i]);
@@ -4177,6 +4183,16 @@ ngx_resolver_export(ngx_resolver_t *r, n
     i = 0;
     d = rotate ? ngx_random() % n : 0;
 
+#if (NGX_HAVE_INET6)
+    if (r->ipv6 == 2) {
+        /* prefer IPv6 */
+        d = rn->naddrs6;
+    } else if (r->ipv6 == 3) {
+        /* prefer IPv4 */
+        d = 0;
+    }
+#endif
+
     if (rn->naddrs) {
         j = rotate ? ngx_random() % rn->naddrs : 0;
 
diff --git a/src/core/ngx_resolver.h b/src/core/ngx_resolver.h
--- a/src/core/ngx_resolver.h
+++ b/src/core/ngx_resolver.h
@@ -176,7 +176,7 @@ struct ngx_resolver_s {
     ngx_queue_t               addr_expire_queue;
 
 #if (NGX_HAVE_INET6)
-    ngx_uint_t                ipv6;                 /* unsigned  ipv6:1; */
+    ngx_uint_t                ipv6;
     ngx_rbtree_t              addr6_rbtree;
     ngx_rbtree_node_t         addr6_sentinel;
     ngx_queue_t               addr6_resend_queue;


Подробная информация о списке рассылки nginx-ru