Як закрити порти в Linux?

У мене є питання в закритті порту, я думаю, що я отримав деякі дивні речі.

Коли я використовую execute

nmap --top-ports 10 192.168.1.1

це показує, що 23/TCP порт відкритий.

Але коли я виконую

nmap --top-ports 10 localhost

він показує, що 23/tcp порт закритий.

Який з них правда? Я хочу закрити цей порт на всій системі, як це зробити?

36
Явна наївність цього питання призвела до приголомшливих відповідей. Дякуємо за питання!
додано Автор Daniel Waechter, джерело
обидва вони вірні. Порти TCP не пов'язані з хостами. вони пов'язані з мережевими інтерфейсами. різниця тонка, але важлива. інтерфейси часто збігаються з хостами, але не завжди. у цьому випадку (як зазначено у відповідях) localhost отримує доступ до lo (loopback) інтерфейсу. IP-адреса приєднується до вашого реального інтерфейсу, ймовірно, eth0 або wlan0 або деякі інші.
додано Автор strugee, джерело

5 Відповіді

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

[email protected]:~$ sudo netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   Foreign Address   State    PID/Program name
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           :::*              LISTEN   380/sshd        
tcp6       0      0 ::1:631         :::*              LISTEN   822/cupsd       

Наведені мною варіанти:

  • -t TCP only
  • -l Listening ports only
  • -n Don't look up service and host names, just display numbers
  • -p Show process information (requires root privilege)

У цьому випадку ми бачимо, що sshd прослуховує будь-який інтерфейс ( 0.0.0.0 ) порт 22, і cupsd прослуховує петлю ( 127.0.0.1 ) порт 631. Вихідні дані можуть показувати, що telnetd має локальну адресу 192.168.1.1:23 , тобто він не відповідає до з'єднань на адаптері loopback (наприклад, ви не можете telnet 127.0.0.1 ).

There are other tools that will show similar information (e.g. lsof or /proc), but netstat is the most widely available. It even works on Windows (netstat -anb). BSD netstat is a little different: you'll have to use sockstat(1) to get the process information instead.

Після того, як ви маєте ідентифікатор процесу та ім'я програми, ви можете перейти до пошуку процесу та його вбивства, якщо ви бажаєте закрити порт. Для більш чіткого керування можна використовувати брандмауер (iptables на Linux) для обмеження доступу лише до певних адрес. Можливо, потрібно буде вимкнути запуск служби. Якщо PID є "-" на Linux, це, ймовірно, процес ядра (це звичайно з NFS наприклад), так що удачі з'ясувати, що це таке.

Примітка: я сказав "авторитетний", тому що вам не заважають умови мережі та брандмауери. Якщо ви довіряєте своєму комп'ютеру, це чудово. Однак, якщо ви підозрюєте, що ви були зламані, ви не зможете довіряти інструментам на вашому комп'ютері. Заміна стандартних утиліт (а іноді навіть і системних викликів) на ті, які приховують певні процеси або порти (a.k.a. rootkits), є стандартною практикою серед зловмисників. Найкраще зробити це, щоб зробити копію вашого диска і відновити його з резервної копії; потім скористайтеся копією, щоб визначити, як вони потрапили і закрили її.

44
додано

Система Linux має так званий інтерфейс loopback, який призначений для внутрішнього зв'язку. Його ім'я хоста localhost , а його IP-адреса - 127.0.0.1 .

Коли ви запускаєте nmap на localhost , ви фактично запускаєте portscan на віртуальному інтерфейсі loopback. 192.168.1.1 - це IP-адреса вашого фізичного інтерфейсу (швидше за все, eth0 ).

Отже, ви запускаєте nmap на двох різних мережевих інтерфейсах, тому є відмінність у відкритих портах. Вони обидва вірні.

Якщо у вас відкритий порт TCP 23, то, ймовірно, у вас працює сервер telnet (що не є хорошим результатом через відсутність шифрування) або у вас є троянський кінь .

14
додано
так як я можу його закрити?
додано Автор anthony, джерело
@ user74080 Ви можете додати правило iptables , як запропонував відповідь поблизу, але він не дозволить використовувати службу, яка споживає ресурси. Отже, якщо у вас працює telnetd , просто закрийте його.
додано Автор hassan abdul rehman, джерело

Для "закриття" порту можна використовувати iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP
10
додано
Незважаючи на нижчий бал, це перша відповідь на питання. Будь-хто, хто може додати більше очок, будь ласка, зробіть це.
додано Автор Nick Hawes, джерело
У цій відповіді "закриття порту" означає "ігнорування будь-якого трафіку до нього". Порт все ще відкритий, але до нього більше не можна дістатися. Також зверніть увагу, що DROP виконує те, що він каже, він бачить пакет, а потім ігнорує його. Зазвичай (без увімкнення iptables) ядро ​​відправляє назад пакет недоступних для ICMP-портів (який можна моделювати за допомогою цілі REJECT замість DROP ).
додано Автор KDM, джерело
@Lekensteyn ICMP порт недоступний для UDP. Відповідний пакет для відповіді - це пакет RST TCP, який також можна генерувати за допомогою цілі REJECT , написавши -j REJECT --reject-with tcp-reset .
додано Автор kasperd, джерело

If you do nmap localhost, it tells you about a different situation: some programs on linux work as server although they are used only locally. This is because other programs use them like a server they connect to. So both answers are true, since you ask something different.

Порт 23 використовується для telnet. Зазвичай не використовується більше. Спробуйте знайти nmap -sV 192.168.1.1 , щоб дізнатися, яка програма відкриває порт.

(192... is a local network IP, so the result of nmap will also give a different result, because of possible firewall settings etc)

2
додано

If you have a service running and listening on port 23, it is arguably cleaner to stop the process that listens to port 23 (probably telnet) than to keep it running and close or block port 23 using 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
додано