Kaynak bağlantı noktaları nasıl belirlenir ve belirli bir bağlantı noktasını kullanmaya nasıl zorlayabilirim?


26

Https://www.google.com.tr sitesine bağlandığımda bu durum 216.58.198.228:443 olarak değişir. Sonra benimle bir bağlantı açılır [IP Adresim]: 63998.

Benim sorum, 63998 limanının nasıl seçildiği ve 63999 olmaya zorlamanın bir yolu var.


9
Bunu yapmaya zorlamanın bir yolu var mı? Bunu yapmaya çalışmak için bir nedeniniz var mı?
AL

1
Bir uygulama yazıyorsanız, istediğiniz herhangi bir (kullanılmamış) kaynak bağlantı noktasını açabilirsiniz. Ama bu iyi bir fikir değil ve neden bunu istediğinizi açık değil mi?
pjc50

6
@ pjc50 Gerçekten, bu soru bir XY problemi olmuş gibi görünüyor .
Dev

1
Hedef port numaraları, hedef makineye "yerel" olduğundan "yerel" yerine "kaynak" diyecek bir düzenleme yaptım, ancak ilk TCP SYN paketinin kaynağı belirsiz bir şekilde bağlantı
Monty Harder

Yanıtlar:


39

Yerel limanlar nasıl belirlenir?

Port numarası, TCP uygulama yazılımı tarafından Ephemeral Ports adı verilen bir dizi port numarasından seçilir .

Port numarasını ve kullanılacak aralığı seçmek için tam mekanizma İşletim Sistemine bağlıdır.


63999 olmaya zorlamak için bir yolu var mı.

Bu, TCP uygulama yazılımının yapılandırmasını değiştirerek yapılabilir.

Geçici Bağlantı Noktaları aralığının çeşitli Farklı İşletim Sistemleri için yapılandırılmasıyla ilgili talimatlar Geçici Bağlantı Aralığı Aralığının Değiştirilmesi bölümünde bulunabilir .

  • Linux ve Windows için talimatlar referans için bu cevaba dahil edilmiştir.

Bununla birlikte, örneğin menzili tek bir portla sınırlamak iyi bir fikir değildir 63999.

  • Aslında Windows'ta bu mümkün değildir:

    Ayarlanabilen minimum port aralığı 255'tir.


Geçici Liman Aralığı

Bir TCP / IPv4 bağlantısı iki uç noktadan oluşur ve her uç nokta bir IP adresi ve bağlantı noktası numarasından oluşur. Bu nedenle, bir istemci kullanıcı bir sunucu bilgisayara bağlandığında, kurulmuş bir bağlantı 4-demet (sunucu IP, sunucu portu, istemci IP, istemci portu) olarak düşünülebilir.

Genellikle dördünden üçü kolayca bilinir - istemci makine kendi IP adresini kullanır ve uzak bir servise bağlanırken, sunucu makinesinin IP adresi ve servis port numarası gerekir.

Hemen belli olmayan, bir bağlantı kurulduğunda, bağlantının istemci tarafının bir bağlantı noktası numarası kullanmasıdır. Bir istemci programı açıkça belirli bir port numarası istemiyorsa, kullanılan port numarası geçici bir port numarasıdır.

Geçici portlar, makinenin IP yığını tarafından atanan geçici portlardır ve bu amaç için belirlenmiş bir port aralığından atanır. Bağlantı sona erdiğinde, geçici bağlantı noktası yeniden kullanıma hazırdır, ancak çoğu IP yığınları geçici bağlantı havuzunun tamamı kullanılana kadar bu bağlantı noktasını yeniden kullanmaz.

Bu nedenle, eğer müşteri programı yeniden bağlanırsa, yeni bağlantının kendi tarafı için farklı bir geçici port numarası verilecektir.

Kaynak Geçici Liman Aralığı


Geçici Port Aralığının Değiştirilmesi

Linux:

Linux, geçici bağlantı noktası aralığını yalnızca dosyayı kullanarak görüntülemenizi ve değiştirmenizi sağlar /proc/sys/net/ipv4/ip_local_port_range. Örneğin, bu bir çekirdek 2.2 sistemindeki varsayılan yapılandırmayı gösterir:

$ cat /proc/sys/net/ipv4/ip_local_port_range 
1024 4999

Bunu tercih edilen aralıkta değiştirmek için (süper kullanıcı olarak) şunları yapabilirsiniz:

# echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range 

Sistemin her açılışında bunu yapmanız gerekeceğini unutmayın; bu /etc/rc.local nedenle, aralığınızın her zaman kullanıldığı gibi bir sistem başlatma komut dosyasına bir satır eklediğinizden emin olun .

Ayrıca, Linux 2.4 çekirdeğinin, yeterli çekirdek belleği varsa, 32768 - 61000 aralığını varsayılan olarak ayarlayacağını unutmayın; bu nedenle, yeni Linux sistemlerinde aralığı değiştirmek gerekmeyebilir.

Son olarak, dosya sistemini sysctlkullanmak yerine ayarları değiştirmek için arayüzü kullanabileceğinizi de unutmayın /proc. sysctlParametrenin adı "net.ipv4.ip_local_port_range" dir. Düzen /etc/sysctl.confdosyayı o var ya da bir başlangıç komut dosyası çalıştırmak varsa sysctlkullanmakta bu parametreyi değiştirmek isterseniz manuel komutu sysctl.

Windows Vista / Windows Server 2008 ve daha yenisi:

Windows Vista ve Windows Server 2008'den itibaren, Windows şimdi 929851 numaralı Microsoft Bilgi Bankası makalesine göre, varsayılan olarak geniş bir aralık (49152-65535) kullanıyor . Aynı makale, istenirse aralığı nasıl değiştirebileceğinizi de gösterir, ancak varsayılan aralık artık çoğu sunucu için yeterlidir.

Kaynak Geçici Liman Aralığı Değiştirme

Aşağıdaki netshkomutları kullanarak, dinamik bağlantı noktası aralığını Windows Vista veya Windows Server 2008 bilgisayarı çalıştıran bir bilgisayarda görüntüleyebilirsiniz :

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp 

Notlar:

  • Menzil, her aktarma ve IP'nin her sürümü için ayrı ayrı ayarlanır.
  • Liman aralığı şimdi gerçekten bir başlangıç ​​noktası ve bir bitiş noktası olan bir aralıktır.
  • Windows Server 2008 çalıştıran sunucuları dağıtan Microsoft müşterileri, iç ağda güvenlik duvarları kullanılıyorsa, sunucular arasında RPC iletişimiyle ilgili sorunlar yaşayabilir.
  • Bu durumlarda, size dinamik bağlantı noktası aralığındaki sunucular arasında trafiğe izin vermek için güvenlik duvarı yapılandırmanız önerilir 49152 aracılığıyla 65535.
  • Bu seri, hizmetler ve uygulamalar tarafından kullanılan iyi bilinen bağlantı noktalarına ek olarak verilir.
  • Veya, sunucular tarafından kullanılan port aralığı her sunucuda değiştirilebilir.

Bu aralığı, netshkomutu kullanarak aşağıdaki gibi ayarlayabilirsiniz :

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

Bu komut TCP için dinamik port aralığını ayarlar. Başlangıç ​​bağlantı noktası sayı ve toplam bağlantı noktası sayısı menzildir. Örnek komutlar aşağıdadır:

netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000

Bu örnek komutlar dinamik port aralığını 10000 portundan başlayacak ve porttan 10999(1000 port) bitecek şekilde ayarlar .

Notlar:

  • Ayarlanabilecek minimum port aralığı 255.
  • Ayarlanabilecek minimum başlangıç ​​portu 1025.
  • Maksimum uç bağlantı noktası (yapılandırılan aralığa göre) aşamaz 65535.
  • Windows Server 2003'ün varsayılan davranışını çoğaltmak için 1025başlangıç ​​bağlantı noktası 3976olarak kullanın ve ardından hem TCP hem de UDP için aralık olarak kullanın . Bu bir başlangıç ​​bağlantı noktası 1025ve bir son bağlantı noktası ile sonuçlanır 5000.

Kaynak Microsoft Bilgi Bankası makalesi 929851 :

Windows XP ve daha üstü:

Eski Windows işletim sistemlerinde (Windows XP ve daha eski), Windows geçici port aralığındaki 1024 ile 4999 arasındaki geleneksel BSD aralığını kullanır. Ne yazık ki, geçici geçici aralık aralığının yalnızca üst sınırını ayarlayabildiğiniz anlaşılıyor. Microsoft Bilgi Bankası makalesi 196271'den alıntılanan bilgiler :

  • Kayıt Defteri Düzenleyicisi'ni ( Regedt32.exe) başlatın .
  • Kayıt defterinde aşağıdaki anahtarı bulun:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  • "Düzenle" menüsünde, "Değer Ekle" yi tıklayın ve ardından aşağıdaki kayıt defteri değerini ekleyin:

    Değer Adı: MaxUserPortVeri Türü: REG_DWORDDeğer: 65534(örneğin)

    Geçerli Aralık: 5000-65534(ondalık) Varsayılan: 0x1388(5000 ondalık)

    Açıklama: Bu parametre, bir uygulama sistemden mevcut herhangi bir kullanıcı portu istediğinde kullanılan maksimum port numarasını kontrol eder. Normalde geçici (yani kısa ömürlü) portlar, değerler 1024ve 5000dahil edici değerleri arasında paylaştırılır.

  • Kayıt Defteri Düzenleyicisi'nden çıkın.

Not: Bir dışlama aralığı ayarlamanıza izin verdiğini iddia eden bir başka ilgili KB makalesi ( 812873 ) vardır 1024-9999; bu, geçici bağlantı noktası aralığına sahip olmak için bağlantı noktalarını (örneğin) hariç tutabileceğiniz anlamına gelir 10000-65534. Ancak, bunun işe yaramasını sağlayamadık (Ekim 2004 itibariyle).

Kaynak Geçici Liman Aralığı Değiştirme


1
En azından pencereler geniş bir aralıktaki liman menzilini kısıtlamak gibi görünüyor. Çoğu durumda bu muhtemelen kötü bir fikirdir, özellikle onu bir bağlantı noktasıyla sınırlandırmak aşağıdaki gibidir: Bkz. KB 929851 , en azından Windows 7'de çalışan komutlar.
Seth

@Seth Evet. OP onun işletim sisteminden bahsetmediğinden ve N işletim sistemlerini kapsayacak şekilde cevabını genişletmek istemediğim için bunu söylemekte
isteksizdim

Bu konuda haklısın. Sonuçta çok sayıda işletim sistemi var. Bu, sadece bu soruyu cevaplamaya çalışırken rastladığım bir şey. Cevabınız daha hızlı olduğu için ekleyeceğimi düşündüm. Bu gerçekten iyi yazılmış bir cevap! :) Sadece yeniden yapılandırmadan ziyade bazen yapılandırmanın değiştirilmesinin yeterli olduğuna dair bir ipucu olarak ekledim (belki de benim anlayışım sadece farklı - benim için yeniden derlemeye benzeyen sesler).
Seth

1
Aslında, Linux'ta da çok basittir: sadece "49152 65535"> / proc / sys / net / ipv4 / ip_local_port_range ekosunu kullanın . Komut başına yapılabilecek kadar basittir .
MariusMatutiae,

2
Geçici port aralığını değiştirmek yerine, uygulamanın bindaramadan önce sistem çağrısını çağırması çok daha iyi olurdu connect. Bazı uygulamaların bunu yapma seçeneği vardır, diğer uygulamalarda yoktur.
kasperd

9

David Postill'in cevabı tamamen doğru. Sadece eklemek istiyorum, Linux'taki geçici liman aralığını değiştirmenin o kadar basit olduğunu vurgulayarak, OP'nin olumlu bir cevabı olduğunu vurgulamak isterim .

EPR'yi aşağıdaki gibi değiştirirsiniz:

echo "40000 60000" > /proc/sys/net/ipv4/ip_local_port_range 

ve aşağıdaki komut dosyasıyla 50000 bağlantı noktasını (örnek olarak) seçebilirsiniz:

OLD_RANGE=$(cat /proc/sys/net/ipv4/ip_local_port_range)
MY_PORT=50000
echo "$MY_PORT $MY_PORT" > /proc/sys/net/ipv4/ip_local_port_range
sudo -u SomeUser SomeApplication  & 
echo $OLD_RANGE" > /proc/sys/net/ipv4/ip_local_port_range 

Burada bir uyarı: aralıkta tek bir bağlantı noktası bulunduğundan, başka bir uygulama yukarıdaki üçüncü ve dördüncü satırların yürütülmesi arasında sizden uzaklaştırabilir; ayrıca, herhangi bir yarış koşulu olmasa bile, büyük bir EPR'yi geri yükleyene kadar diğer tüm uygulamaları felç edeceksin, bu yüzden orijinal menzili en kısa sürede geri yükledim.

Böylece, eğer OP’lerin işletim sistemi Linux olsaydı, cevap kolayca yapılabileceği olurdu.

Şaşırtıcı bir şekilde, bazıları EPR için çalışma zamanı çekirdeği ayarına sahip olmayan BSD'lerde bu o kadar kolay değil. MacOS X, FreeBSD ve OpenBSD, /etc/sysctl.conf dosyasını değiştirmeyi gerektirir , ancak EPR için farklı seçeneklere sahiptir.

Yukarıdakilerden ve işletim sisteminden bağımsız olarak, bir şeyin yapılabileceği gerçeği yapılması gerektiği anlamına gelmez : neden dünyada buna ihtiyacınız var? Tek kullanımlık bir durum düşünemiyorum.


Linux için +1 örneği.
DavidPostill

Hehe. BSD / OS, çekirdeğin yeniden derlenmesini gerektirir :)
DavidPostill

1
@DavidPostill Bu çok büyük bir serseri.
MariusMatutiae

Kod örneğinizde bir kusur var. Yazım tipiniz çok yanlış. Ek olarak, BIND_PORTisteğe bağlı olarak kodun orijinaliyle aynı şekilde kullanılabilecek şekilde seçilmesi iyi bir fikir olacaktır . Bence htons(bind_port_env ? atoi(bind_port_env) : 0)doğru olanı yapardım.
kasperd,

1

Linux çekirdeğinin de sahip olduğunu eklemeye değer

net.ipv4.ip_local_reserved_ports

Bir miktar tersi olan topuz ancak yine de çok faydalı olabilir, çünkü bu şekilde özel liman (lar) ı başka türlü geçici portlar arasında açan servisler için “bir delik açabilirsiniz”.

Dokümanlardan kısa alıntı :

Bilinen üçüncü taraf uygulamalar için ayrılmış bağlantı noktalarını belirtin. Bu portlar otomatik port atamaları tarafından kullanılmayacaktır (örneğin, connect () çağrılırken veya port numarası 0 ile bağlanır). Açık bağlantı noktası ayırma davranışı değişmedi.

Hem giriş hem de çıkış için kullanılan format, virgülle ayrılmış bir aralık listesidir (örneğin, 1, 2, 3, 4 ve 10 numaralı bağlantı noktaları için "1,2-4,10-10"). Dosyaya yazmak, önceden ayrılmış tüm portları siler ve geçerli listeyi girilen ile günceller.

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.