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

Как видите, извне у нас, кроме стандартных портов веб-сервера, доступны 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-save
Чтобы посмотреть текущие правила для каждой из цепочек выполните:
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
Взято >> https://losst.pro/kak-zakryt-port-iptables