Comment fermer les ports sous Linux?

J'ai quelques questions à la fermeture du port, je pense que j'ai eu des choses étranges.

Quand j'utilise execute

nmap --top-ports 10 192.168.1.1 

cela montre que le port 23 / TCP est ouvert.

Mais quand j'exécute

 nmap --top-ports 10 localhost 

il montre que le port 23 / tcp est fermé.

Lequel d'entre eux est vrai? Je veux fermer ce port sur tout mon système, comment puis-je le faire?

Nmap est un excellent scanner de ports, mais parfois vous voulez quelque chose de plus autoritaire. Vous pouvez requestr au kernel quels process ont quels ports s'ouvrent à l'aide de l'utilitaire netstat :

 moi @ myhost: ~ $ sudo netstat -tlnp
 logins Internet actives (servers uniquement)
 Proto Recv-Q Adresse locale d'envoi-Q Adresse d'état étranger PID / Nom du programme
 tcp 0 0 127.0.0.1:53 0.0.0.0:* ÉCOUTER 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:* ÉCOUTER 822 / cupsd       
 tcp6 0 0 ::: 22 ::: * ÉCOUTER 380 / sshd        
 tcp6 0 0 :: 1: 631 ::: * ÉCOUTER 822 / cupsd       

Les options que j'ai données sont les suivantes:

  • -t TCP uniquement
  • -l Ports d'écoute uniquement
  • -n Ne search pas les noms de service et d'hôte, affiche simplement les numéros
  • -p Affiche les informations sur le process (nécessite le privilège root)

Dans ce cas, nous pouvons voir que sshd est à l'écoute sur n'importe quel port 22 ( 0.0.0.0 ) de l'interface et que cupsd écoute le port 631 ( 127.0.0.1 ). Votre sortie peut montrer que telnetd a une adresse locale de 192.168.1.1:23 , ce qui signifie qu'il ne répondra pas aux connections sur l'adaptateur de bouclage (par exemple vous ne pouvez pas telnet 127.0.0.1 ).

Il existe d'autres outils qui afficheront des informations similaires (par exemple lsof ou /proc ), mais netstat est le plus largement disponible. Cela fonctionne même sur Windows ( netstat -anb ). BSD netstat est un peu différent: vous devrez utiliser sockstat (1) pour get les informations sur le process.

Une fois que vous avez l'identifiant du process et le nom du programme, vous pouvez find le process et le tuer si vous souhaitez fermer le port. Pour un contrôle plus fin, vous pouvez utiliser un pare-feu (iptables sous Linux) pour limiter l'access à certaines adresses. Vous devrez peut-être désactiver un service de démarrage. Si le PID est "-" sous Linux, il s'agit probablement d'un process kernel (ce qui est courant avec NFS par exemple), alors bonne chance pour savoir ce que c'est.

Note: J'ai dit "faisant autorité" parce que vous n'êtes pas gêné par les conditions de réseau et les pare-feu. Si vous faites confiance à votre ordinateur, c'est génial. Toutefois, si vous pensez que vous avez été piraté, vous risquez de ne pas pouvoir faire confiance aux outils de votre ordinateur. Le rlocation des utilitaires standard (et parfois même des appels système) par ceux qui cachent certains process ou ports (aka rootkits) est une pratique courante chez les attaquants. Votre meilleur pari à ce stade est de faire une copy légale de votre disque et de restaurer à partir de la sauvegarde; puis utilisez la copy pour déterminer la façon dont ils sont entrés et la fermer.

Un système Linux a une interface dite de bouclage, qui est pour la communication interne. Son nom d'hôte est localhost et son adresse IP est 127.0.0.1 .

Lorsque vous exécutez nmap sur localhost , vous exécutez le portscan sur l'interface de bouclage virtuel . 192.168.1.1 est l'adresse IP de votre interface physique (probablement eth0 ).

Donc, vous avez exécuté nmap sur deux interfaces réseau différentes, c'est pourquoi il y a une différence dans les ports ouverts. Ils sont tous les deux vrais.

Si le port TCP 23 est ouvert, il est probable que vous ayez un server telnet en cours d'exécution (ce qui n'est pas une bonne chose en raison de son manque de encryption) ou si vous avez une sorte de cheval de Troie sur votre machine.

Pour "fermer" le port, vous pouvez utiliser iptables

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

Si vous faites nmap localhost , cela vous indique une situation différente: certains programmes sous Linux fonctionnent comme server bien qu'ils ne soient utilisés que localement. C'est parce que d'autres programmes les utilisent comme un server auquel ils se connectent. Donc, les deux réponses sont vraies, puisque vous requestz quelque chose de différent.

Le port 23 est utilisé pour telnet. Normalement pas utilisé. Essayez de faire nmap -sV 192.168.1.1 pour savoir quel programme ouvre le port.

(192 … est un réseau local IP, de sorte que le résultat de nmap <your outside world IP> donnera également un résultat différent, en raison des parameters de pare-feu possibles, etc.)

Si vous avez un service qui s'exécute et écoute sur le port 23, il est sans doute plus propre d' arrêter le process qui écoute le port 23 (probablement telnet ) que de le faire fonctionner et de fermer ou bloquer le port 23 en utilisant iptables .

Lorsqu'il n'y a pas de process d'écoute sur un port, même en l'absence de pare-feu, toute tentative de connection doit entraîner une "connection refusée" ECONNREFUSED ( ECONNREFUSED pour se connect(2) )

Une façon de find le process (et son pid) qui écoute le port 23, s'il y a un tel process, est:

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

Dans la list ci-dessus, les ports Internet ouverts (UDP et TCP) et -P inhibent la traduction des ports vers les noms de service (via /etc/services )

Une fois que vous avez trouvé le process en cours d'écoute sur le port 23, vous pouvez déterminer comment il a démarré en regardant l'arborescence du process (avec, par exemple, pstree ). Si son parent est init (très probablement), vous pouvez searchr récursivement le nom du process sous /etc par exemple:

 sudo grep -r telnet /etc 

Cela devrait vous conduire à la meilleure façon de le désactiver de courir à la première place.