Как закрыть порт linux

Обновлено: 06.07.2024

Подскажите пожалуйста команды в iptables, для того что бы:


1. закрыть все входящие порты, кроме 22, 80, 5432

2. открыть все исходящие порты

3. открыть порт 80 для всех входящих соединений

4. открыть 22 и 5432 порты только для конкретного IP

  • Вопрос задан более трёх лет назад
  • 68601 просмотр
1. закрыть все входящие порты
iptables -P INPUT DROP
2. открыть все исходящие порты
iptables -P OUTPUT ACCEPT
3. открыть порт 80 для всех входящих соединений
iptables -A INPUT --dport 80 -j ACCEPT
4. открыть 22 и 5432 порты только для конкретного IP
iptables -A INPUT -m multiport --dports 22,5432 -s IP_ADDRESS -j ACCEPT И сохранить настройки вроде так: //sbin/iptables-save. Помнится вроде так и делал, но что-то не всё выходило. Отпишитесь, если всё получится (и скрипт тоже)). iptables-save выдает список правил в формате, который можно скормить iptables-restore.
Можно это вручную, сохранять в файл, на автозапуск настроить iptables-restore < file, либо init-скрипты дистрибутивов это обычно умеют:
service iptables save в федоре
/etc/init.d/iptables save в gentoo ГЛАВНОЕ не выполнять это по ssh, иначе после первой строчки настройка закончится.
Дополнительно советую сначала отправлять «остальные» пакеты не в дроп, а в лог — так можно обнаружить порты, которые изначально забыли открыть. Не закончиться, если делать через &&…
Для пущей безопасности можно подстаховаться и сделать (sleep 120 && reboot) & Точнее так, иначе после случайного дисконекта ssh процесс вылетит.
nohup (sleep 120 && reboot) & Поясните, плиз, в чём проблема выполнения скрипта настройки iptables по ssh. Ну, ты пишешь в консоле «iptables -P INPUT DROP» и отрубаешься от своего сервера до тех пор, пока он не перезапуститься =) VPS можно из панели управления перезапустить, а если сервер физический… придеться звонить ребятам тех. поддержки =) При настройке через ssh лучше сначала сделать разрешающее правило на порт ssh, после чего убедиться что оно работает (посмотреть счетчик пакетов по нему). Если всё сделать с первого раза правильно, то проблем, конечно, не будет, однако береженого бог бережет. У меня поначалу случались такие ошибки.
И еще раз повторюсь про трюк с отправкой в лог по-умолчанию, пару раз это помогало найти порты, которые изначально открыть забыл. С вашим конфигом исходящие соединения работать не будут. Необходимо ещё правило, разрешающее прохождение ответных пакетов (что-то вроде «iptables -A INPUT -i eth0 --match state --state ESTABLISHED,RELATED -j ACCEPT»). Ниже есть правильное решение.

cjey

iptables -X
iptables -t nat -X
iptables -t mangle -X

Серверы и компьютеры, подключенные к интернету подвержены атакам и сканированию различных скриптов, программ и злоумышленников. А поскольку известно, что во всех системах могут быть уязвимости, то лучше, чтобы извне было видно минимум портов.

Некоторые порты должны быть видны постоянно, например, порт веб-сервера, другие используются только системными администраторами, а еще одни, вообще, должны быть доступны только локально. Несмотря на то что все сервисы имеют методы авторизации, и не позволят подключиться кому попало, они могут быть уязвимы, поэтому все лишнее лучше закрыть. В этой статье мы рассмотрим как закрыть порт iptables. Мы закроем нужные порты полностью, а также сделаем некоторые из них доступными на время, после попытки подключения к определенному порту.

Как закрыть порт Iptables

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

sudo netstat -ntulp

Для анализа портов, доступных извне используется программа nmap:


Как видите, извне у нас, кроме стандартных портов веб-сервера, доступны mysql, ftp, dns и другие сервисы. Некоторые из них не должны быть доступны публично. Это не критично, но и нежелательно. Мы можем очень просто закрыть такие порты с помощью iptables. Общий синтаксис команды для блокировки порта будет выглядеть вот так:

$ iptables -A INPUT -p tcp --dport номер_порта -j DROP

Например, если мы хотим заблокировать порт iptables mysql, то необходимо выполнить:

sudo iptables -A INPUT -p tcp --dport 3306 -j DROP

Можно закрыть порт для определенного интерфейса, например, eth1:

sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -j DROP

Или даже для ip и целой подсети. Например, закрыть все подключения к порту 22 SSH кроме IP адреса 1.2.3.4:

sudo iptables -A INPUT -i eth1 -p tcp -s !1.2.3.4 --dport 22 -j DROP

Здесь знак восклицания означает инверсию, то есть применить ко всем кроме этого. Можно убрать этот знак и указать только IP, к которым нужно применить запрет. Мы рассмотрели как закрыть порт iptables в цепочке INPUT, которая отвечает за входящие соединения, это более применимо к серверам. Но что, если нужно закрыть подключение к удаленному порту из этого компьютера или нашей сети? Для этого существует цепочка OUTPUT.

Например, заблокируем попытки отправки почты подключением к любой машине по порту 25:

sudo iptables -A OUTPUT -p tcp --dport 25 -j DROP

Также, как и раньше, вы можете указать исходящий сетевой интерфейс, только теперь он указывается опцией -o:

sudo iptables -A OUTPUT -o eth1 -p tcp --dport 25 -j DROP

После того как вы завершите с настройкой портов нужно сохранить все созданные правила, чтобы они остались активными даже после перезагрузки. Для этого выполните:

Чтобы посмотреть текущие правила для каждой из цепочек выполните:

sudo iptables -L -n -v

Такая команда покажет все правила, а если вы хотите только информацию о заблокированных портах, выполните:

sudo iptables -L -n -v | grep -i DROP


Очистить все правила в случае возникновения проблем можно командой:

sudo iptables -F

Закрыть порты iptables, кроме разрешенных

По умолчанию политика для цепочек INPUT и OUTPUT - разрешать все подключения, а уже с помощью правил мы указываем какие подключения стоит запретить. Но если вы хотите закрыть все порты кроме разрешенных iptables. То нужно поступить по-другому. Мы поменяем политику по умолчанию, так чтобы она запрещала все и разрешим только доступ к нужным портам.

Например, меняем политику для цепочки INPUT:

sudo iptables -P INPUT DROP

Затем разрешаем все входящие соединения от локального интерфейса:

sudo iptables -A INPUT -i lo -j ACCEPT

Затем разрешаем доступ к портам 80 и 22:

sudo iptables -A INPUT -i eth0 -p tcp --dport 80 --match state --state NEW -j ACCEPT
$ sudo iptables -A INPUT -i eth0 -p tcp --dport 80 --match state --state NEW -j ACCEPT

Как скрыть порт iptables?

Закрыть порт, это очень хорошо, но что если он нужен нам открытым и желательно, чтобы для других этот же порт был недоступен. Существует такая технология, как Port Knocking, которая позволяет открывать нужный порт только для определенного ip адреса и только после обращения его к нужному порту. Например, нам нужно защитить SSH от перебора паролей и несанкционированного доступа. Для этого все пакеты, которые будут приходить на порт 22, 111 и 112 мы будем перенаправлять в цепочку SSH.

Как вы уже догадались, порт 22 нам непосредственно нужен, на порты 111 и 112 будут включать его и отключать соответственно. Когда пользователь обратится к порту 111 мы укажем системе, что нужно присвоить всем его пакетам имя ssh, при обращении к порту 112 уберем этот флаг. А если пользователь решит зайти на 22 порт, то проверим присвоено ли этому пакету имя SSH, если да, то пропустим, в противном случае - отбросим.

Сначала создаем цепочку SSH:

sudo iptables -N SSH

sudo iptables -A INPUT -p tcp --dport 22 -j SSH
$ sudo iptables -A INPUT -p tcp --dport 111 -j SSH
$ sudo iptables -A INPUT -p tcp --dport 112 -j SSH

При обращении к порту 111 присваиваем IP адресу имя, сам пакет дальше не пускаем:

sudo iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 111 -m recent --set --name SSH --rsource -j DROP

При обращении к 112 убираем имя у IP:

sudo iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 112 -m recent --remove --name SSH --rsource -j DROP

И нам осталось только проверить имеет ли наш пакет, который пытается обратиться к 22 порту имя SSH и если да, то мы его одобряем:

sudo iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 22 -m recent --rcheck --name SSH --rsource -j ACCEPT

Вот и все. Теперь для того чтобы открыть наш SSH порт будет достаточно попытаться подключиться к порту 111 с помощью telnet. Утилита сообщит, что произошла ошибка во время подключения, поскольку мы отбросили пакет:

telnet ip_адрес 111

Но зато теперь вы можете получить доступ к сервису SSH на порту 22. Чтобы снова закрыть порт выполните:

telnet ip_адрес 112

Даже при открытии, этот порт доступен только вашему ip адресу и больше никому другому. Но нужно заметить, что это не панацея. Кто-либо может случайно запросить порт, который предназначен для активации, и таким образом, открыть себе доступ к службе SSH. Так что надежные пароли и ключи шифрования это не отменяет.

Выводы

В этой статье мы рассмотрели как закрыть порт iptables, а также как его скрыть с возможностью подключения, когда это будет необходимо. Надеюсь, эта информация была для вас полезной.

Итак, вы являетесь сетевым администратором, и у вас есть несколько машин Linux в вашей сети или дата-центре. Вы обнаружили странный трафик и вам требуется его определить. Возможно ли, что трафик использует открытый порт на машине? Если так, где находится порт и как вы его закроете?

На машинах с Linux эта задача на самом деле довольно проста. Я хочу показать вам, как найти открытый порт и закрыть его. Я буду демонстрировать на Ubuntu Server 18.04, хотя процесс будет схожим во многих дистрибутивах, единственное отличие будет в том, как закрыть порт.

Как найти открытый порт

К счастью, вам не нужно устанавливать какое-либо программное обеспечение, чтобы сделать эту работу. Почему? Потому что мы будем использовать команду ss (так как netstat устарел) для просмотра портов прослушивания на вашем сервере. Это будет сделано полностью из командной строки, поэтому либо войдите на свой сервер, либо используйте безопасную оболочку для доступа. Когда вы получите приглашение bash, введите команду:

Возможны следующие варианты:

-t Показать только сокеты TCP в Linux
-u Показать только сокеты UDP в Linux
-l Показать прослушивающие сокеты (например, TCP-порт 22 открыт SSHD-сервером)
-p Список имен процессов, которые открывали сокеты
-n Не разрешать имена сервисов

Вывод команды будет перечислять только прослушиваемые порты.


Наши открытые порты

Как видите, на этой машине имеется только несколько открытых портов (53, 22, 631, 445, 3306, 11211, 80, 8080).

Если вы не уверены, какой порт соответствует какой службе, вы всегда можете узнать это в файле /etc/services. Прочитайте этот файл с помощью команды:

Вы должны увидеть список всех портов, доступных для Linux.


Какой порт linux соответствует какой службе

Как закрыть порт

Вы должны увидеть, что правила были обновлены, а порт заблокирован. Если вы обнаружите, что блокирование этого порта вызывает проблемы со службой или приложением, вы можете снова открыть его с помощью команды:

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

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

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

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

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

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

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

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

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

  • -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), так что удачи в выяснении, что это такое.

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

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

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

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

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

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

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

В этом ответе «закрытие порта» означает «игнорирование любого трафика к нему». Порт все еще открыт, но к нему больше нельзя добраться. Также обратите внимание, что DROP делает, как он говорит, он видит пакет, а затем игнорирует его. Обычно (без включенного iptables) ядро ​​отправляет обратно недоступный ICMP-порт (который можно смоделировать с помощью REJECT цели вместо DROP ). @Lekensteyn ICMP-порт недоступен для UDP. Подходящим пакетом для ответа является пакет TCP RST, который также может быть сгенерирован с использованием REJECT цели путем записи -j REJECT --reject-with tcp-reset . Несмотря на более низкий балл, это самый первый ответ, который действительно отвечает на вопрос. Кто бы ни мог добавить больше очков здесь, пожалуйста, сделайте это.

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

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

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

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

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

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

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

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

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

Возможно, на вашем ПК под управлением Linux присутствуют открытые порты, доступ к которым не требуется в текущий момент, в целях безопасности доступ к таким портам стоит закрывать. Однако, большинство Linux-дистрибутивов не предоставляют удобной возможности открывать или закрывать порты. Вы всегда можете прочитать man для iptables и самостоятельно научиться работать с этой утилитой или использовать UFW и графическую оболочку для UFW, о двух последних речь и пойдет в данной статье.

Управление портами с помощью терминала

UFW – Uncomplicated Firewall (несложный файрвол) по умолчанию установлен в Ubuntu, однако команда для его установки написана ниже, если вы не уверены установлен ли у вас ufw можете смело её выполнять.

sudo apt-get install ufw

После того как файрвол был установлен можно приступать к его настройке. Для открытия порта используется команда

sudo ufw allow <порт>/<протокол>

Где порт – номер порта, который вы хотите открыть, а протокол – необязательный аргумент, с помощью которого вы можете указать протокол, который будет использоваться на данном порте.

sudo ufw allow 80/tcp

Откроет стандартный 80 порт для протокола tcp

sudo ufw allow 21

Откроет стандартный порт для FTP протокола.

Для закрытия порта используется команда

sudo ufw deny <порт>

sudo ufw deny 21

Закроет порт 21 для любых соединений.

Также вы можете указать с какого адреса вы хотите получать соединения к указанному порту

sudo ufw allow from 192.168.0.1 to any port 22

Данная команда разрешит доступ к SSH (порт 22) только с адреса 192.168.0.1, со всех остальных адресов порт будет недоступен.

Для включения и выключения UFW используется команды:

sudo ufw enable и sudo ufw disable соответственно.

Для просмотра всех установленных правил используется команда

sudo ufw status numbered

В левой колонке вы увидите номера всех установленных правил, если вы хотите удалить одно из них просто выполните команду

sudo ufw delete <номер>

где номер – номер правила, полученный командой sudo ufw status numbered.

Управление портами с помощью графического интерфейса

Для управления файрволом с помощью графического интерфейса вам понадобится утилита GUFW, установить её можно командой

sudo apt-get install gufw

После чего откройте установленную программу и переключите слайдер Status, чтобы файрвол начал работать.

После чего откройте окно Rules, нажмите на «+», у вас появится окно с выбором параметров, если вы просто хотите открыть или закрыть порт, выберите вкладку Simple, если у вас более комплексная задача – выберите вкладку Advanced.

Во вкладке Simple в поле Name введите любое имя для нового правила, в поле Policy выберите Deny – если хотите закрыть порт и Allow – если хотите открыть порт (в данном поле также есть варианты Reject – будет блокировать все соединения к данному порту и Limit – будет ограничивать соединения к данному порту). В поле Direction выберите In – если хотите открыть или закрыть входящие соединения, Out – если исходящие. В поле Port введите номер необходимого порта.

После заполнения всех полей нажмите на кнопку «Add», после чего правило будет установлено в GUFW.

Читайте также: