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

iptablesnetfilternetworktool