Başvurum için portları nasıl ayırırım?


29

Özel uygulamalarım için bağlantı noktaları listesini nasıl ayırırım?

Daha açık olmak gerekirse, oluşturduğum ürün arasında birçok işlem ve aralarında çok fazla iletişim var.

Karşılaştığım sorun şu ki - arada bir - işletim sistemim limanlarımı çalıyor. Nadirdir, ama olur.

Bunun nedeni, farklı bir uygulamanın bağlantı noktası belirtilmemiş olarak ":: bind" kullanması olabilir.

Ya da bazen kendi uygulamalarım bağlanmamış bir soketle ":: connect" derken bağlantı noktasını çalıyor. Man sayfasından görüldüğü gibi:

Soket zaten bir yerel adrese bağlı değilse, connect (), soketin adres ailesi AF_UNIX olmadığı sürece, kullanılmayan bir yerel adres olmadığı bir adrese bağlar.

Öyleyse sorum şu, işletim sisteminin kullanmaması için ihtiyacım olan portları ayırabilir miyim? Bu / etc / services ile yapılabilir mi? Yoksa farklı bir yolu var mı?


1
Bunun yerine AF_UNIX soketlerini kullanabilir misiniz?
alex

2
Neden kendi uygulamanızın 'liman çalmak' endişesi var?
EightBitTony

Yazılımımın üzerinden geçip her bir bağlantının istemci tarafını belirli bir bağlantı noktasına bağlamamız gerekip gerekmediğini tartışıyordum. Uygulamalarımda çok fazla bağlantı yolu bulunduğundan bunu güncellemek benim için oldukça iş . İşletim sistemindeki portları ayırmak, bunu yapacak zaman bulana kadar iyi bir boşluk bırakma çözümü olurdu.
Michael Baker,

SELinuxZorlama modunda ihtiyacınızı karşılayabilir mi emin değilim, hala öğreniyorum. Dolayısıyla, sadece bir tahmin, belki için kendi politikasını tanımlayabilirsiniz SELinuxiçin rezerv gibi senin limanları, my_server_port_t tcp 1111, 2222, 3333, 4444-4600. Uygulamanız her yerde çalışırsa (sunucu uygulaması değil), korkarım SELinuxAÇIK veya KAPALI olup olmadığını kontrol edemezsiniz .
LiuYan 研 研

"Çalmak" derken, 3. parti uygulamasının, başvuru şansını yakalamadan önce seçtiğiniz port numarasına bağlandığını, çünkü 3. parti uygulamasının 0'a bağlanma talebinde bulunduğunu ve İşletim Sisteminin seçtiğiniz bağlantı noktası numarasını rastgele belirlediğini düşünüyorum. 3. parti uygulaması. Öyleyse, bkz. Unix.stackexchange.com/a/38724/27865
Mark Lakata

Yanıtlar:


14

Teknik olarak, "ayrılmış liman" diye bir şey yoktur.

TCP / UDP'de, bir portu "rezerve etmenin" tek yolu, aslında bind()kendisine bir soket yerleştirmektir. Bağlı bir bağlantı noktası diğer uygulamalar tarafından kullanılmayacaktır; kullanılmayan bir bağlantı noktası, kullanılmadığı için diğer uygulamaların kullanımı ücretsizdir.

Sunucu yazılımı yazıyorsanız, uygulama kodunda istediğiniz kadar erken soketlerinizi belirli bağlantı noktalarına bağlayabilirsiniz. Bağlantı noktası numaralarını yapılandırılabilir hale getirin veya en azından açıkça belgelerde belirtin; böylece bir sistem yöneticisi çakışmaları hızlı bir şekilde tespit edebilir ve çakışan uygulamaları ayrı sunuculara taşıyabilir.


1
Ayrıca, mümkünse iyi bilinen / ayrılmış bağlantı noktalarını kullanmaktan kaçının.
EightBitTony

Bazen ayrılmış limanlar var. Bu iyi bir genel tavsiyedir ancak Linux'ta doğru cevap değildir.
Jason Newton

18

Çekirdeğin, Linux'taki sunucularınız için kullanmak istediğiniz müşterilere 49000 ve 49001’i vermemesini sağlamak.

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001

içine bırakın /etc/sysctl.confve sonra çalıştırın sysctl -p.

Bunun test edilmediğine dikkat edin.

Referanslar


Bunu denedim, ancak kendi uygulamamın bağlantı noktalarını kullanmasını da engelledi! Bağlantı noktası numaralarını adlarla tanımlamaya ne dersiniz /etc/services?

@ user134197 Bağlama isteğinizde açıkça sıfır olmayan bir bağlantı noktası numarası kullanıyorsanız, kendi uygulamanızın bu bağlantı noktalarını kullanmasını engellememelidir. Benim için çalışıyor.
Mark Lakata

15

Aslında, yukarıdaki cevap tamamen doğru değil. Sysctls net.inet.ip.portrange.first ve net.inet.ip.portrange.last, işletim sisteminin rasgele bağlantı noktaları için tahsis edebileceği bağlantı noktaları aralığını belirtir. Uygulamanız için ayrılan bağlantı noktalarının aralığının bu değişkenlerin içine girmediğinden emin olmak istersiniz.

FreeBSD El Kitabında, bölüme bakınız: 12.14. Çekirdek Sınırlarını Ayarlama . Ancak aynı temel öncül Linux için de geçerli olmalıdır.


Ayrıca, bu bağlantı yardımcı olabilir: stackoverflow.com/questions/913501/…
MattK

3
Sanırım Linux'ta denirnet.ipv4.ip_local_port_range
Brian Gordon
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.