Введение
В данной заметке разберем базовую защиту Linux сервера с помощью набора правил Iptables.
Список базовых правил Iptables для защиты Linux
Защищать будем в формате – запрещаем все что не разрешено правилами.
Тут будет базовый набор, который открывает распространенные рабочие порты, такие как SSH, 80 и 443 (по аналогии открываем свои нужные порты) и закрывает все остальное, углубляться в цепочки таблицы и прочее не будем, для этого рекомендую почитать хотя бы man.
# Устанавливаем входящие и исходящие политики по умолчанию на ACCEPT, очищаем все правила и цепочки
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X
# Разрешаем все локальные, запрещаем все со значением "INVALID" и разрешаем уже установленные соединения
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Открываем нужные порты, SSH, 80, 443, по аналогии добавляем свои
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# По аналогии открываем остальные порты
# Разрешаем Ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Исходящие локальные соединения и соединения через внешний интерфейс
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o ВАШ_ВНЕШНИЙ_ИНТЕРФЕЙС -j ACCEPT
# Запрещаем политиками все что не разрешено выше
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Запрещаем политиками по умолчанию все для ipv6, если не планируете пользоваться ipv6
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
Сохраняем правила, для этого воспользуемся утилитой iptables-persistent:
apt install iptables-persistent
При первом запуске у нас спросит про сохранение текущих правил ipv4 и ipv6, соглашаемся, что бы сохранить новые правила уже после установки, воспользуемся данной командой:
netfilter-persistent save или dpkg-reconfigure iptables-persistent
Что бы полностью отчистить все правила с помощью iptables-persistent используем данную команду:
netfilter-persistent flush
Шпаргалка по некоторым ключам с примерами для Iptables:
- Посмотреть имеющиеся правила и политики по умолчанию для цепочек в Iptables можно с помощью данных команд:
iptables -L
iptables -L | grep policy
iptables -L -nv
iptables -L -nv --line-numbers
iptables -S
- Для удаления правила сначала используем команду
iptables -L -nv --line-numbers
для того что бы узнать номер правила (столбец num слева), далее используем команду ниже с указанием цепочки и номера:
iptables -D INPUT номер
# Или пишем полностью правило с ключом -D
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
- Удаляем все правила и цепочки, можно указать конкретную цепочку или таблицу:
iptables -F
iptables -X
- Посмотреть текущие соединения и порты который прослушиваются, бывает полезно посмотреть перед ограничениями, что бы открыть полный список нужных портов для работы:
netstat -tulpan
lsof -i -nP
ss -lntu
- -A (–append): Добавить правило в конец цепочки.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- -I (–insert): Вставить правило под указанным номером в цепочке, если правило уже существует под этим номером, то оно опустится ниже добавленного.
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
- -D (–delete): Удалить правило из цепочки.
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
iptables -D INPUT 4 # Сначала смотрим номер правила iptables -L -nv --line-numbers
- -R (–replace): Заменить правило под указанным номером в цепочке.
iptables -R INPUT 1 -p tcp --dport 22 -j ACCEPT
- -P (–policy): Установить политику по умолчанию для цепочки.
iptables -P INPUT DROP
- -E (–rename-chain): Переименовать цепочку.
iptables -E OLDNAMECHAIN NEWNAMECHAIN
- -t –table (table): Указать таблицу (filter, nat, mangle, raw).
iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
- -p (–protocol): Указать протокол (tcp, udp, icmp).
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- -s (–source): Указать источник (IP-адрес или подсеть).
iptables -A INPUT -s 192.168.1.100 -j DROP
- -d (–destination): Указать назначение (IP-адрес или подсеть).
iptables -A OUTPUT -d 8.8.8.8 -j ACCEPT
- -i (–in-interface): Указать входной интерфейс.
iptables -A INPUT -i ens3 -j ACCEPT
- -o (–out-interface): Указать выходной интерфейс.
iptables -A OUTPUT -o ens3 -j ACCEPT
- –sport (–source-port): Указать исходный порт или диапазон портов.
iptables -A INPUT -p tcp --sport 1024:65535 -j ACCEPT
- –dport (–destination-port): Указать порт назначения.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- -m state –state: Указать состояние соединения (NEW, ESTABLISHED, RELATED).
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- -m limit –limit: Ограничить количество пакетов в секунду.
iptables -A INPUT -p icmp -m limit --limit 1/second -j ACCEPT
- -m connlimit –connlimit-above: Ограничить количество одновременных соединений с одного IP.
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
- -m time –timestart –timestop: Указать временной интервал для применения правила.
iptables -A INPUT -m time --timestart 08:00 --timestop 17:00 --days Mon-Fri -j ACCEPT
- -m comment –comment “Ваш комментарий”: Указать комментарий к правилу.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT -m comment --comment "Ваш комментарий"
- -h: Показать краткую помощь по синтаксису команд Iptables
Остальные ключи с примерами welcome в man iptables.
Заключение
В данной заметке базово разобрались, как защитить с помощью iptables Linux сервер, рекомендую ознакомиться с man по iptables, чтобы на базовом уровне понимать возможности iptables, ну и так же рекомендую ознакомиться с nftables, так как он уже много где установлен по умолчанию.
Что бы не потерять инструкцию рекомендую подписаться на мой личный блог-канал в Telegram в котором я делюсь в формате заметок своими знаниями и интересным из мира IT, спасибо за потраченное время на чтение и доброго времени суток!)
Так же вы можете отблагодарить автора материально: