14 KiB
iptables
Таблицы
filter- основная таблица для фильтрации пакетов, используется по умолчанию;nat- управление преобразованием сетевых адресов;mangle- модификация и замена содержимого сетевых пакетов вне контекста NAT и фильтрации пакетов;raw- предназначена для работы с сырыми пакетами, пока они еще не прошли обработку
Цепочки
Цепочки бывают базовые/встроенные и пользовательские (можно создать самому).
В новую цепочку можно направлять пакеты чтобы подвергуть их анализу правил. Например для отладки правил или настройки особого движения пакетов как это сделано в Docker
INPUT- входящий трафик (адресованный локальному хосту);FORWARD- транзитный трафик поступающий на локальную машину с целью передачи его на другую машину (трафик передаваемый в docker контейнер тоже будет считаться транзитным), при этом транзитный трафик проходит в обоих направлениях;OUTPUT- исходящий из локального хоста трафик
Правила - условия и действия
Правило - состоит из условия/критерия (если нет значит применяется ко всему трафику) действия (может не быть) и счетчика (для учета пакетов попавших под правило).
основные действия с правилами:
-A- добавить правило в цепочку;-С- проверить все правила;-D- удалить правило;-I- вставить правило с нужным номером;-L- вывести все правила в текущей цепочке;-S- вывести все правила;-F- очистить все правила;-N- создать цепочку;-X- удалить цепочку;-P- установить действие по умолчанию.
Условия:
-p- протокол (TCP, UDP, ICMP, ALL);-s- ip адрес источника (можно с маской 10.0.0.0/24), допускается отрицание (т.е. все кроме)-s ! 10.0.0.0/24;-d- ip адрес получателя (аналогично-s);-i- интерфейс с которого пришел пакет (только дляINPUT,FORWARD,PREROUTING), напримерens3, допускается указатьens+что означает все имена интерфейсов начинающиеся с заданной строки, допускается отрицание-i ! ens+;-o- интерфейс локального хоста, из которого выходит трафик (только дляOUTPUT,FORWARD,PREROUTING);--sport- порт с которого был отправлен TCP/UDP пакет (допускаются имена служб из/etc/services), поддерживаются диапазоны вида20:80что значит от 20 до 80 порта, так же можно опустить одно из значений:80(от 0 до 80) или20:(от 20 до 65535), отрицание поддерживается даже к диапазонам--sport ! 20:80;--dport- аналогично--sportтолько речь идет про порт, которому адресован пакет;--icmp-type- тип ICMP сообщения (номер или название), поддерживается отрицание. RFC 792 илиiptables --protocol icmp --help;-m mac --mac-source- MAC адрес устройства передавшего пакет, поддерживается отрицание;-m state --state- состояние соединения:INVALID- неизвестное соединение, возможно ошибочное;NEW- новое соединение;ESTABLISHED- уже установленное соединение;RELATED- пакет принадлежит уже существующему соединению, но он отправляется по новому
-m ttl- Time To Live:--ttl-eq N- TTL пакета равен N;--ttl-lt N- TTL пакета меньше N;--ttl-gt N- TTL пакета больше N
-m multiport- указать в правиле несколько портов, диапазон или набор:-m multiport --dports 8080,22,80- применяется к указанным портам;-m multiport --dports 1024:65535- применяется к диапазону портов
Действия:
ACCEPT- пакет принят в текущей таблице;DROP- пакет сбрасывается и перестает движение в системе;LOG- пакет журналируется и продолжает дальнейшие движение по цепочке правил и таблицам (рассмотрим ниже)REJECT- аналогично DROP только отдает сообщение об ошибке на хост отправителя (работает на всех цепочках таблицы filter):--reject-with- тип ответа, RFC 793 илиiptables -j REJECT -h
RETURN- возврат пакета в вышестоящую цепочку для применения действия по умолчанию, при отсутствии вышестоящей цепочки применится действие по умолчанию
Просмотр
- Просмотр текущих правил
iptables -L
только для конкретной цепочки
iptables -L INPUT
более наглядно
iptables -vnL --line-numbers
- Список текущих правил
iptables -S
- Очистка правил
iptables -F
очистка правил конкретной цепочки
iptables -F INPUT
Стоит иметь ввиду, что очистка правил не изменяет правило по-умолчанию, если оно установлено в DROP, после очистки всех правил можно потерять доступ к узлу.
- Для полной очистки правил и отключения фильтрации
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
Управление правилами и цепочками
Добавить правило (разрешить весь трафик с tun интерфейсов) в конец цепочки INPUT (-A, --append):
iptables -A INPUT -i tun+ -j ACCEPT
Вставить правило в позицию 2 цепочки INPUT (-I, --insert):
iptables -I INPUT 2 -i lo -j ACCEPT
Установить политику по умолчанию DROP для цепочки INPUT (-P, --policy):
iptables -P INPUT DROP
Создание новой цепочки правил:
iptables -N LOGGING
Примеры
Предположим что для цепочки INPUT политика по умолчанию DROP, это значит что все входящие пакеты будут отброшены, но нам нужен некоторый входящий трафик.
Разрешим трафик на локальный DNS сервер, без этого могут быть долгие подключения по ssh:
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
Разрешим движение трафика из интерфейсов создаваемых Docker (при политиках по умолчанию DROP, контейнеры не смогут общаться с другими интерфейсами):
iptables -A INPUT -i br+ -j ACCEPT
Разрешим любой входящий трафик из localhost и откроем http/https порты (80/443), например для случая когда у нас есть веб-сервер и наши сайты должны быть доступны снаружи:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Если не разрешить входящий трафик от localhost то могут быть странные задержки с ответами, а при дебаге можно увидеть отклоенные пакеты от 127.0.0.1
Теперь локальный DNS на 53 порту доступен, docker контейнеры тоже, с localhost трафик разрешен, и для внешнего мира открыты 80 и 443 порты для наших сайтов. Но это все только для установления соединения и рукопожатия. Теперь нам нужно разрешить все установленные и связанные с ними соединения чтобы трафик действительно пошел (еще вот):
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
Пример первоначальной настройки
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 8080,22,80 -j ACCEPT
iptables -A INPUT -p udp --dport 69 -j ACCEPT
iptables -A INPUT -p tcp --dport 5000:5678 -j ACCEPT
iptables -P INPUT DROP
iptables --line-numbers -L -v -n
Сброс всех правил цепочки filter
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
Отладка
Логирование отклоненных пакетов journald
Работа iptables происходит на уровне ядра ОС, соответственно все события логируются также на уровне ядра.
Добавляем правило логирования каждого пакета с префиксом:
iptables -A INPUT -j LOG --log-level info --log-prefix "IPTABLES-DROP: "
Вывод сообщений ядра
journalctl -k
или
journalctl -k -f
Логирование отклоненных пакетов Rsyslog
Полезно иметь возможно отладить свои правила, экономия времени и iptables становится понятнее.
Суть отладки правил iptables такова:
создаем отдельную цепочку, куда будем перенаправлять весь трафик, который должен быть отклонен в новой цепочке ведем логирование и отклоняем пакеты направляем запросы для теста правил и смотрим лог отклоенных пакетов
Создание новой цепочки:
iptables -N LOGGING
Добавляем правило логирования каждого пакета с префиксом:
iptables -A LOGGING -j LOG --log-prefix "ipt denied: "
Отклоняем пакет:
iptables -A LOGGING -j DROP
В цепочку, откуда будут приходить пакеты для отклонения добавляем новое правило перенаправления в новую цепочку логирования:
iptables -A INPUT -j LOGGING
Теперь добавим конфиг rsyslog:
nano /etc/rsyslog.d/10-iptables.conf
Вставим следующий текст:
:msg, contains, "ipt denied: " -/var/log/iptables.log
& ~
Сохраним и перезагрузим демона rsyslog:
service rsyslog restart
Теперь откроем файл и будем следить за 20 последних строк:
echo > /var/log/iptables.log
tail -f -n 20 /var/log/iptables.log