====== IPTABLES ====== Утилита командной строки для настройки встроенного в ядро Linux межсетевого экрана, разработанного в рамках проекта Netfilter. ==== Таблицы ipatables ==== **raw** - предназначена для обработки пакетов прежде, чем они будут переданы системе conntrack, которая занимается отслеживанием состояния соединений и принадлежностью пакетов этим соединениям. Содержит встроенные цепочки PREROUTING и OUTPUT. \\ **mangle** - используется для модификации некоторых заголовков (TTL, TOS) и маркировке пакетов и соединений, содержит цепочки PREROUTING, INPUT, FORWARD, OUTPUT и POSTROUTING. \\ **nat** - предназначен для преобразования адресов и портов источника и назначения пакетов, встроенные цепочки: PREROUTING, OUTPUT, POSTROUTING. \\ **filter** - применяется, собственно, для фильтрации пакетов, является таблицей по умолчанию, т.е. если таблица не указана явно, то используется filter, имеет цепочки INPUT, FORWARD и OUTPUT. \\ **security** - используется для работы совместно с системами принудительного контроля доступа, такими как SELinux. Встроенные цепочки INPUT, FORWARD, OUTPUT. ==== Внутренние цепочки ==== **PREROUTING** - используется для всего входящего трафика до принятия первого решения о маршрутизации \\ **INPUT** - применяется для входящего трафика текущего узла \\ **FORWARD** - через нее проходит транзитный трафик узла \\ **OUTPUT** - применятся для исходящего трафика текущего узла \\ **POSTROUTING** - используется для всего исходящего трафика после принятия всех решений о маршрутизации ==== Действия ==== **ACCEPT** - разрешить прохождение пакета дальше по цепочке правил; \\ **DROP** - удалить пакет; \\ **REJECT** - отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен; \\ **LOG** - сделать запись о пакете в лог файл; \\ **QUEUE** - отправить пакет пользовательскому приложению. ==== Основные действия ==== -A - добавить правило в цепочку; \\ -С - проверить все правила; \\ -D - удалить правило; \\ -I - вставить правило с нужным номером; \\ -L - вывести все правила в текущей цепочке; \\ -S - вывести все правила; \\ -F - очистить все правила; \\ -N - создать цепочку; \\ -X - удалить цепочку; \\ -P - установить действие по умолчанию. ==== Дополнительные опции правил ==== -p - указать протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh; \\ -s - указать ip адрес устройства-отправителя пакета; \\ -d - указать ip адрес получателя; \\ -i - входной сетевой интерфейс; \\ -o - исходящий сетевой интерфейс; \\ -j - выбрать действие, если правило подошло. ==== Статусы соединений ==== **NEW** — установка нового соединения, первый пакет, который мы видим. \\ **RELATED** — соединение, связанное с другим, имеющим статус ESTABLISHED. \\ **ESTABLISHED** — установленное сетевое соединение. \\ **INVALID** — пакет не может быть идентифицирован как принадлежащий какому-то соединению. \\ **UNTRACKED** — пакеты, для которых ранее была применена цель NOTRACK. Мы пока применяли только цель ACCEPT, позже мы познакомимся и с другими. Для таких пакетов, например, не отслеживаются сопутствующие ICMP-пакеты. ==== Примечание ==== Команда iptables имеет такой общий вид: iptables -t таблица действие цепочка дополнительные_параметры ===== Команды и примеры ===== ==== Установка iptables ==== apt-get install iptables ==== Список правил ==== iptables -L Подробный список iptables -nvL ==== Сброс всех правил ==== iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -t raw -F iptables -t raw -X iptables -t security -F iptables -t security -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT ==== Cохранить все правила iptables ==== /sbin/iptables-save ==== Добавляем автоматическую загрузку правил iptables ==== Устанавливаем: apt-get install netfilter-persistent iptables-persistent Правила хранятся в следующих файлах и применяются при загрузке операционной системы. \\ Для IPv4 используется файл: > /etc/iptables/rules.v4 Для IPv6 используется файл: > /etc/iptables/rules.v6 Варианты использования: service netfilter-persistent {start|restart|reload|force-reload|save|flush} service netfilter-persistent {flush, force-reload, reload, restart, save, start} \\ flush - очистить правила \\ reload - загрузить из файлов \\ save - сохранить в файлы ==== Шлюз ==== Редактируем файл /etc/sysctl.conf nano /etc/sysctl.conf Нужно раскомментировать строку > net.ipv4.ip_forward=1 Применить настройки без перезагрузки (или перезагрузить) sysctl -p Настраиваем iptables: \\ eth0 — Интерфейс который смотрит в интернет \\ eth1 — Локальная сеть iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT Конфигурация будет работать до перезагрузки, не забудь сохранить ==== Заблокировать IP-адрес в iptables ==== iptables -A INPUT -s 192.168.100.1 -j DROP ==== Разрешить IP-адрес в iptables ==== iptables -A INPUT -s 192.168.100.1 -j ACCEPT ==== Открыть порт в iptables ==== iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT или для каждого отдельно 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 ==== Закрыть порт в iptables ==== iptables -A INPUT -p tcp --dport 21 -j DROP ==== Запретить ICMP ping трафик ==== iptables -A INPUT -p icmp --icmp-type 8 -j DROP ==== Переадресация порта — redirect ==== Например с 8080 на 80 iptables -A INPUT -p tcp --dport 8080 -j ACCEPT iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 ==== Разрешить соединения по SSH ==== iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT ==== Пример фильтров для FTP ==== Очень простой пример — работа с FTP-сервером. Мы подключаемся к порту 21/tcp, в момент подключения соединение получается статус NEW, а затем ESTABLISHED. Управляющие команды идут через порт 21/tcp, но при работе для передачи файлов необходимо открыть еще и 20/tcp. И соединение на порт 20/tcp получает статус RELATED. Таким образом, доступ к порту 20/tcp можно закрывать до тех пор, пока соединение на него не придет со статусом RELATED, либо само соединение не получит статус ESTABLISHED. Получается, что для корректной фильтрации портов 21/tcp и 20/tcp мы можем сделать следующее: iptables -t filter -A INPUT -p tcp -m tcp --dport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -t filter -A INPUT -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT В этом случае без установки подключения на порт 21 мы не получим доступ к порту 20. ==== Маскарадинг (или маскирование) ==== Правило для адресной трансляции: iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d ! 192.168.0.0/24 -j MASQUERADE Это правило после обработки пакетов осуществит маскирование, если пакеты из внутренней сети направлены куда-то в другую подсеть. Если нам нужно маскировать пакеты для конкретной подсети, к примеру, из одной локальной подсети (192.168.2.0/24) в другую (192.168.0.0/24), то мы можем создать следующее правило: iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 192.168.0.0/24 -j MASQUERADE ===== Источники ===== * [[https://ru.wikibooks.org/wiki/Iptables]] * [[https://losst.ru/nastrojka-iptables-dlya-chajnikov]] * [[https://wiki.archlinux.org/title/Iptables_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)]] * [[https://interface31.ru/tech_it/2020/02/osnovy-iptables-dlya-nachinayushhih-chast-1.html]] * [[https://blog.xenot.ru/bystraya-nastrojka-vpn-servera-pptp-na-ubuntu-server-18-04-lts.fuck]] * [[https://selectel.ru/blog/setup-iptables-linux/]]