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


38

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

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

nmap --top-ports 10 192.168.1.1

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

Але коли я страчу

nmap --top-ports 10 localhost

це показує, що порт 23 / tcp закритий.

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


10
вони обоє правдиві. TCP-порти не пов’язані з хостами. вони пов'язані з мережевими інтерфейсами. різниця тонка, але важлива. інтерфейси часто ті ж, що і хости, але не завжди. у цьому випадку (як зазначено у відповідях) localhostдоступ до loінтерфейсу (петлі). IP - адреса буде екранним ваш реальний інтерфейс, ймовірно , eth0або wlan0чи конвертувати.
strugee

3
Очевидна наївність цього питання призвела до деяких приголомшливих відповідей. Дякую за запитання!
dotancohen

Відповіді:


47

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

я @ 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 / сшд        
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 822 / скл       
tcp6 0 0 ::: 22 ::: * LISTEN 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * СПИСОК 822 / чаш       

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

  • -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). BSD netstat дещо інший: для отримання інформації про процес вам доведеться використовувати sockstat (1) .

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

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


14

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

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

Таким чином, ви працюєте nmapна двох різних мережевих інтерфейсах, тому у відкритих портах є різниця. Вони обоє правдиві.

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


1
так як я можу його закрити?
user74080

4
@ user74080 Ви можете додати iptablesправило, як підказує відповідь поблизу, але це дозволить службі не використовуватись, що споживає ресурси. Тож якщо у вас telnetdбіг, просто вимкніть його.
psimon

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. Правильний пакет, на який потрібно відповісти, - це пакет RST TCP, який також можна генерувати, використовуючи REJECTціль, записавши -j REJECT --reject-with tcp-reset.
kasperd

Незважаючи на нижчий бал, це найперша відповідь, яка насправді відповідає на питання. Хто тут може додати більше балів, будь ласка, зробіть це.
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-му місці.


Немає необхідності використовувати греп (а якби вони були, то немає потреби в котируваннях). Можна використовувати sudo lsof -Pi :23.
Теофіл

Цитати є з вагомих причин. Щоб переконатися, що відповідає тільки порт telnet ( 23). Якщо ви не включили пробіл після :23він буде відповідати :234, і :2345т.д.
arielf

А, бачу. Це має сенс для грепу. До речі, здається, що команда без grep ( lsof -Pi :23) шукає точну відповідність.
Теофіл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.