Saya ingin menutup port terbuka yang berada dalam mode mendengarkan antara aplikasi klien dan server saya.
Apakah ada opsi baris perintah manual di Linux untuk menutup port?
CATATAN: Saya jadi tahu bahwa "hanya aplikasi yang memiliki soket yang terhubung yang harus menutupnya, yang akan terjadi ketika aplikasi berakhir."
Saya tidak mengerti mengapa itu hanya mungkin dilakukan oleh aplikasi yang membukanya ... Tapi saya masih ingin tahu apakah ada cara lain untuk melakukannya.
Jawaban:
Saya memiliki masalah yang sama, prosesnya harus tetap hidup tetapi soket harus ditutup. Menutup soket dalam proses yang berjalan bukan tidak mungkin tetapi sulit:
cari proses:
Anda mendapatkan
source/destination ip:port portstate pid/processname
petacari deskriptor file soket dalam proses
Anda mendapatkan daftar: nama proses, pid, pengguna, fileDescriptor, ... string koneksi.
Temukan nomor fileDescriptor yang cocok untuk koneksi. Ini akan menjadi sesuatu seperti "97u" yang berarti "97".
Sekarang hubungkan proses:
Sekarang tutup soket:
contoh:
Kemudian lepaskan gdb:
Dan soket ditutup.
sumber
sudo lsof -np $pid
memberi saya sekitar 200 baris dan saya bingung tentang bagaimana menemukan FD yang diinginkan. Dalam proses kasus saya adalah tab Chrome dan saya mencoba menutup soket web yang terbuka ...shutdown
:call shutdown($fileDescriptor, 0)
.Anda agak menanyakan pertanyaan yang salah di sini. Sangat tidak mungkin untuk hanya "menutup port" dari luar aplikasi yang membuka soket mendengarkannya. Satu-satunya cara untuk melakukan ini adalah sepenuhnya membunuh proses yang memiliki port. Kemudian, dalam sekitar satu atau dua menit, port akan tersedia lagi untuk digunakan. Inilah yang sedang terjadi (jika Anda tidak peduli, lewati sampai akhir di mana saya menunjukkan kepada Anda cara membunuh proses yang memiliki port tertentu):
Port adalah sumber daya yang dialokasikan oleh OS untuk berbagai proses. Ini mirip dengan meminta OS untuk penunjuk file. Namun, tidak seperti file pointer, hanya SATU proses pada suatu waktu yang dapat memiliki port. Melalui antarmuka soket BSD, proses dapat membuat permintaan untuk mendengarkan pada port, yang kemudian diberikan oleh OS. OS juga akan memastikan tidak ada proses lain yang mendapatkan port yang sama. Pada titik mana pun, proses dapat melepaskan port dengan menutup soket. OS kemudian akan mengklaim kembali port tersebut. Atau, jika proses berakhir tanpa melepaskan port, OS pada akhirnya akan mengklaim kembali port (meskipun itu tidak akan terjadi segera: itu akan memakan waktu beberapa menit).
Sekarang, apa yang ingin Anda lakukan (cukup tutup port dari baris perintah), tidak mungkin karena dua alasan. Pertama, jika memungkinkan, itu berarti satu proses bisa mencuri sumber daya proses lain (pelabuhan). Ini akan menjadi kebijakan yang buruk, kecuali terbatas pada proses istimewa. Alasan kedua adalah tidak jelas apa yang akan terjadi pada proses yang dimiliki pelabuhan jika kita membiarkannya terus berjalan. Kode proses ditulis dengan asumsi bahwa ia memiliki sumber daya ini. Jika kita hanya mengambilnya, itu akan berakhir dengan sendirinya, jadi OS jangan biarkan Anda melakukan ini, bahkan jika Anda adalah proses yang istimewa. Sebaliknya, Anda harus membunuh mereka.
Bagaimanapun, berikut ini cara membunuh proses yang memiliki port tertentu:
Itu akan menampilkan garis yang sesuai dengan port holding proses, misalnya:
Dalam hal ini, procHoldingPort adalah nama proses yang membuka port, 4683 adalah pid, dan 8000 (perhatikan bahwa itu adalah TCP) adalah nomor port yang dipegangnya.
Kemudian, lihat di kolom terakhir, Anda akan melihat /. Kemudian jalankan ini:
Jika itu tidak berhasil (Anda dapat memeriksa dengan menjalankan kembali perintah netstat). Melakukan hal ini:
Secara umum, lebih baik untuk menghindari pengiriman SIGKILL jika Anda bisa. Inilah sebabnya saya memberitahu Anda untuk mencoba
kill
sebelumnyakill -9
. Hanya menggunakankill
mengirimkan SIGTERM yang lebih lembut.Seperti yang saya katakan, port masih perlu beberapa menit untuk membuka kembali jika Anda melakukan ini. Saya tidak tahu cara mempercepat ini. Jika orang lain melakukannya, saya ingin mendengarnya.
sumber
unix.tools.port.close(<my port number>)
akan saya gunakaninit 6
.Fuser juga bisa digunakan
Protokol di sini adalah tcp / udp dan portno adalah nomor yang ingin Anda tutup. Misalnya
Info lebih lanjut di halaman manual fuser
sumber
fuser
dijalankan?fuser
menemukan proses menggunakan port dan membunuhnya, tetapi tidak menyelesaikan fakta, bahwa soket tidak ditutup. 60 detik dan kernel melakukannya untuk saya.Anda dapat menggunakan iptables sebagai alternatif:
Ini pada dasarnya mencapai apa yang Anda inginkan. Ini akan menjatuhkan semua lalu lintas TCP ke port 80.
sumber
-j REJECT
untuk mengembalikan flag reset TCP, yang kemudian akan melihat proses kepemilikan saya (tetapi hanya ketika pihak lain mencoba untuk mengirim sesuatu).Seharusnya memberi tahu Anda, jika Anda menjalankan apache, "httpd" (ini hanya contoh, gunakan port yang digunakan aplikasi Anda alih-alih 80)
atau
sumber
Anda mungkin bisa mengetahui proses apa yang membuka soket yang terkait dengan port, dan mematikan proses itu.
Tapi, Anda harus menyadari bahwa kecuali proses itu memiliki penangan yang mende-inisialisasi semua hal yang digunakannya (buka file, soket, garpu, barang-barang yang dapat berlama-lama kecuali ditutup dengan benar saat penghentian) maka Anda harus menciptakan itu seret pada kinerja sistem. Plus, soket akan tetap terbuka sampai kernel menyadari bahwa prosesnya telah dimatikan. Itu biasanya hanya membutuhkan waktu sekitar satu menit.
Saya kira pertanyaan yang lebih baik adalah: Port apa (milik proses apa) yang ingin Anda hentikan?
Jika Anda mencoba untuk mengakhiri backdoor atau virus yang Anda temukan, maka Anda setidaknya harus mempelajari data apa yang bolak-balik sebelum Anda menghentikannya. (wireshark baik untuk ini) (Dan nama yang dapat dieksekusi proses 'sehingga Anda dapat menghapusnya dan mencegahnya kembali pada reboot) atau, jika itu adalah sesuatu yang Anda instal (seperti HTTPD atau FTPD atau sesuatu) maka Anda seharusnya sudah memiliki akses ke proses itu sendiri.
Biasanya ia akan memiliki program kontrol (HTTPD stop | start atau sesuatu). Atau, jika itu masalah sistem, Anda mungkin tidak boleh mengacaukannya. Ngomong-ngomong, saya pikir karena semua orang memberi Anda sudut "bagaimana", saya harus memberi Anda peringatan.
sumber
Saya pertama kali mencari proses mongo dan simpul, kemudian melakukan hal berikut:
Setelah diidentifikasi, matikan saja prosesnya dengan perintah kill.
Terakhir, ketik
meteor
dan harus berfungsi lagi.sumber
Anda bisa menulis skrip yang memodifikasi iptables dan me-restart-nya. Satu skrip untuk menambahkan aturan yang menjatuhkan semua paket di port, skrip lain untuk menghapus aturan tersebut.
Jawaban lain menunjukkan kepada Anda cara membunuh proses yang terikat pada port - ini mungkin bukan yang Anda inginkan. Jika Anda ingin server tetap berjalan, tetapi untuk mencegah koneksi dari klien maka Anda ingin memblokir port, tidak menghentikan proses.
sumber
Satu masalah lagi: kadang-kadang kernel memiliki port sendiri. Saya tahu routing NAT menahan beberapa port terbuka untuk penggunaan NAT. Anda tidak dapat mematikan proses untuk ini, ini adalah kernel, dan diperlukan konfigurasi ulang dan reboot.
sumber
Jika Anda ingin port Anda dirilis lebih cepat, Anda harus menetapkan nilai berikut:
untuk mengaturnya dari 60 detik (default) ke 1 detik
sumber
Anda dapat menggunakan perintah bernama killcx, menutup koneksi tanpa proses apa pun untuk dimatikan.
sumber
Saya sadar bahwa jawaban ini tidak menjawab pertanyaan itu sendiri, secara tegas, tetapi membacanya mungkin informasi yang relevan:
Perilaku default dari mengikat socket ke port (dan alamat) adalah ketika socket ditutup dengan penghentian proses yang tiba-tiba, socket akan tetap dalam TIME_WAIT untuk sementara waktu. Ini berarti Anda tidak dapat segera mengikat kembali ke alamat / port ini. Jika Anda mengembangkan sistem itu sendiri melalui antarmuka soket BSD standar, Anda dapat (setidaknya sampai batas tertentu) mengendalikan perilaku ini dengan opsi soket SO_REUSEADDR. Ini pada dasarnya akan memungkinkan Anda untuk mengikat ke alamat / port yang sama lagi jika soket dalam status TIME_WAIT. Masih satu soket per port sekalipun!
Namun, informasi ini hanya boleh digunakan sebagai bantuan pembangunan, karena ada alasan untuk TIME_WAIT ada di tempat pertama, sudah dijelaskan dalam jawaban lain.
sumber
Jika Anda tidak ingin lalu lintas melalui soket tetapi ingin tetap hidup prosesnya: tcpkill .
Akan memulai daemon mengendus yang memotong dan menghancurkan semua lalu lintas di port itu. Sangat berguna untuk menguji aplikasi Anda untuk pemisahan jaringan.
sumber
Anda dapat menutup soket mendengarkan menggunakan ss :
Di mana 1234 adalah nomor port Anda.
ss adalah bagian dari paket iproute2, jadi ada perubahan kuat yang sudah diinstal pada Linux modern.
Saya belajar tentang ini dari jawaban untuk pertanyaan terkait .
sumber