Bagaimana cara memesan daftar port untuk aplikasi khusus saya?
Untuk lebih spesifik, produk yang saya buat memiliki banyak proses dan banyak komunikasi antara mereka.
Masalah yang saya alami adalah - sesekali - OS mencuri port saya. Jarang, tetapi itu terjadi.
Ini bisa jadi karena aplikasi yang berbeda telah menggunakan ":: bind" tanpa port yang ditentukan.
Atau kadang-kadang aplikasi saya sendiri mencuri port ketika saya memanggil ":: connect" dengan soket yang tidak terikat. Seperti yang terlihat dari halaman manual:
Jika soket belum terikat ke alamat lokal, sambungkan () akan mengikatnya ke alamat yang, kecuali keluarga alamat soket adalah AF_UNIX, adalah alamat lokal yang tidak digunakan.
Jadi pertanyaan saya adalah, bisakah saya memesan port yang saya butuhkan sehingga OS tidak menggunakannya? Apakah ini dapat dilakukan dengan / etc / services? Atau ada cara lain?
SELinux
dalam mode Penegakan dapat memenuhi kebutuhan Anda, saya masih belajar tentang itu. Jadi hanya menebak, mungkin Anda dapat menentukan kebijakan Anda sendiri untukSELinux
untuk cadangan Anda port, sepertimy_server_port_t tcp 1111, 2222, 3333, 4444-4600
. Jika aplikasi Anda akan berjalan di mana-mana (bukan aplikasi server), saya khawatir Anda tidak dapat mengontrol apakahSELinux
ON atau OFF.Jawaban:
Secara teknis, tidak ada yang namanya "port yang dipesan".
Dalam TCP / UDP, satu-satunya cara untuk "mencadangkan" port adalah dengan benar
bind()
- benar soket. Port terikat tidak akan digunakan oleh aplikasi lain; port yang tidak digunakan, yah, tidak digunakan sehingga aplikasi lain bebas untuk menggunakannya.Jika Anda menulis perangkat lunak server, maka Anda dapat mengikat soket ke port tertentu sedini yang Anda inginkan dalam kode aplikasi. Buat nomor port dapat dikonfigurasi, atau setidaknya nyatakan dengan jelas dalam dokumentasi, sehingga administrator sistem dapat dengan cepat mengidentifikasi bentrokan dan memindahkan aplikasi yang bertentangan ke server yang terpisah.
sumber
Untuk memastikan kernel tidak akan memberikan 49000 dan 49001 kepada klien karena Anda ingin menggunakannya untuk server Anda di linux.
jatuhkan
/etc/sysctl.conf
, lalu jalankansysctl -p
.Perhatikan bahwa ini belum diuji.
Referensi
sumber
/etc/services
?Sebenarnya, jawaban di atas tidak sepenuhnya akurat. Sysctls net.inet.ip.portrange.first dan net.inet.ip.portrange.last menentukan kisaran port yang dapat dialokasikan OS untuk port acak. Anda ingin memastikan bahwa kisaran port yang dipesan untuk aplikasi Anda tidak termasuk dalam variabel-variabel ini.
Lihatlah di FreeBSD Handbook, bagian: 12.14. Batas Tuning Kernel . Tetapi premis dasar yang sama harus berlaku untuk Linux juga.
sumber
net.ipv4.ip_local_port_range