Linux'ta portlar nasıl kapatılır?


38

Limanı kapatırken biraz sorum var, sanırım tuhaf şeyler var.

Execute kullandığımda

nmap --top-ports 10 192.168.1.1

23 / TCP portunun açık olduğunu gösterir.

Ama idam ettiğimde

nmap --top-ports 10 localhost

23 / tcp portunun kapalı olduğunu gösterir.

Hangisi doğru? Bu portu tüm sistemimde kapatmak istiyorum, nasıl yapabilirim?


10
ikisi de doğrudur. TCP bağlantı noktaları ana bilgisayarlarla ilişkili değildir. ağ arayüzleriyle ilişkilidirler. fark ince ancak önemlidir. Arayüzler çoğu zaman konaklarla aynıdır, fakat her zaman değil. Bu durumda (cevaplarda belirtildiği gibi) (geridöngü) arayüze localhosterişiyor lo. IP Adresi gerçek arayüzünüze, muhtemelen eth0veya wlan0ya da bir kısma erişiyor.
strugee

3
Bu sorunun belirgin naifliği bazı müthiş cevaplara yol açtı. Soru için teşekkürler!
dotancohen

Yanıtlar:


47

Nmap harika bir port tarayıcıdır, ancak bazen daha güvenilir bir şey istersiniz. Çekirdeği, netstatyardımcı programı kullanarak hangi işlemlerin hangi bağlantı noktalarının açıldığını sorabilirsiniz :

me @ myhost: ~ $ sudo netstat -tlnp
Aktif İnternet bağlantıları (sadece sunucular)
Proto Recv-Q Send-Q Yerel Adres Yabancı Adres Durumu PID / Program adı
tcp 0 0 127.0.0.1:53 0.0.0.0:* LİSTEN 1004 / dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 822 / cupsd       
tcp6 0 0 ::: 22 ::: * LISTEN 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * LISTEN 822 / cupsd       

Verdiğim seçenekler:

  • -t Sadece TCP
  • -l Sadece dinleme portları
  • -n Servis ve ana bilgisayar adlarına bakmayın, yalnızca numaraları görüntüleyin
  • -p İşlem bilgilerini göster (kök ayrıcalığı gerektirir)

Bu durumda, bunu görebiliyorum sshdherhangi arayüzü (dinlemektedir 0.0.0.0) portu 22 ve cupsdloopback (dinlediği 127.0.0.1) bağlantı noktası 631 olduğunu gösterebilir Çıktınız telnetdyerel bir adresi vardır 192.168.1.1:23o geri döngü adaptörü üzerindeki bağlantılara cevap vermeyecek, yani (örneğin yapamazsınız telnet 127.0.0.1).

Benzer bilgileri gösterecek başka araçlar da var (örneğin lsofveya /proc), ancak netstat en yaygın olanıdır. Hatta Windows üzerinde çalışıyor ( netstat -anb). BSD netstat biraz farklıdır: bunun yerine işlem bilgisini almak için sockstat (1) kullanmanız gerekir.

İşlem kimliğine ve program adına sahip olduğunuzda, bağlantı noktasını kapatmak istiyorsanız işlemi bulma ve öldürme hakkında gidebilirsiniz. Daha hassas kontrol için, yalnızca belirli adreslere erişimi sınırlamak için güvenlik duvarı (Linux'ta iptables) kullanabilirsiniz. Bir servis başlatmasını devre dışı bırakmanız gerekebilir. Eğer PID Linux'ta "-" ise, muhtemelen bir çekirdek işlemidir (örneğin NFS'de yaygındır), bu yüzden ne olduğunu bulmada iyi şanslar.

Not: "Yetkili" dedim çünkü ağ koşulları ve güvenlik duvarları tarafından engellenmiyorsunuz. Bilgisayarınıza güveniyorsanız, bu harika. Ancak, saldırıya uğradığınızdan şüpheleniyorsanız, bilgisayarınızdaki araçlara güvenemeyebilirsiniz. Standart yardımcı programları (ve hatta bazen sistem çağrılarını bile) belirli işlemleri veya bağlantı noktalarını gizleyenlerle (aka rootkit'ler) değiştirmek saldırganlar arasında standart bir uygulamadır. Bu noktada en iyi bahis, diskinizin adli bir kopyasını çıkarmak ve yedekten geri yüklemek; sonra kopyalanma şeklini belirlemek ve kapatmak için kullanın.


14

Bir Linux sistemi dahili iletişim için sözde loopback arayüzüne sahiptir. Ana bilgisayar adı localhostve IP adresi 127.0.0.1.

Eğer çalıştırdığınızda nmapüzerinde localhost, gerçekte üzerinde portscan koşmak sanal geri döngü arabirimine. Fiziksel (muhtemelen ) arayüzünüzün 192.168.1.1IP adresidir .eth0

Çalıştırdığınız Yani nmapiki farklı ağ arayüzleri açık limanlarında fark var neden, bu. İkisi de doğru.

Açık 23 numaralı TCP bağlantı noktanız varsa, telnetçalışan bir sunucunuz vardır (şifreleme olmaması nedeniyle iyi bir şey değildir) veya makinenizde bir çeşit truva atı olabilir.


1
peki nasıl kapatabilirim?
user74080

4
@ user74080 iptablesYakındaki bir cevabın önerdiği gibi bir kural ekleyebilirsiniz , ancak hizmet kullanılmaya devam eder ve bu da kaynakları tüketir. Eğer telnetdkoşuyorsanız, sadece kapatın.
psimon

12

Bağlantı noktasını "kapatmak" için kullanabilirsiniz iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP

1
Bu cevapta, "portun kapatılması", "trafiği görmezden gelmek" anlamına gelir. Bağlantı noktası hala açık, ancak artık ulaşılamıyor. Ayrıca DROP, dediği gibi, paketi görür ve sonra onu yok sayar. Normalde (iptables etkin olmadan), çekirdek geri erişilemez bir paket geri ICMP portu gönderir (bunun REJECTyerine hedefle simüle edilebilir DROP).
Lekensteyn

3
@Lekensteyn ICMP portuna ulaşılamıyor UDP içindir. Yanıtlanacak uygun paket, REJECThedef yazılarak da üretilebilen bir TCP RST paketidir -j REJECT --reject-with tcp-reset.
kasperd

Düşük puana rağmen, bu aslında soruyu cevaplayan ilk cevap. Kim burada daha fazla puan ekleyebilir, lütfen bunu yapın.
EnzoR

2

Bunu yaparsanız nmap localhost, size farklı bir durum hakkında bilgi verir: linux'taki bazı programlar yalnızca yerel olarak kullanılmasına rağmen sunucu olarak çalışır. Bunun nedeni, diğer programların onları bağlandıkları bir sunucu gibi kullanmasıdır. Her iki cevap da doğru, çünkü siz farklı bir şey soruyorsunuz.

Telnet için 23 numaralı bağlantı noktası kullanılır. Normalde artık kullanılmamaktadır. nmap -sV 192.168.1.1Hangi programın bağlantı noktasını açtığını bulmaya çalışın .

(192 ... bir yerel ağ IP’sidir, bu nedenle nmap <your outside world IP>olası güvenlik duvarı ayarları vb. Nedeniyle sonucu da farklı bir sonuç verecektir.)


1

23 numaralı bağlantı noktasını çalıştıran ve dinleyen bir hizmetiniz varsa , 23 numaralı bağlantı noktasını (muhtemelen ) dinleyen işlemi durdurup durdurmayı veya 23 numaralı bağlantı noktasını kullanmayı engellemektentelnet daha açık bir şekilde daha temiz .iptables

Bir bağlantı noktasını dinleyen bir işlem olmadığında, güvenlik duvarı bloğu olmasa bile, ona bağlanmaya çalışılması derhal "bağlantı reddedildi" ( ECONNREFUSEDile connect(2)) sonuçlanmalıdır.

Bu tür bir işlem varsa, 23 numaralı bağlantı noktasını dinleyen işlemi (ve bunun pidini) bulmanın bir yolu:

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

Yukarıdaki -ilistelerde açık internet portları (hem UDP hem de TCP) listelenmiştir ve -P portların servis isimlerine çevrilmesini engellemektedir (üzerinden /etc/services)

23 numaralı bağlantı noktasını dinleyen koşu sürecini bulduktan sonra, işlem ağacına bakarak (örneğin, söyleyerek pstree) nasıl başladığını anlayabilirsiniz . Eğer ebeveyni init(büyük olasılıkla) ise, altında işlemin adını tekrar tekrar arayabilirsiniz /etc. Örneğin:

sudo grep -r telnet /etc

Bu, sizi ilk etapta çalışmasını engellemenin en iyi yoluna götürmelidir.


Grep kullanmaya gerek yoktur (ve varsa alıntılara gerek yoktur). Kullanabilirsiniz sudo lsof -Pi :23.
Théophile

Alıntılar iyi bir sebepten dolayı var. Sadece telnet portunun ( 23) eşleştiğinden emin olmak için . Eğer sonra boşluk dahil etmezseniz :23o maç olacak :234, :2345vs.
arielf

Ah, anlıyorum. Bu grep için mantıklı. Bu arada, grep ( lsof -Pi :23) komutunun tam bir eşleşme aradığı anlaşılıyor .
Théophile
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.