Настройка iptables
Самым распространенным межсетевым экраном в ОС семейства Linux является iptables. Рассмотрим базовые настройки.
Так получилось, что не все дистрибутивы Linux устанавливают по умолчанию iptables. Если одноименная команда не выполняется в терминале, то следует выполнить установку:
sudo apt-get install iptables
Конечно, можно выполнять настройку и через графический интерфейс - Firestarter, а также использовать оболочку - shorewall, но гораздо лучше будет разобраться в iptables и из консоли.
Типы правил.
В iptables существует 3 типа правил - input, forward, output.
Input — Данная цепочка правил используются для контроля входящих соединений. Например, если пользователь пытается подключиться к серверу, то iptables сравнит его IP-адрес со своим списком, затем разрешит или ограничит доступ.
Forward — Цепочка правил этого типа используются для обработки входящих tcp/udp пакетов, адрес назначения которых находится “за” сервером. В качестве примера можно рассмотреть случай, когда сервер используется в качестве маршрутизатора. Частный случай - NAT и Port-Forwarding.
Output — Эта цепочка правил полный аналог Input за исключением того, что они используются для контроля исходящих соединений.
Специалисты условно делят режим работы любого межсетевого экрана на 2 типа - белый и черный.
Белый - запрещается весь трафик, кроме разрешенного.
Черный - разрешается весь трафик, кроме запрещенного.
Данная политика относится не только к IP-адресам устройств, но и к портам служб, а также обращениям некоторых IP-адресов к некоторым портам.
Чтобы было понятнее, не очень хорошо, когда порт SSH-службы доступен из сети Интернет. Это повлечет постоянные попытки подбора логина и пароля. Однако, вы можете запретить любой трафик на порт этой службы (по умолчанию, tcp - 22) тем самым отрезав себя от административного входа на сервер. Компромиссное решение - добавить блок IP-адресов с которых можно обращаться к серверу по SSH-протоколу.
По умолчанию, дистрибутив Ubuntu с предустановленным iptables, разрешает всё. Проверить это можно командой:
iptables -L | grep policy
<img width="819" height="428" src="https://lincore.kz/wp-content/uploads/2020/06/81_1.png" alt="" />
После проверки поведения цепочек соединений и общего поведения межсетевого экрана можно приступить и ограничительным мерам. Для начала рассмотрим три основных действия с пакетами:
Accept - разрешает соединение;
Drop - Запрещает соединение, отбрасывает пакеты. При этом создается впечатление, что данный порт и не был открыт вовсе.
Reject - также запрещает соединение, но явно дает понимание, что порт защищен межсетевым экраном.
Важно понимать, что правила вносятся в соответствующую цепочку с соответствующей политикой для пакетов. Рассмотрим пример:
sudo iptables -A INPUT -s 10.10.0.1 -j DROP
Данное правило запрещает все входящие соединения с адреса 10.10.0.1.
Блокировка диапазонов адресов происходит по маске:
sudo iptables -A INPUT -s 10.10.0.0/255.255.255.0 -j DROP
Также блокировка диапазон адресов можно заблокировать по префиксу сети:
sudo iptables -A INPUT -s 10.10.0.0/24 -j DROP
Сетевой префикс /24 равен 255.255.255.0
Допустим, что нет необходимости ограничивать все обращения с адреса 10.10.0.1, а нужно запретить только обращение к TCP-порту 22 (SSH). Правило будет выглядеть следующим образом:
iptables -A INPUT -p tcp --dport ssh -s 10.10.0.1 -j DROP
Тоже самое и для подсети:
iptables -A INPUT -p tcp --dport ssh -s 10.10.0.0/24 -j DROP
Стоит отметить, что параметр -p указывает тип протокола пакетов tcp или udp, следует указывать соответствующий.
Параметр --dport позволяет указывать не только имя службы слушающей порт, но и номер порта. Записи --dport ssh и --dport 22 будут эквивалентны, но только в том случае, если порт ssh-службы не был изменен в конфигурационном файле, в противном случае может быть заблокировано или не заблокировано “что-то”.
Следующее правило заблокирует доступ для подсети 10.10.0.0/24 к 80 порту сервера (сайт):
sudo iptables -A INPUT -p tcp --dport 80 -s 10.10.0.0/24 -j DROP
Важно помнить, что некоторые протоколы, тот же TCP, требуют двустороннего согласования, после чего соединение на порту изменяет свой статус ESTABLISHED, FIN_WAIT и т.п. Iptables позволяет выполнить настройку правил таким образом, что если соединение будет установлено, то и исходящий трафик будет разрешен:
sudo iptables -A INPUT -p tcp --dport 80 -s 10.10.0.1 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -d 10.10.0.1 -m state --state ESTABLISHED -j ACCEPT
Важно понимать, что все правила обрабатываются ядром системы, что влечет за собой нагрузку на процессорную часть сервера. Избыток правил для может негативно сказаться на качестве. Зачастую разрешают весь исходящий от сервера трафик, а открытые порты управляются политикой безопасности, исключением является блокировка трафика для почтовых портов, да и то, если в этом есть необходимость.
Сохранение правил.
Вносимые правила действуют до перезагрузки самих правил либо до перезагрузки сервера. Чтобы сохранить изменения используется специальная команда.
В Ubuntu:
sudo /sbin/iptables-save
В CentOS/Red Hat/OpenSuse:
/sbin/service iptables save
либо
/etc/init.d/iptables save
Для очистки существующих правил можно использовать iptables с ключем -F:
iptables -F
Существуют и другие ключи, полный список которых можно посмотреть в электронном руководстве:
man iptables