Запретить iptables порты linux

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

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

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

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

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

Для анализа портов, доступных извне используется программа 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.

Читайте также:  What is java linux rpm

Например, заблокируем попытки отправки почты подключением к любой машине по порту 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 | grep -i DROP

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

Закрыть порты 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, если да, то пропустим, в противном случае — отбросим.

Читайте также:  Невозможно получить все индексы репозитория linux mint 20

Сначала создаем цепочку 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. Утилита сообщит, что произошла ошибка во время подключения, поскольку мы отбросили пакет:

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

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

Выводы

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

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Источник

Блокировка в iptables по IP адресу и порту

Блокировка в iptables — правило, позволяющее предотвратить поступление запросов по порту, интерфейсу или с определенного ip адреса.

Читайте также:  Linux дистрибутивы для слабого компьютера

Пакеты при такой блокировке в принципе не попадут на сервер, что выгодно отличает данный способ от, например, блокировки на уровне веб-сервера. В зависимости от настроек в ответ на запрос будет либо ошибка, либо таймаут соединения.

Данные правила являются дополнением к базовому firewall.

Блокировка в iptables

Определенные сетевые пакеты при попадании на серверную машину извне могут получать статус INVALID. Такие пакеты не несут никакой нужной информации и их можно сразу отбрасывать.

iptables -A INPUT -m conntrack —ctstate INVALID -j DROP

Базовая блокировка

Нежелательный адрес можно заблокировать следующим образом:

iptables -A INPUT -s 15.15.15.51 -j DROP

Добавленное правило можно увидеть в выводе iptables-save на сервере

Блокировка в iptables по IP адресу и порту

Пакеты при этом не будут доходить, отправителю при этом будет возвращаться ответ port unreacheable

Это говорит о наличии firewall и фильтрации, то есть предоставляет обращающемуся к серверу информацию. По крайней мере он знает что такой сервер есть и он в сети.

Чтобы полностью скрыть от потенциального злоумышленника сканирующего сеть в поисках уязвимой машины можно использовать не DROP, а REJECT. Тогда никакого ответа на запрос не последует.

iptables -A INPUT -s 15.15.15.51 -j REJECT

При фильтрации можно указывать только адрес или, например, адрес и интерфейс на который запросы с него принимать не следует

iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP

Входящие и исходящие соединения по порту

iptables предоставляет возможность для более гибкой блокировки. Можно заблокировать все входящие запросы на любой порт — например на порт 80 (веб-сервер)

iptables -A INPUT -p tcp —dport 80 -j DROP

Или исходящие соединения на любой порт — например на порт 25 (почтовая служба на отправку)

iptables -A OUTPUT -m state —state NEW -m tcp -p tcp —dport 25 -j DROP

Также существуют некоторые базовые политики безопасности, устанавливать которые является хорошей практикой

Они позволяют в какой-то степени пресечь отправку очень большого количества пакетов и являются простейшим фильтром DDOS

iptables -A INPUT -p tcp —tcp-flags ALL NONE -j DROP

iptables -A INPUT -p tcp ! —syn -m state —state NEW -j DROP

iptables -A INPUT -p tcp —tcp-flags ALL ALL -j DROP

Стоит помнить, что от мощной атаки iptables не защитит.

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

Источник

Оцените статью
Adblock
detector