Linux ağ bağlantı noktası tükenmesi


10

Çekirdek kaynağını kazmadan bu konuda yapabileceğim kadar çok araştırma yaptım. Konuyla ilgili çok fazla dezenformasyon / yanlış bilgi var gibi görünüyor, bu yüzden umarım bu soruya ben ve diğerleri için bir kez ve herkes için cevap verir.

Kesinlikle IPv4 konuşma, bağlantı noktası tükenmesi gerçekten mümkün mü? Açıklamama izin ver:

  • Görünüşe göre kullanım için 65535 port var. 0 kullanılamıyor.
  • Ben bağlantı noktası yorgunluk (src ip, src bağlantı noktası, dst ip, dst bağlantı noktası) tuple benzersiz olmasını gerektirir okudum.
  • Açık ve net olmak gerekirse, sysctl net.ipv4.ip_local_port_range ayarıyla geçici bağlantı noktalarının% 100'ünü kullanabileceğimi varsayalım

Ve soru şu: Böyle mi çalışıyor?

  • 127.0.0.1:(x) ile 127.0.0.1:80 arasında 65k bağlantıya sahip olabilirim
  • 127.0.0.1:(x) ile 127.0.0.1:555 arasında 65k bağlantıya sahip olabilirim
  • Temel olarak bir kez daha, soru (srcip, srcport, dstip, dstport) benzersiz olmalı, doğru mu?
  • Ben herhangi bir fazla 65k bağlantı açamadı dan "B" IP ip "A" Port "N"
  • Benzer şekilde, tek bir IP xxxx: 80'de web sunucumla 65 binden fazla bağlantı açamadı, ancak farklı kaynak IP'lerinden olduğu sürece genel olarak 65 binden fazla destekleyebilir miyim ?

Son olarak, geçici (giden) geçici bağlantı noktaları ve dinleyen gelen bağlantı noktaları hakkında biraz kafam karıştı. Bağlantı kurulduktan sonra bağlantının her iki tarafının da bir eş ve eşit olduğunu anlıyorum, ama bundan önce:

Örneğin, gerçekten (srcip, srcport, dstip, dstport) grubunun benzersiz olması gerekiyorsa, örneğin etkinleştirirsem neden olur?

net.ipv4.ip_local_port_range = 1024 65535

Bu, 1024-65535 arasındaki geçici bağlantı noktalarının kullanılmasına izin verir, 3306 numaralı bağlantı noktasına bağlanan hizmetlerim varsa (örneğin, mySQL), bağlantı noktası kullanımda olduğu için bazen başlatılamazlar.

Bu şu gerçeği ilgilendiriyor mu: (Ve bu benim doğrulanmasını istediğim bir ifade):

  • (srcip, srcport, dstip, dstport) 1-65535 bağlantı noktası aralığındaki her bağlantı için benzersiz olması gerekir (işletim sisteminin geçici bağlantı noktalarını kullanmasına dikkat etmeyin)
  • Bununla birlikte, bir soketin bağlanması için (srcip, srcport, *, *) olarak görülebilir. Veya bunu söylemenin başka bir yolu, IP'nin herhangi bir nedenle bağlanmak için bu bağlantı noktasını kullanmaması mı gerekiyor?

Yukarıdaki davranışı doğrulayabilirim, yani yukarıdaki tam sysctl satırını kullanıyorum ve bu nedenle OSS'yi bu bağlantı noktasını kullandığını varsayarak bazen ve çok rasgele yeniden başlatamadığından mySQL'i 1024'ten daha düşük bir bağlantı noktasına taşıdım. geçici bir liman için.


Cevabımı daha fazla bilgi ile güncelledim. Herhangi bir soruya yanıt vermekten çekinmeyin.
89c3b1b8-b1ae-11e6-b842-48d705

Yanıtlar:


8

Burada iki ana sorunuz var:

1.

Kesinlikle IPv4 konuşma, bağlantı noktası tükenmesi gerçekten mümkün mü?

Evet. Örneğin, tüm bağlantıları bir NAT IP adresine gönderen bir yük dengeleme yönlendiricisini ele alalım. SRC IPTek bir dar boğaza bağlanan birçok s olduğunda bu gerçekleşebilir DST IP.

Bu, web sunucunuzun aşağıdaki gibi bir grup bağlantıya sahip olabileceği anlamına gelir:

root@buglab:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 173.200.1.18:80      10.100.1.100:49923        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.200.1.200:10155        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:14400        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:50652        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.20.1.20:57554        ESTABLISHED 13939/nginx: worker 

ve bu gayet iyi. Ancak, tüm 'Yabancı Adresler' aynıysa, bu bir soruna neden olabilir (örn. 'Bir IP adresiyle NAT <---> sunucusunu gerçekleştiren büyük yönlendirici').

Geçici bağlantı noktası tükenmesinin neden yaygın bir sorun olmadığını varsaymak zorunda kalsaydım, bunun nedeni her bağlantı noktasının bir dinleme hizmeti ve yanıt vermek için yeterli kaynak gerektirdiğinden - başka bir kaynak (bellek, cpu) normalde bir darboğazdır.

Ancak, bir yük dengeleme şirketinde çalışırken şahsen birkaç liman tükenmesi sorunuyla karşılaştım.

2. Kullanılmış bir port neden bir dinleme servisi için sorun yaratabilir?

"Bu, 1024-65535 arasındaki geçici bağlantı noktalarının kullanımına izin verir, 3306 numaralı bağlantı noktasına bağlanan hizmetlerim varsa (örneğin, mySQL), bağlantı noktası kullanımda olduğu için bazen başlatılamayabilir."

MySQL sunucusu kullanımdaysa bu bağlantı noktasına bağlanamaz - localhost: 3306 veya tüm arayüzlerde. Örneğin, aşağıdaki netstatçıktıdaki 0.0.0.0:80 satırına bakın ?

root@buglab:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      964/php-fpm.conf)
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1660/mysqld     
tcp        0      0 0.0.0.0:842             0.0.0.0:*               LISTEN      1317/inetd      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13938/nginx     

Bu, bağlantı noktası 80'in sunucuya yerel olarak tüm arabirimleri dinlediği anlamına gelir . nginxSunucum başlamadan önce başka bir işlem 80 numaralı bağlantı noktasını tutarsa nginx, bu bağlantı noktasının denetimini alamaz ve büyük olasılıkla başlatma yordamında başarısız olur.

Normalde, 3306 numaralı bağlantı noktası iyidir çünkü dinleme hizmetleri ana makineden istenen önceden tanımlanmış bağlantı noktalarına (veya aralıklara) sahiptir - örneğin, web sunucuları için 80 ve 443 numaralı bağlantı noktalarına.


0

127.0.0.1:(x) ile 127.0.0.1:80 arasında 65k bağlantıya sahip olabilirim 127.0.0.1:(x) ile 127.0.0.1:555 arasında 65k bağlantıya sahip olabilirim

a: evet, yerel bağlantı noktanız 1-65535 ise, bağlantı sayısı 65k-1'dir (bir bağlantı noktası dinlenir)

Temel olarak bir kez daha, soru (srcip, srcport, dstip, dstport) benzersiz olmalı, doğru mu? a: evet

IP "A" dan IP "B" ye, "N" Bağlantı Noktasından 65k bağlantıyı açamadım Aynı şekilde, tek bir IP de xxxx: 80'deki web sunucumla 65k bağlantıyı açamadı, ancak daha fazlasını destekleyebilirim farklı kaynak IP'lerinden olduğu sürece toplamda 65k'den fazla mı?

a: Tek bir IP, web sunucumla xxxx: 80'de 65k'dan fazla bağlantı açamadı, çünkü srcip, srcport, dstip, dstport benzersizdir. evet soruce ip farklıysa, 65k'dan fazla destekleyebilirsiniz

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.