Ayrı IPv4 ve IPv6 dinleme yönergelerinin nginx'te olması gerekir mi?


71

Nginx'te çift yığınlı IPv4 ve IPv6 sanal konaklarını kullanmak için çeşitli yapılandırma örnekleri gördüm. Birçok kişi bu kalıbı önerir:

listen 80;
listen [::]:80 ipv6only=on;

Görebildiğim kadarıyla, bu tam olarak aynı şeyi başarır:

listen [::]:80 ipv6only=off;

Eskiyi neden kullandın? Düşünebilmemin tek nedeni, her protokole özgü ek paragraflara ihtiyacınız olup olmadığı, örneğin yalnızca IPv4'te ayarlamak istemenizdir deferred.


IP yığın sürümü ile ilgisi yok ertelenmiş bir TCP seçeneğidir.
Xavier Lucas

1
Elbette, ancak listenyönergelere koydunuz ve seçenekler ana bilgisayar başına uygulanır: bağlantı noktası çifti.
Synchro

Hum Gerçekten de bunu yapmak isteyeceğiniz bir durumu hayal edemiyorum. Bence tek neden tarihsel ve Michael Hampton onu çiviledi.
Xavier Lucas

Yanıtlar:


48

Bu , bugünlerde eski yapıyı kullanmanızın tek nedeni ile ilgili.

Bunu görmenizin nedeni muhtemelenipv6only nginx 1.3.4'te değiştirilen varsayılan değerdir. Bundan önce, varsayılan olarak off; daha yeni sürümlerde varsayılan olarak on.

Bu, Linux'taki IPV6_V6ONLY soket seçeneğiyle ve varsayılanları mutlaka tahmin edilemeyecek diğer işletim sistemlerinde benzer seçeneklerle etkileşime girer. Bu nedenle, eski yapı hem IPv4 hem de IPv6'daki bağlantıları gerçekten dinlemenizi sağlamak için 1.3.4 öncesi gerekliydi.

Nginx varsayılan değerinde yapılan değişiklik, ipv6onlyçift ​​yığın soketleri için işletim sisteminin varsayılan değerinin önemsiz olmasını sağlar. Şimdi, nginx, varsayılan olarak bir çift yığın soketi oluşturmak için hiçbir zaman işletim sistemine bağlı olarak, açıkça IPv4, IPv6 veya her ikisine de bağlanır.

Gerçekten de, 1.3.4 öncesi için olan standart nginx yapılandırmalarım ilk yapılandırmaya ve 1.3.4 sonrası tümünün ikinci yapılandırmasına sahipler.

İkili yığın soketi bağlamak sadece Linux olan bir şey olmasına rağmen, şimdiki konfigürasyonlarım şimdi ilk örneğe benziyor, fakat ipv6onlyayarlanmamış, zekâ:

listen [::]:80;
listen 80;

4
Bazı işletim sistemleri, OpenBSD gibi çift ipv4 ve ipv6 soketleri yapmaz, bunun için iki kez dinlemek zorunda kalacaksınız.
Justin Cormack

@JustinCormack Evet, haklısınız ve bunu bir süredir dikkate aldım. Bu yazıyı şu ana kadar güncellememiştim.
Michael Hampton,

1
listen localhost:8080;Her ikisini de (1.12.2) dinliyor gibi görünüyor ve kullanmak proxy_pass http://localhost:8080:: 1 ile 127.0.0.1 arasında denge yüklüyor - Günlüklerde gerçek ip elde etmek için ipv6 için bir satır eklemek zorunda kaldımset_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For;
Antony Gibbs

65

Tek bir Nginx örneğine sahip birden fazla vhost alanını barındırıyorsanız, birleştirilmiş bir listen dinleme direktifini kullanamazsınız.

listen [::]:80 ipv6only=off;

her biri için. Nginx'te, ipv6onlyher bir port için sadece bir kez parametre belirleyebileceğiniz tuhaf bir tuhaflık var , yoksa başlayamaz. Bu, her vhost etki alanı sunucu bloğu için bunu belirtemeyeceğiniz anlamına gelir.

Michael'ın dediği gibi, Nginx 1.3.4 ile başlayarak, ipv6onlyparametre varsayılan olarak değişir on.

Bu nedenle, hem IPv4'te hem de IPv6'da tek bir Nginx sunucusuyla birden fazla etki alanı barındırmak istiyorsanız, her etki alanı sunucusu bloğu için iki dinleme yönergesi kullanmaya zorlanırsınız:

listen 80;
listen [::]:80; 

Ek olarak, Sander’in dediği gibi ipv6only=off, IPv4 adreslerinin IPv6’ya çevrilmesi dezavantajı vardır. Bu, uygulamanızın Akismet veya StopForumSpam gibi kara listelerine karşı IP kontrolü yapması durumunda sorunlara yol açabilir, çünkü ters bir çeviri katmanı oluşturmadıkça, uygulamanız spam göndericinin IPv4 adresinin IPv4 çevirisini kontrol eder; Kara liste.


2
Evet, bahsettiğim aynı deferredve diğer protokol başına yönergeler. Söylediğiniz nedenle dinleme yönergelerinden ayrı olarak belirtilmeleri yararlı olabilir.
Synchro

1
Ve konunun özü, her alan için ayrı ayrı bir dinleme yönergesi belirtmeniz gerekir. Aksi takdirde ne olur? site ipv4 üzerinden iyi çalışır ve ipv6 üzerinden nginx karşılama sayfasını gösterir. ROFL
Silver Moon,

2
Ayrıntılı açıklama için teşekkür ederiz! ipv6only=offAynı port için iki kez belirttiğimde kafa karıştırıcı bir hata ile karşılaşıyordum . Cevabınız sorunu çözdü!

1
Ayrıca, her ikisi de 443: dinleyen 2 vhosts kullanmak istiyorsanız listen 443; listen [::]:443;. Kullanarak listen [::]:80 ipv6only=off;bağlantı noktası zaten kullanımda olan bir nginx hatası atar
lukeaus


2

Anladığım kadarıyla (ve http://nginx.org/en/docs/http/ngx_http_core_module.html#listen adresindeki dokümanlara göre ),

listen 80;

... hem IPv4 hem de IPv6 trafiğini aynı bağlantı noktasına yönlendirmek istiyorsanız yeterlidir.


1
Bu zaten kurulmuş ve soruda belirtilmiştir. Lütfen fark için diğer cevaplara bakınız.
Synchro

3
Benim için yapmadı, ikisine de ihtiyacım vardı. wget ve curl ipv6 kullanırken "ben [listen] :: 80 ipv6only = on;"
Basil A
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.