Bagaimana port sumber ditentukan dan bagaimana saya bisa memaksanya untuk menggunakan port tertentu

26

Ketika saya terhubung ke https://www.google.co.id ini berubah menjadi 216.58.198.228:443. Kemudian koneksi ke saya terbuka di [Alamat IP Saya]: 63998.

Pertanyaan saya adalah bagaimana 63998 port dipilih dan apakah ada cara untuk memaksanya menjadi 63999.

Theathron
sumber
9
Apakah ada cara untuk memaksanya menjadi 63999 Apakah Anda punya alasan untuk mencoba melakukan ini?
AL
1
Jika Anda menulis aplikasi, Anda dapat membuka port sumber (yang tidak digunakan) yang Anda inginkan. Tapi itu bukan ide yang bagus dan tidak jelas mengapa Anda menginginkan ini?
pjc50
6
@ pjc50 Memang, pertanyaan ini sepertinya memiliki masalah XY .
Dev
1
Saya telah mengirim suntingan untuk mengubah judul untuk mengatakan "sumber" daripada "lokal", karena nomor port tujuan adalah "lokal" ke mesin tujuan, tetapi sumber paket TCP SYN awal jelas bahwa dari pemrakarsa koneksi
Monty Harder

Jawaban:

39

Bagaimana port lokal ditentukan

Nomor port dipilih oleh perangkat lunak implementasi TCP dari sejumlah nomor port yang disebut Ephemeral Ports .

Mekanisme yang tepat untuk memilih nomor port dan kisaran yang akan digunakan bergantung pada Sistem Operasi.


Apakah ada cara untuk memaksanya menjadi 63999.

Ini dapat dilakukan dengan mengubah konfigurasi perangkat lunak implementasi TCP.

Petunjuk tentang konfigurasi rentang Pelabuhan Ephemeral untuk berbagai Sistem Operasi yang berbeda dapat ditemukan di Mengubah Rentang Pelabuhan Ephemeral .

  • Petunjuk untuk Linux dan Windows disertakan dalam jawaban di bawah ini untuk referensi.

Namun, itu bukan ide yang baik untuk membatasi jangkauan ke satu port, misalnya 63999.

  • Bahkan pada Windows ini tidak mungkin karena:

    Kisaran minimum port yang dapat diatur adalah 255.


Rentang Pelabuhan Ephemeral

Koneksi TCP / IPv4 terdiri dari dua titik akhir, dan setiap titik akhir terdiri dari alamat IP dan nomor port. Oleh karena itu, ketika pengguna klien terhubung ke komputer server, koneksi yang dibuat dapat dianggap sebagai 4-tupel (server IP, port server, IP klien, port klien).

Biasanya tiga dari empat sudah dikenal - mesin klien menggunakan alamat IP-nya sendiri dan ketika menghubungkan ke layanan jarak jauh, alamat IP mesin server dan nomor port layanan diperlukan.

Apa yang tidak segera terbukti adalah bahwa ketika koneksi dibuat bahwa sisi klien koneksi menggunakan nomor port. Kecuali jika program klien secara eksplisit meminta nomor port tertentu, nomor port yang digunakan adalah nomor port sesaat.

Port Ephemeral adalah port sementara yang ditetapkan oleh tumpukan IP mesin, dan ditugaskan dari berbagai port yang ditunjuk untuk tujuan ini. Ketika koneksi berakhir, porta sesaat tersedia untuk digunakan kembali, meskipun sebagian besar tumpukan IP tidak akan menggunakan kembali nomor port sampai seluruh kumpulan porta sesaat telah digunakan.

Jadi, jika program klien terhubung kembali, ia akan diberi nomor porta sesaat yang berbeda untuk sisi koneksi baru.

Sumber Rentang Pelabuhan Ephemeral


Mengubah Kisaran Pelabuhan Ephemeral

Linux:

Linux memungkinkan Anda untuk melihat dan mengubah rentang port sementara hanya dengan menggunakan file /proc/sys/net/ipv4/ip_local_port_range. Sebagai contoh, ini menunjukkan konfigurasi default pada sistem kernel 2.2:

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

Untuk mengubahnya ke rentang yang disukai, Anda bisa melakukan (sebagai superuser):

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

Perhatikan bahwa Anda perlu melakukan ini setiap kali sistem melakukan boot, jadi pastikan untuk menambahkan baris ke skrip startup sistem seperti /etc/rc.local agar rentang Anda selalu digunakan.

Juga perhatikan bahwa kernel Linux 2.4 akan default kisaran 32768 hingga 61000 jika memori kernel yang memadai tersedia, jadi mengubah kisaran mungkin tidak diperlukan pada sistem Linux yang lebih baru.

Terakhir, perhatikan juga bahwa Anda mungkin dapat menggunakan sysctlantarmuka untuk mengubah pengaturan daripada menggunakan sistem /procfile. Nama sysctlparameternya adalah "net.ipv4.ip_local_port_range". Edit /etc/sysctl.conffile jika Anda memilikinya, atau minta skrip startup menjalankan sysctlperintah secara manual jika Anda ingin mengubah parameter ini menggunakan sysctl.

Windows Vista / Windows Server 2008 dan yang lebih baru:

Pada Windows Vista dan Windows Server 2008, Windows sekarang menggunakan rentang besar (49152-65535) secara default, menurut Artikel Microsoft Knowledgebase 929851 . Artikel yang sama juga menunjukkan bagaimana Anda dapat mengubah rentang jika diinginkan, tetapi rentang default sekarang cukup untuk sebagian besar server.

Sumber Mengubah Rentang Port Ephemeral

Anda dapat melihat rentang port dinamis pada komputer yang menjalankan komputer Windows Vista atau Windows Server 2008 dengan menggunakan netshperintah berikut :

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

Catatan:

  • Rentang ini ditetapkan secara terpisah untuk setiap transportasi dan untuk setiap versi IP.
  • Rentang port sekarang benar-benar rentang dengan titik awal dan titik akhir.
  • Pelanggan Microsoft yang menggunakan server yang menjalankan Windows Server 2008 mungkin memiliki masalah dengan komunikasi RPC antar server jika firewall digunakan pada jaringan internal.
  • Dalam kasus ini, kami sarankan Anda mengkonfigurasi ulang firewall untuk memungkinkan lalu lintas antara server di berbagai pelabuhan dinamis 49152 melalui 65535.
  • Kisaran ini merupakan tambahan untuk port-port terkenal yang digunakan oleh layanan dan aplikasi.
  • Atau, rentang port yang digunakan oleh server dapat dimodifikasi di setiap server.

Anda menyesuaikan rentang ini dengan menggunakan netshperintah, sebagai berikut:

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

Perintah ini menetapkan rentang port dinamis untuk TCP. Port awal adalah angka, dan jumlah total port adalah kisaran. Berikut ini adalah contoh perintah:

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

Perintah sampel ini mengatur rentang port dinamis untuk mulai di port 10000 dan berakhir di port 10999(1000 port).

Catatan:

  • Kisaran minimum port yang dapat diatur adalah 255.
  • Port awal minimum yang dapat ditetapkan adalah 1025.
  • Port akhir maksimum (berdasarkan kisaran yang sedang dikonfigurasi) tidak dapat melebihi 65535.
  • Untuk menduplikasi perilaku default Windows Server 2003, gunakan 1025sebagai port awal, dan kemudian gunakan 3976sebagai rentang untuk TCP dan UDP. Ini menghasilkan port awal 1025dan port akhir 5000.

Sumber Microsoft Knowledgebase Article 929851 :

Windows XP dan yang lebih lama:

Untuk sistem operasi Windows yang lebih lama (Windows XP dan yang lebih tua), Windows menggunakan rentang BSD tradisional 1024 hingga 4999 untuk rentang port yang sementara. Sayangnya tampaknya Anda hanya dapat mengatur batas atas rentang port sementara. Berikut ini informasi yang dikutip dari Microsoft Knowledgebase Article 196271 :

  • Mulai Penyunting Registri ( Regedt32.exe).
  • Temukan kunci berikut dalam registri:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  • Pada menu "Edit", klik "Tambah Nilai", dan kemudian tambahkan nilai registri berikut:

    Nama Nilai: MaxUserPortTipe Data: REG_DWORDNilai: 65534(misalnya)

    Rentang Valid: 5000-65534(desimal) Default: 0x1388(5000 desimal)

    Deskripsi: Parameter ini mengontrol nomor port maksimum yang digunakan ketika aplikasi meminta port pengguna yang tersedia dari sistem. Biasanya, pelabuhan sementara (yaitu, berumur pendek) dialokasikan antara nilai-nilai 1024dan 5000inklusif.

  • Keluar dari Penyunting Registri.

Catatan: Ada artikel KB lain yang relevan ( 812873 ) yang mengklaim memungkinkan Anda untuk menetapkan rentang pengecualian, yang bisa berarti bahwa Anda dapat mengecualikan port 1024-9999(misalnya) untuk memiliki kisaran port sesaat 10000-65534. Namun, kami belum dapat menjalankannya (per Oktober 2004).

Sumber Mengubah Rentang Port Ephemeral

DavidPostill
sumber
1
Untuk setidaknya windows tampaknya seperti itu mungkin untuk membatasi sistem jangkauan port yang luas. Dalam kebanyakan kasus, ini mungkin ide yang buruk, terutama membatasi ke satu port adalah: Lihat KB 929851 , perintah yang terdaftar setidaknya berfungsi pada Windows 7.
Seth
@Tet Ya. Aku enggan menyebutkan ini karena OP tidak menyebutkan OS dan saya tidak ingin memperluas jawaban untuk menutupi sistem operasi N ...
DavidPostill
Anda benar tentang itu. Lagipula ada banyak sistem operasi. Itu hanya sesuatu yang saya temui ketika awalnya mencoba menjawab pertanyaan ini. Karena jawaban Anda lebih cepat, saya hanya berpikir saya akan menambahkannya. Itu jawaban yang ditulis dengan sangat baik! :) Baru saja menambahkannya sebagai petunjuk bahwa kadang-kadang mengubah konfigurasi sudah cukup daripada pemrograman ulang (mungkin pemahaman saya hanya berbeda - bagi saya yang terdengar mirip dengan mengkompilasi ulang).
Seth
1
Bahkan, di Linux juga sangat sederhana: lakukan saja echo "49152 65535"> / proc / sys / net / ipv4 / ip_local_port_range . Ini sangat sederhana sehingga dapat dilakukan berdasarkan per-perintah .
MariusMatutiae
2
Daripada mengubah rentang porta sesaat, akan lebih baik untuk memiliki aplikasi memanggil panggilan bindsistem sebelum panggilan connect. Beberapa aplikasi memiliki opsi untuk melakukan itu, aplikasi lain tidak.
kasperd
9

Jawaban David Postill benar sekali. Saya hanya ingin menambahkannya, dengan menekankan bahwa mengubah rentang port sementara di Linux sangat sederhana, bahwa OP memiliki jawaban yang pasti.

Anda mengubah EPR sebagai berikut:

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

dan Anda dapat memilih port 50000 (sebagai contoh) dengan skrip berikut:

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 

Satu peringatan di sini: karena ada satu port dalam jangkauan, aplikasi lain mungkin mengambilnya dari Anda antara eksekusi baris ketiga dan keempat di atas; juga, bahkan jika tidak ada kondisi balapan, Anda akan melumpuhkan semua aplikasi lain sampai Anda memulihkan EPR besar, itulah sebabnya saya mengembalikan rentang asli sesegera mungkin.

Jadi, jika sistem operasi OPs adalah Linux, jawabannya adalah hal itu bisa dilakukan dengan mudah.

Hebatnya, ini tidak semudah pada BSD, beberapa di antaranya bahkan tidak memiliki pengaturan kernel runtime untuk EPR. MacOS X, FreeBSD dan OpenBSD perlu memodifikasi file /etc/sysctl.conf , tetapi mereka memiliki pilihan berbeda untuk EPR.

Terlepas dari yang di atas dan dari OS, fakta bahwa sesuatu dapat dilakukan tidak berarti itu harus dilakukan: mengapa Anda membutuhkan ini? Saya tidak bisa memikirkan satu kasus penggunaan.

MariusMatutiae
sumber
Untuk Linux contoh +1.
DavidPostill
Hehe. BSD / OS memerlukan kompilasi ulang kernel :)
DavidPostill
1
@DavidPostill Itu besar gelandangan.
MariusMatutiae
Ada cacat dalam contoh kode Anda. Pemain tipe Anda sangat salah tempat. Selain itu akan menjadi ide yang baik untuk membuat BIND_PORTopsional, sehingga kode tersebut masih dapat digunakan dengan cara yang persis sama seperti aslinya. Saya pikir htons(bind_port_env ? atoi(bind_port_env) : 0)akan melakukan hal yang benar.
kasperd
1

Perlu ditambahkan bahwa kernel Linux juga memiliki

net.ipv4.ip_local_reserved_ports

kenop yang agak berlawanan tapi tetap saja mungkin sangat berguna karena dengan begitu Anda bisa "membuat lubang" untuk layanan yang membuka port tertentu di berbagai port yang tidak tetap.

Kutipan singkat dari dokumen :

Tentukan port yang dicadangkan untuk aplikasi pihak ketiga yang dikenal. Port-port ini tidak akan digunakan oleh penugasan port otomatis (misalnya saat memanggil connect () atau bind () dengan nomor port 0). Perilaku alokasi port eksplisit tidak berubah.

Format yang digunakan untuk input dan output adalah daftar rentang yang dipisahkan koma (mis. "1,2-4,10-10" untuk port 1, 2, 3, 4 dan 10). Menulis ke file akan menghapus semua port yang sebelumnya disediakan dan memperbarui daftar saat ini dengan yang diberikan dalam input.

poige
sumber