iptables
Фаерволом в linux является netfilter, а одна из утилит для его настройки - это iptables
Межсетевой экран (firewall, brandmauer) не дает поддельному трафику попасть в сеть, защищает внутреннюю сеть от DDOS-атак и блокирует передачу инфы неизвестному источнику.
Не юзай ufw вместе с iptables
Если уже используется iptables - юзать ufw не стоит (в большинстве случаев), ибо усложняется администрирование сети и сложнее диагностировать ошибки.
+ ufw - обычная обертка над iptables.
Chains
Цепочки iptables (последовательности правил, которые применяются к пакетам):
-
INPUT
Входящие пакеты -
OUTPUT
Исходящие пакеты -
FORWARD
Пакеты, которые были приняты хостом, но ему не предназначены - ему нужно передать дальше, их конечному получателю, например. То есть, пакеты, которые просто идут через данный хост и не предназначены этому хосту.
Такое может быть, если хост является, к примеру, маршрутизатором. -
PREROUTING
Цепочка, в которую пакет попадает перед обработкой iptables, то есть система еще не знает, в какую цепочку попадет пакет -
POSTROUTING
Сюда попадают пакеты, которые прошли все предыдущие цепочки
Механизм взаимодействия с сетью
Естественно, при работе с сетью используется и цепочка INPUT, и цепочка OUTPUT. Банально, утилита ping отправляет пакеты ICMP таргету (исходящий трафик/OUTPUT), но и ответы должен получать извне на эти пакеты (входящий трафик/INPUT). А FORWARD может и вообще не использоваться при взаимодействии с сетью (чаще всего и не используется).
То есть, нельзя просто закрыть цепочку INPUT, чтобы повысить безопасность.
Действия
Действия iptables (которые применяются к пакетам):
- Accept
Разрешает прохождение пакета дальше по цепочке - Drop
Удаляет пакет - Reject
Отклоняет пакет и сообщает об этом отправителю - Log
Делает запись о пакете в log file - Queue
Отправляет пакет пользовательскому приложению
Tables
Таблицы iptables:
- filter
Здесь осуществляется фильтрация пакетов - nat
Обеспечивает трансляцию адресов - mangle
Предназначен для модификации пакетов - raw
Предназначена для работы с сырыми пакетами (которые еще не прошли обработку)
Правила iptables
Состоит из критерия/ев, действий/я и счетчика:
Если пакет удовлетворяет критериям - к нему применяется действие и он учитывается счетчиком.
Если критерий не указан - действие применяется ко всем пакетам.
Если не указаны ни критерии, ни действия - счетчик просто засчитывает этот пакет.
Счетчик считает кол-во пакетов и их размеры.
Практика
Вывод всех правил:
sudo iptables -L
Детализированный вывод всех правил с нумерацией строк:
sudo iptables -L --line-numbers -v -n
# --line-numbers - нумерация строк
# -v - more verbose output
# -n - порты и IP адреса в числовом формате (не резолвит в dns-имена)
Вывод правил для конкретной цепочки:
sudo iptables -L INPUT
Добавляем правило для блокировки всех входящих/исходящих пакетов с определенного IP адреса:
sudo iptables -A INPUT -s google.com -j DROP
# или исходящие пакеты:
sudo iptables -A OUTPUT -s google.com -j DROP
# -A - Append (добавить) одно/несколько правил в конец ВЫБРАННОЙ цепочки (INPUT, в данном случае)
# -s - source (Можно указать и IP адрес, подсеть, диапазон и dns-name)
# -j - jump (определяет цель правила, то есть, что делать, если пакет соответствует этому правилу)
# Теперь даже пропинговать google.com не выйдет (ответов не будет).
Блокировка входящих/исходящих пакетов с определенного порта:
sudo iptables -A INPUT -p tcp --dport 22 -s <ip-address> -j DROP
# -p - protocol
# --dport - destination port (порт, НА КОТОРЫЙ будет приходить трафик)
Или, например, блокировка ICMP трафика (чтобы хост не отвечал на пинг):
sudo iptables -A INPUT -p icmp --icmp-type 8 -j DROP
# --icmp-type - указывает тип пакетов ICMP (ICMP пакеты типа 8 - это пинг запросы (echo request))
Установка политики по умолчанию для пакетов:
sudo iptables -P INPUT <ACCEPT or DROP>
# -P - policy chain
Политика по умолчанию позволяет определить общее поведение фаервола по отношению к пакетам, не попадающим под какие-либо конкретные правила.
В выводе правил цепочки в первой строке как раз будет указана политика:
Chain INPUT (policy ACCEPT)
И вот как раз этой командой можно менять этот policy.
Заблокировать все IP-адреса, кроме 192.168.3.4:
iptables -A INPUT -s 192.168.3.4 -j ACCEPT
iptables -P INPUT DROP
Удаление правила:
sudo iptables -D INPUT -s google.com -j DROP
# -D - delete
Очистка iptables (удаление всех правил):
sudo iptables -F
# -F - flush (очищает выбранную цепочку, но если она не указана - очищает все цепочки в таблице)
iptables-persistent
iptables не сохраняет правила после перезагрузки - возвращает всё в дефолтное состояние.
Поэтому есть iptables-persistent:
sudo apt install iptables-persistent
Сохранение нынешних правил
При установке эта утилита спрашивает, сохранить ли нынешние правила в файл - лучше соглашаться, чтобы потом (вдруг что) можно было восстановить правила с этого файла.
Теперь после добавления какого-то правила в iptables, например:
sudo iptables -A INPUT -s 5.23.51.23 -j DROP
можно сохранить изменения в файл:
sudo service netfilter-persistent save
Найти этот файл можно по пути:
sudo cat /etc/iptables/rules.v4
Теперь, даже после удаления правила:
sudo iptables -D INPUT -s 5.23.51.23 -j DROP
можно восстановить всё:
sudo sh -c "iptables-restore < /etc/iptables/rules.v4"
Соусы и доп. материалы:
docker iptables: https://habr.com/ru/articles/473222/
Не работает apt после iptables