Last active
March 10, 2019 12:14
-
-
Save ezhov-da/d8521cd0d31012fe0104e446f6ba19cf to your computer and use it in GitHub Desktop.
iptables
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
https://losst.ru/kak-zakryt-port-iptables | |
ЗАКРЫТЬ ПОРТЫ IPTABLES | |
Посмотреть какие порты слушаются локально, можно использовать утилиту netstat: | |
sudo netstat -ntulp | |
Для анализа портов, доступных извне используется программа nmap: | |
nmap localhost | |
Общий синтаксис команды для блокировки порта выглядит вот так: | |
$ iptables -A INPUT -p tcp —dport номер_порта -j DROP | |
Например, если мы хотим заблокировать порт iptables mysql, то необходимо выполнить: | |
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP | |
После того как вы завершите с настройкой портов нужно сохранить все созданные правила, чтобы они остались активными даже после перезагрузки. | |
Для этого выполните: | |
sudo iptables-save | |
Чтобы посмотреть текущие правила для каждой из цепочек выполните: | |
sudo iptables -L -n -v | |
Такая команда покажет все правила, а если вы хотите только информацию о заблокированных портах, выполните: | |
sudo iptables -L -n -v | grep -i DROP | |
Очистить все правила в случае возникновения проблем можно командой: | |
sudo iptables -F | |
ЗАКРЫТЬ ПОРТЫ 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. | |
Так что надежные пароли и ключи шифрования это не отменяет. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment