Bagaimana cara menutup port di Linux?

38

Saya punya beberapa pertanyaan di pelabuhan penutup, saya pikir saya punya beberapa hal aneh.

Saat saya menggunakan eksekusi

nmap --top-ports 10 192.168.1.1

itu menunjukkan bahwa port 23 / TCP terbuka.

Tapi saat aku mengeksekusinya

nmap --top-ports 10 localhost

itu menunjukkan bahwa port 23 / tcp ditutup.

Yang mana dari mereka yang benar? Saya ingin menutup port ini di seluruh sistem saya, bagaimana saya bisa melakukannya?

pengguna74080
sumber
10
keduanya benar. Port TCP tidak terkait dengan host. mereka terkait dengan antarmuka jaringan. perbedaannya halus tetapi penting. antarmuka seringkali sama dengan host, tetapi tidak selalu. dalam hal ini (sebagaimana dinyatakan dalam jawaban) localhostsedang mengakses loantarmuka (loopback). Alamat IP mengakses antarmuka nyata Anda, mungkin eth0atau wlan0atau semacamnya.
strugee
3
Kenaifan yang jelas dari pertanyaan ini menghasilkan beberapa jawaban yang luar biasa. Terima kasih atas pertanyaannya!
dotancohen

Jawaban:

47

Nmap adalah pemindai port yang hebat, tetapi terkadang Anda menginginkan sesuatu yang lebih otoritatif. Anda dapat bertanya pada kernel proses apa yang memiliki port terbuka dengan menggunakan netstatutilitas:

me @ myhost: ~ $ sudo netstat -tlnp
Koneksi internet aktif (hanya server)
Proto Recv-Q Kirim-Q Alamat Lokal Alamat Asing Negara PID / Nama program
tcp 0 0 127.0.0.1:53 0.0.0.0:* DENGARKAN 1004 / dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* DENGARKAN 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* DENGARKAN 822 / cangkird       
tcp6 0 0 ::: 22 ::: * DENGARKAN 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * DENGARKAN 822 / cangkird       

Opsi yang saya berikan adalah:

  • -t Hanya TCP
  • -l Hanya mendengarkan porta
  • -n Jangan mencari layanan dan nama host, cukup tampilkan nomor
  • -p Tampilkan informasi proses (memerlukan root privilege)

Dalam kasus ini, kita dapat melihat bahwa sshdmendengarkan pada antarmuka ( 0.0.0.0) port 22, dan cupsdmendengarkan pada loopback ( 127.0.0.1) port 631. Output Anda mungkin menunjukkan yang telnetdmemiliki alamat lokal 192.168.1.1:23, artinya tidak akan menjawab koneksi pada adaptor loopback (mis. Anda tidak bisa telnet 127.0.0.1).

Ada alat lain yang akan menampilkan informasi serupa (misalnya lsofatau /proc), tetapi netstat adalah yang paling banyak tersedia. Ia bahkan bekerja pada Windows ( netstat -anb). BSD netstat sedikit berbeda: Anda harus menggunakan sockstat (1) untuk mendapatkan informasi proses.

Setelah Anda memiliki ID proses dan nama program, Anda bisa mencari proses dan membunuhnya jika Anda ingin menutup port. Untuk kontrol yang lebih halus, Anda dapat menggunakan firewall (iptables di Linux) untuk membatasi akses hanya ke alamat tertentu. Anda mungkin perlu menonaktifkan startup layanan. Jika PID adalah "-" di Linux, itu mungkin sebuah proses kernel (ini umum dengan NFS misalnya), jadi semoga berhasil mengetahui apa itu.

Catatan: Saya mengatakan "berwibawa" karena Anda tidak terhalang oleh kondisi jaringan dan firewall. Jika Anda mempercayai komputer Anda, itu bagus. Namun, jika Anda mencurigai bahwa Anda telah diretas, Anda mungkin tidak dapat mempercayai alat di komputer Anda. Mengganti utilitas standar (dan kadang-kadang bahkan panggilan sistem) dengan yang menyembunyikan proses atau port tertentu (alias rootkit) adalah praktik standar di antara para penyerang. Taruhan terbaik Anda saat ini adalah membuat salinan forensik dari disk Anda dan memulihkan dari cadangan; kemudian gunakan salinan untuk menentukan cara mereka masuk dan menutupnya.

bonsaiviking
sumber
14

Sistem Linux memiliki antarmuka loopback, yang digunakan untuk komunikasi internal. Nama hostnya adalah localhostdan alamat IP-nya 127.0.0.1.

Ketika Anda menjalankan nmappada localhost, Anda benar-benar menjalankan portscan pada maya antarmuka loopback. 192.168.1.1adalah alamat IP dari antarmuka fisik Anda (kemungkinan besar eth0).

Jadi Anda telah menjalankan nmapdua antarmuka jaringan yang berbeda, inilah mengapa ada perbedaan dalam port terbuka. Keduanya benar.

Jika Anda memiliki port TCP 23 terbuka, kemungkinan Anda memiliki telnetserver yang berjalan (yang bukan hal yang baik karena kurangnya enkripsi) atau Anda memiliki semacam kuda trojan di mesin Anda.

psimon
sumber
1
jadi bagaimana saya bisa menutupnya?
user74080
4
@ user74080 Anda dapat menambahkan iptablesaturan seperti yang disarankan jawaban terdekat, tetapi itu akan membuat layanan tidak digunakan, yang menghabiskan sumber daya. Jadi, jika Anda telah telnetdberlari, matikan saja.
psimon
12

Untuk "menutup" port yang bisa Anda gunakan iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP
Sungai kecil
sumber
1
Dalam jawaban ini, "menutup port" berarti "mengabaikan lalu lintas ke sana". Port masih terbuka, tetapi tidak dapat dijangkau lagi. Perhatikan juga bahwa DROPtidak seperti yang dikatakan, ia melihat paket dan kemudian mengabaikannya. Biasanya (tanpa iptables diaktifkan), kernel akan mengirim port ICMP paket yang tidak terjangkau kembali (yang dapat disimulasikan dengan REJECTtarget bukan DROP).
Lekensteyn
3
@Lekensteyn port ICMP yang tidak dapat dijangkau adalah untuk UDP. Paket yang tepat untuk dibalas adalah paket TCP RST, yang juga dapat dihasilkan menggunakan REJECTtarget dengan menulis -j REJECT --reject-with tcp-reset.
kasperd
Meskipun nilainya lebih rendah, ini adalah jawaban pertama yang benar-benar menjawab pertanyaan. Siapa pun yang dapat menambah skor di sini, silakan lakukan.
EnzoR
2

Jika Anda melakukannya nmap localhost, ia memberi tahu Anda tentang situasi yang berbeda: beberapa program di linux berfungsi sebagai server meskipun hanya digunakan secara lokal. Ini karena program lain menggunakannya seperti server yang terhubung. Jadi kedua jawaban itu benar, karena Anda menanyakan sesuatu yang berbeda.

Port 23 digunakan untuk telnet. Biasanya tidak digunakan lagi. Coba lakukan nmap -sV 192.168.1.1untuk mengetahui program mana yang membuka port.

(192 ... adalah IP jaringan lokal, jadi hasilnya nmap <your outside world IP>juga akan memberikan hasil yang berbeda, karena kemungkinan pengaturan firewall dll)

PythoNic
sumber
1

Jika Anda memiliki layanan yang berjalan dan mendengarkan pada port 23, mungkin lebih bersih untuk menghentikan proses yang mendengarkan port 23 (mungkin telnet) daripada membiarkannya berjalan dan menutup atau memblokir port 23 menggunakan iptables.

Ketika tidak ada proses mendengarkan pada port, bahkan tanpa adanya blok firewall, setiap upaya untuk menghubungkannya harus menghasilkan "koneksi ditolak" langsung ( ECONNREFUSEDke connect(2))

Salah satu cara untuk menemukan proses (dan pidnya) yang mendengarkan pada port 23, jika ada proses tersebut, adalah:

sudo lsof -i -P | grep ':23 '

Dalam -idaftar di atas buka port internet (baik UDP dan TCP), dan -P menghambat terjemahan port ke nama layanan (via /etc/services)

Setelah Anda menemukan proses yang berjalan mendengarkan pada port 23, Anda dapat mengetahui bagaimana prosesnya dimulai dengan melihat pohon proses (dengan mengatakan, pstree). Jika induknya init(sangat mungkin), Anda dapat mencari nama proses secara rekursif /etc. misalnya:

sudo grep -r telnet /etc

Ini akan mengarahkan Anda ke cara terbaik untuk menonaktifkannya agar tidak berjalan di posisi pertama.

diri sendiri
sumber
Tidak perlu menggunakan grep (dan jika ada, tidak perlu untuk mengutip). Anda bisa menggunakannya sudo lsof -Pi :23.
Théophile
Kutipan ada di sana untuk alasan yang bagus. Untuk memastikan hanya port telnet (23 ) yang cocok. Jika Anda tidak memasukkan spasi setelahnya :23akan cocok :234, :2345dll.
arielf
Ah, begitu. Itu masuk akal untuk grep. Kebetulan, tampaknya perintah tanpa grep ( lsof -Pi :23) mencari kecocokan yang tepat.
Théophile