====== 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/]]