Как закрыть порты в Linux?

38

У меня есть какой-то вопрос в закрытии порта, я думаю, что у меня есть некоторые странные вещи.

Когда я использую выполнить

nmap --top-ports 10 192.168.1.1

это показывает, что порт 23 / TCP открыт.

Но когда я выполню

nmap --top-ports 10 localhost

это показывает, что порт 23 / tcp закрыт.

Какой из них является правдой? Я хочу закрыть этот порт на всей моей системе, как я могу это сделать?

user74080
источник
10
они оба правдивы. Порты TCP не связаны с хостами. они связаны с сетевыми интерфейсами. разница тонкая, но важная. интерфейсы часто совпадают с хостами, но не всегда. в этом случае (как указано в ответах) localhostосуществляется доступ к loинтерфейсу (loopback). IP-адрес получает доступ к вашему реальному интерфейсу, возможно, eth0или wlan0или как-то так.
Стружец
3
Очевидная наивность этого вопроса привела к некоторым потрясающим ответам. Спасибо за вопрос!
dotancohen

Ответы:

47

Nmap - отличный сканер портов, но иногда вам хочется чего-то более авторитетного. Вы можете спросить ядро, какие процессы имеют какие порты открывать, используя netstatутилиту:

me @ myhost: ~ $ sudo netstat -tlnp
Активные интернет-соединения (только серверы)
Proto Recv-Q Send-Q Локальный адрес Внешний адрес Состояние PID / Название программы
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 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 ::: * СЛУШАТЬ 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * LISTEN 822 / cupsd       

Варианты, которые я дал:

  • -t Только TCP
  • -l Только прослушивающие порты
  • -n Не ищите имена сервисов и хостов, просто отображайте номера
  • -p Показать информацию о процессе (требуется привилегия root)

В этом случае мы можем видеть, что sshdпрослушивает любой 0.0.0.0порт интерфейса ( ) 22 и cupsdпрослушивает 127.0.0.1порт 631 loopback ( ). Ваш вывод может показать, что telnetdимеет локальный адрес 192.168.1.1:23, то есть он не будет отвечать на соединения на адаптере обратной связи (например, вы не можете telnet 127.0.0.1).

Существуют и другие инструменты, которые отображают аналогичную информацию (например, lsofили /proc), но netstat является наиболее широко доступным. Это даже работает на Windows ( netstat -anb). Netstat в BSD немного отличается: вам придется использовать sockstat (1) для получения информации о процессе.

Если у вас есть идентификатор процесса и имя программы, вы можете найти процесс и убить его, если хотите закрыть порт. Для более детального управления вы можете использовать брандмауэр (iptables в Linux), чтобы ограничить доступ только определенными адресами. Возможно, вам придется отключить запуск службы. Если PID в Linux означает «-», это, вероятно, процесс ядра (например, это характерно для NFS), так что удачи в выяснении, что это такое.

Примечание: я сказал «авторитетный», потому что вам не мешают условия сети и брандмауэры. Если вы доверяете своему компьютеру, это здорово. Однако, если вы подозреваете, что вас взломали, вы не сможете доверять инструментам на своем компьютере. Замена стандартных утилит (а иногда даже системных вызовов) на те, которые скрывают определенные процессы или порты (или руткиты), является стандартной практикой для злоумышленников. Лучше всего на этом этапе сделать криминалистическую копию вашего диска и восстановить ее из резервной копии; затем используйте копию, чтобы определить, как они вошли, и закройте ее.

bonsaiviking
источник
14

Система Linux имеет так называемый петлевой интерфейс, предназначенный для внутренней коммуникации. Его имя хоста localhostи IP-адрес 127.0.0.1.

При запуске nmapна localhost, вы на самом деле запустить PortScan на виртуальном кольцевом интерфейсе. 192.168.1.1это IP-адрес вашего физического (наиболее вероятного eth0) интерфейса.

Итак, вы работаете nmapна двух разных сетевых интерфейсах, поэтому есть разница в открытых портах. Они оба правдивы.

Если у вас открыт TCP-порт 23, вероятно, у вас telnetзапущен сервер (что не очень хорошо из-за отсутствия шифрования), или у вас на компьютере какой-то троянский конь.

psimon
источник
1
так как я могу закрыть его?
user74080
4
@ user74080 Вы можете добавить iptablesправило, как подсказывает ближайший ответ, но оно не будет использовать службу, которая потребляет ресурсы. Так что, если у вас есть telnetdбег, просто выключите его.
Псимон
12

Чтобы «закрыть» порт вы можете использовать iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP
ручей
источник
1
В этом ответе «закрытие порта» означает «игнорирование любого трафика к нему». Порт все еще открыт, но к нему больше нельзя добраться. Также обратите внимание, что DROPделает, как он говорит, он видит пакет, а затем игнорирует его. Обычно (без включенного iptables) ядро ​​отправляет обратно недоступный ICMP-порт (который можно смоделировать с помощью REJECTцели вместо DROP).
Лекенштейн
3
@Lekensteyn ICMP-порт недоступен для UDP. Подходящим пакетом для ответа является пакет TCP RST, который также может быть сгенерирован с использованием REJECTцели путем записи -j REJECT --reject-with tcp-reset.
Касперд
Несмотря на более низкий балл, это самый первый ответ, который действительно отвечает на вопрос. Кто бы ни мог добавить больше очков здесь, пожалуйста, сделайте это.
EnzoR
2

Если вы это сделаете nmap localhost, он расскажет вам о другой ситуации: некоторые программы на Linux работают как сервер, хотя они используются только локально. Это потому, что другие программы используют их как сервер, к которому они подключаются. Так что оба ответа верны, так как вы спрашиваете что-то другое.

Порт 23 используется для Telnet. Обычно не используется больше. Попробуйте сделать, nmap -sV 192.168.1.1чтобы узнать, какая программа открывает порт.

(192 ... это IP-адрес локальной сети, поэтому результат nmap <your outside world IP>также даст другой результат из-за возможных настроек брандмауэра и т. Д.)

вещий
источник
1

Если у вас есть служба, работающая и прослушивающая порт 23, возможно, будет чище остановить процесс, который прослушивает порт 23 (возможно telnet), чем оставить его работающим и закрыть или заблокировать использование порта 23 iptables.

Когда процесс не прослушивает порт, даже при отсутствии блока брандмауэра, любая попытка подключиться к нему должна привести к немедленному «отказу в соединении» ( ECONNREFUSEDк connect(2))

Один из способов найти процесс (и его pid), который прослушивает порт 23, если такой процесс существует:

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

В приведенных выше -iсписках открываются интернет-порты (как UDP, так и TCP), а -P запрещает перевод портов в имена сервисов (через /etc/services)

После того, как вы обнаружили, что запущенный процесс прослушивает порт 23, вы можете выяснить, как он запущен, посмотрев на дерево процессов (скажем, pstree). Если его родитель init(очень вероятно), вы можете рекурсивно искать имя процесса в /etc. например:

sudo grep -r telnet /etc

Это должно привести вас к лучшему способу отключить его запуск в 1-м месте.

arielf
источник
Там нет необходимости использовать grep (и, если были, нет необходимости в кавычках). Вы можете использовать sudo lsof -Pi :23.
Теофил
Цитаты там по уважительной причине. Чтобы убедиться, что только telnet порт ( 23) соответствует. Если вы не :23:234:2345
включите
Ах я вижу. Это имеет смысл для grep. Кстати, похоже, что команда без grep ( lsof -Pi :23) ищет точное совпадение.
Теофиль