Düşük SYN_RECV bağlantısına rağmen günlükte “olası SYN taşması”


30

Son zamanlarda SYN taşması nedeniyle çok yavaş yanıt veren bir apache sunucumuz vardı. Bunun için geçici çözüm, tcp_syncookies ( net.ipv4.tcp_syncookies=1 in /etc/sysctl.conf) işlevini etkinleştirmekti .

Bu konuda bir soru önergesi burada daha arka plan istiyorum.

Senkronizasyonu etkinleştirdikten sonra, yaklaşık 60 saniyede bir / var / log / messages içinde şu mesajı görmeye başladık:

[84440.731929] possible SYN flooding on port 80. Sending cookies.

Vinko Vrsaloviç, bunun, senk backlog'unun dolduğu anlamına geldiğini söyledi, bu yüzden tcp_max_syn_backlog dosyasını 4096'ya yükselttim. Bir noktada tcp_synack_retries değerini 3'e indirerek (varsayılan 5'ten aşağı) verdim sysctl -w net.ipv4.tcp_synack_retries=3. Bunu yaptıktan sonra, mesajların aralığı yaklaşık 60 ila 180 saniye arasında değişen, frekans düşüyor gibiydi.

Sonra ben yayınladım sysctl -w net.ipv4.tcp_max_syn_backlog=65536, ancak hala kayıt defterinde mesajı alıyorum.

Tüm bunlar boyunca, SYN_RECV durumunda (çalışarak) bağlantıların sayısını izliyorum watch --interval=5 'netstat -tuna |grep "SYN_RECV"|wc -l've hiçbir zaman yaklaşık 240'dan fazla olmayacak, bu da backlog büyüklüğünden çok daha düşük olacaktır. Yine de 512 civarında dolanan bir Red Hat sunucum var (bu sunucudaki limit 1024 varsayılanıdır).

Biriktirme listesinin boyutunu sınırlayacak başka bir tcp ayarları var mı, yoksa yanlış ağaca havlıyor muyum? SYN_RECV bağlantılarının sayısı netstat -tuna, backlog büyüklüğü ile ilişkili mi?


Güncelleştirme

En iyisi, burada meşru bağlantılarla uğraştığımı söyleyebildiğim kadarıyla netstat -tuna|wc -l5000 civarında. Bu konuyu bugün araştırıyorum ve bu yazıyı oldukça faydalı olan bir son.fm çalışanından buldum .

Ayrıca tcp_max_syn_backlog'un eş anlamlı çerezler etkinken etkisinin olmadığını keşfettim ( bu bağlantıya göre )

Böylece bir sonraki adım olarak aşağıdakileri sysctl.conf dosyasına koydum:

net.ipv4.tcp_syn_retries = 3
        # default=5
net.ipv4.tcp_synack_retries = 3
        # default=5
net.ipv4.tcp_max_syn_backlog = 65536
        # default=1024
net.core.wmem_max = 8388608
        # default=124928
net.core.rmem_max = 8388608
        # default=131071
net.core.somaxconn = 512
        # default = 128
net.core.optmem_max = 81920
        # default = 20480

Daha sonra cevap sysctl -ptestimi kurdum, koçluk yaptım ve devre dışı bıraktım sysctl -w net.ipv4.tcp_syncookies=0.

Bunu yaptıktan sonra, SYN_RECV durumundaki bağlantıların sayısı hala 220-250 civarında kalmıştır, ancak bağlantılar tekrar gecikmeye başlamıştır. Bu gecikmeleri farkettikten sonra, senkronizasyonları yeniden etkinleştirdim ve gecikmeler durdu.

Gördüğüm şeyin hala başlangıçtaki durumdan bir gelişme olduğuna inanıyorum, ancak bazı talepler hala ertelendi ve bu durum senkronizasyonu etkinleştirmekten çok daha kötü. Öyle görünüyor ki, yüklerle başa çıkabilmek için çevrimiçi olarak daha fazla sunucu alabilene kadar etkin durumdayım. O zaman bile, sunucunun arabellekleri dolduğunda yalnızca göründükleri gibi gönderildiklerinde onları tekrar devre dışı bırakmak için geçerli bir neden gördüğümden emin değilim.

Ancak syn backlog, SYN_RECV durumunda sadece ~ 250 bağlantıyla dolu görünmüyor! SYN sel mesajının kırmızı bir ringa balığı olması ve doldurulan syn_backlog dışında bir şey olması mümkün mü?

Herhangi birinin başka ayarlama seçeneği varsa, henüz denemediğim için denemekten çok mutlu olurum, ancak syn_backlog ayarının bir nedenden dolayı doğru uygulanıp uygulanmadığını merak etmeye başladım.


Yanıtlar:


27

Yani, bu düzgün bir soru.

Başlangıçta, SYN çerezleri etkin durumdayken SYN_RECV durumunda herhangi bir bağlantı gördüğünüze şaşırdım . SYN çerezlerinin güzelliği, kriptografi kullanarak sunucu olarak TCP 3 yollu el sıkışmasına vatansız bir şekilde katılabiliyor olmanızdır, bu yüzden sunucunun yarı açık bağlantıları temsil etmemesini beklerdim, çünkü bu durum aynı değil. tutulmuyor.

Aslında, kaynağa hızlı bir bakış (tcp_ipv4.c), çekirdeğin SYN çerezlerini nasıl uyguladığı hakkında ilginç bilgiler gösterir. Esasen, onları açmasına rağmen, çekirdek beklemedeki bağlantıların kuyruğu dolana kadar normalde olduğu gibi davranır. Bu, mevcut bağlantı listenizi SYN_RECV durumunda açıklar.

Yalnızca bekleyen bağlantıların kuyruğu dolduğunda VE başka bir SYN paketi (bağlantı girişimi) alındığında, VE son uyarı iletisinden bu yana bir dakikadan fazla zaman geçti, çekirdek, gördüğünüz uyarı iletisini gönderir mi ("çerezleri gönderme") ). Uyarı mesajı olmadığında bile SYN çerezleri gönderilir; uyarı mesajı, sorunun çözülmediğine dair size bir haber vermek içindir.

Başka bir deyişle, SYN çerezlerini kapatırsanız, mesaj kaybolur. Artık SYN'i sular altında bırakmıyorsanız, bu sizin için işe yarayacak.

Yaptığınız diğer bazı şeyleri ele almak için:

  • net.ipv4.tcp_synack_retries:
    • Bunun artırılması, taklit edilen gelen bağlantılar için veya sunucu tarafı durumu yerine SYN tanımlama bilgisi alan herhangi bir kişi için olumlu bir etkiye sahip olmayacaktır (ikisi için de yeniden deneme yapılmaz).
    • Gelen sahte bağlantılarda bunun arttırılması, sahte adrese gönderdiğiniz paket sayısını ve bu sahte adresin bağlantı tablonuzda kaldığı süreyi artırır (bu önemli bir olumsuz etki olabilir).
    • Normal yük / gelen bağlantıların sayısı altında, bu ne kadar yüksekse, paketleri bırakan bağlantılar üzerindeki bağlantıları hızlı / başarılı bir şekilde tamamlama olasılığınız o kadar yüksek olur. Bunu arttırmak için azalan getiriler var.
  • net.ipv4.tcp_syn_retries: Bunun değiştirilmesi, gelen bağlantılar üzerinde herhangi bir etkiye sahip olamaz (yalnızca giden bağlantıları etkiler)

Bahsettiğiniz diğer değişkenler araştırmamıştım, ancak sorunuzun yanıtlarının tam burada olduğundan şüpheliyim.

Eğer SYN'i su altında bırakmıyorsanız ve makine HTTP olmayan bağlantılara yanıt veriyorsa (örneğin SSH) Büyük olasılıkla bir ağ sorunu olduğunu düşünüyorum ve ona bakmak için bir ağ mühendisine sahip olmanız gerekir. Makine SYN'e su basmasanız bile genellikle tepkisizse, TCP bağlantılarının oluşturulmasını etkiliyorsa (oldukça düşük seviye ve yoğun olmayan kaynak) ciddi bir yükleme sorunu gibi geliyorsa


Teşekkürler - bu ilginç ve bilgilendirici bir cevaptır. Bu kesinlikle SYN_RECV durumundaki bağlantılar ve çerezlerin gönderilmesi arasındaki ilişki hakkındaki sorgumu yanıtlıyor. Makine, HTTP'den çok daha az trafik alan SSH ve HTTPS dahil olmak üzere HTTP olmayanlara yanıt veriyordu. Böylece trafiğin azaltılmasının yolun gideceğine karar verdik.
Alex Forbes

Bir ağ mühendisinin bir göz atması için - iyi bir öneri ancak bu veri merkezinden uzaklaşıyoruz, bu nedenle başka bir yere birkaç yeni sunucu getirdiğimizde muhtemelen faydalı olmayacaktır. Bunun bir ağ sorunu olduğu konusunda haklı olabileceğinizi düşünüyorum - belki de yük dengeleyici veya güvenlik duvarı ile ilgili bir sorun. Görüşleriniz için tekrar teşekkürler!
Alex Forbes

13

Ubuntu Oneiric 11.10'un yeni bir kurulumunda, ağır yüklü bir web sitesine sahip bir web sunucusu (apache2) çalıştıran aynı problemle karşılaştım. Ubuntu Oneiric'de 11.10 eş anlamlı çerezler varsayılan olarak etkindir.

Web sunucusu portunda olası bir SYN sel saldırısı olduğunu belirten aynı mesajlar vardı:

çekirdek: [739408.882650] TCP: 80 numaralı bağlantı noktasında olası SYN taşması. Tanımlama bilgisi gönderme.

Aynı zamanda, hiçbir saldırı olmadığından da emindim. Bu mesajları 5dk aralıklarla döndürmüştüm. Bu sadece bir yük gözetleme gibiydi, çünkü saldırgan, sunucunun isteklere cevap vermemesine çalışırken yükü her zaman yüksek tutar.

net.ipv4.tcp_max_syn_backlogParametrenin ayarlanması herhangi bir iyileşme sağlamamıştır - mesajlar aynı oranda devam etmiştir. SYN_RECV bağlantı sayısının her zaman gerçekten düşük olduğu gerçeği (benim durumumda 250 yaşın altında), bu mesajdan sorumlu başka bir parametre olması gerektiğinin bir göstergesiydi.

Çekirdek iletisinin uygulama tarafında bir hata (veya yanlış yapılandırma) sonucu olabileceğini belirten kırmızı şapka sitesinde bu hata iletisini https://bugzilla.redhat.com/show_bug.cgi?id=734991 buldum . Elbette kayıt mesajı çok yanıltıcıdır! Bu, bu durumda sorumlu olan çekirdek parametresi değil, uygulamanızın parametresi olduğundan, beeing çekirdeğe geçti.

Bu yüzden, web sunucusu uygulamamızın konfigürasyon parametrelerine de bir göz atmalıyız. Apache belgelerini alın ve http://httpd.apache.org/docs/2.0/mod/mpm_common.html#listenbacklog adresine gidin.

ListenBacklogParametre varsayılan değeri 511'dir. (Bu, kırmızı şapka sunucunuzda gözlemlediğiniz bağlantı sayısına karşılık gelir. Başka bir sunucunuz yapılandırılmış daha düşük bir numaraya sahip olabilir.)

Apache, gelen bağlantılar için birikim sırası için kendi yapılandırma parametresine sahiptir. çok sayıda gelen bağlantınız varsa ve herhangi bir anda (rastgele bir şey gibi) neredeyse aynı saatte bir araya geliyorlarsa, web sunucusu uygun bir şekilde yeterince hızlı bir şekilde hizmet veremiyorsa, 511 bağlantıyla doluysa ve çekirdek, olası bir SYN taşması saldırısı olduğunu belirten yukarıdaki mesajı ateşleyecektir.

Bunu çözmek için, /etc/apache2/ports.confapache tarafından yüklenecek olan aşağıdaki satırı veya diğer .conf dosyalarından birini ekleyeceğim /etc/apache2/apache2.conf:

ListenBackLog 5000

Ayrıca net.ipv4.tcp_max_syn_backlogmakul bir değere ayarlamanız gerekir . Anladığım kadarıyla, çekirdek maksimum değeri apache yapılandırmasında yapılandırabileceğiniz değeri sınırlayacaktır. öyleyse koş:

sudo sysctl -w net.ipv4.tcp_max_syn_backlog=5000

Config ayarını yaptıktan sonra, apache'nizi yeniden başlatmayı unutmayın:

sudo service apache2 restart ( or sudo /etc/init.d/apache2 restart )

Benim durumumda, bu yapılandırma değişikliği hemen çekirdek uyarıları durdurdu. Apache yapılandırmasında düşük bir ListenBackLog değeri ayarlayarak mesajları yeniden üretebiliyorum.


2
Mükemmel cevap. Söylediklerinizin doğru olduğunu varsayarak bunu kabul edilen cevap olarak işaretlerim ama gerçekten test edemiyorum - yükü azaltmak sorunu çözdü ve iyi bir neden olmadan üretim sunucularıyla uğraşmama politikam var :)
Alex Forbes

Bunun işe yarayıp yaramadığını onaylayabilirim, çünkü bu bir DDOS karşıtı özelliktir, ancak çok fazla web trafiği aldığınızda meşru kullanıcılarınızı engeller!
Areeb Soo Yasir,

5

Çekirdek 3.4.9 ile yapılan bazı testlerden sonra, netstat'taki SYN_RECV bağlantılarının sayısı

  • /proc/sys/net/core/somaxconn 2 sonraki kuvvete kadar yuvarlanır (örn. 128 -> 256)
  • % 75 /proc/sys/net/ipv4/tcp_max_syn_backloghalinde /proc/sys/net/ipv4/tcp_syncookiesayarlanır 0halinde veya% 100 /proc/sys/net/ipv4/tcp_syncookiesolarak ayarlanmıştır1
  • ListenBackLog apache konfigürasyonunda bir sonraki 2 değerine yuvarlanır (örn. 128 -> 256)

bu parametrelerin her birinin minimumu kullanılır. Somaxconn değiştirildikten sonra veya ListenBackLog apache yeniden başlatılmalıdır.

Arttırdıktan sonra tcp_max_syn_backlog apache'nin de yeniden başlatılması gerekiyor.

Tcp_syncookies olmadan apache engelleniyor, bu durumda neden tcp_max_syn_backlog'un sadece% 75'i limit tuhaf. ve bu parametrenin arttırılması, Apache'yi yeniden başlatmadan, SYN_RECV bağlantılarını eski değerin% 100'üne yükseltir.


Ayrıca çağrı /bin/echo m >/proc/sysrq-triggergenellikle 80 numaralı bağlantı noktasında olası bir SYN taşmasına neden olur . Çerez mesajı gönderme .
usoft
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.