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.
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.
Yanıtlar:
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.
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 .
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.
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ığı
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
sysctl
kullanmak yerine ayarları değiştirmek için arayüzü kullanabileceğinizi de unutmayın/proc
.sysctl
Parametrenin adı "net.ipv4.ip_local_port_range" dir. Düzen/etc/sysctl.conf
dosyayı o var ya da bir başlangıç komut dosyası çalıştırmak varsasysctl
kullanmakta bu parametreyi değiştirmek isterseniz manuel komutusysctl
.
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
netsh
komutları 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ığıyla65535
.- 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ığı,
netsh
komutu 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
1025
başlangıç bağlantı noktası3976
olarak kullanın ve ardından hem TCP hem de UDP için aralık olarak kullanın . Bu bir başlangıç bağlantı noktası1025
ve bir son bağlantı noktası ile sonuçlanır5000
.
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ı:
MaxUserPort
Veri Türü:REG_DWORD
Değ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
1024
ve5000
dahil 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 gelir10000-65534
. Ancak, bunun işe yaramasını sağlayamadık (Ekim 2004 itibariyle).
bind
aramadan ö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.
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.
BIND_PORT
isteğ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.
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.