Действия

Iptables

Материал из lulzette's wiki

Практически копипаст статьи: https://losst.ru/nastrojka-iptables-dlya-chajnikov

Годно: https://www.opennet.ru/docs/RUS/iptables/

Годный видик: https://youtu.be/SYM5MvV4VIk

netfilter dia

Цепочки

Есть несколько цепочек: Input, forward, output, prerouting и postrouting. В каждой цепочке есть таблицы:

  • prerouting - пакет только вышел из интерфейса и направляется в систему (raw, conntrack, mangle, nat)
  • input - пакет на пути из системы в приложение (mangle, filter, conntrack)
  • forward - пакет проходит через систему (обычно маршрутизация) (mangle, filter)
  • output - пакет вышел из приложения и подходит к выходу из системы (raw, conntrack, mangle, nat, filter)
  • postrouting - конечная станция, пакет выходит из системы в интерфейс (mangle, nat, conntrack)

Нагляднее будет на картинке справа.

Таблицы

  • raw - предназначена для работы с сырыми пакетами, пока они еще не прошли обработку; (маркировка пакетов) - output, prerouting
  • mangle - предназначена для модификации пакетов; (модификация TTL или TOS, например)
  • nat - обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора; ()
  • filter - основная таблица для фильтрации пакетов, используется по умолчанию. (ограничение или разрешение доступа, собсна правила, которые ниже)


При iptables -L выводятся правила только из таблицы filter, остальные необходимо смотреть через "-t" (iptables -L -t raw)

Правила и действия

  • ACCEPT - разрешить прохождение пакета дальше по цепочке правил;
  • DROP - удалить пакет, как будто он никуда и не дошел;
  • REJECT - отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
  • LOG - сделать запись о пакете в лог файл;
  • QUEUE - отправить пакет пользовательскому приложению.

syntax

https://wiki.merionet.ru/servernye-resheniya/14/pogruzhenie-v-iptables-teoriya-i-nastrojka/

Осталось рассмотреть основные действия, которые позволяет выполнить iptables:

-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 - выбрать действие, если правило подошло.
-g - передать пакет в другую цепочку
--dport - указать порт
-m - совпадение, т.е. multiport (диапазон портов), tcp (tcp порт) и т.д.

--line-numbers - вывести правила по номерам
-n - вывести правила с резолвингом портов/доменов

примеры

Вот так будет выглядеть команда, которая позволяет добавить правило iptables для блокировки всех входящих пакетов от 10.10.10.10:

sudo iptables -A INPUT -s 10.10.10.10 -j DROP

Блокаем по string'у

Какая-то рабочая хрень. При желании можно погуглить флаги.

iptables -I INPUT -p tcp --dport 80 -m string --string "yandex.ru" --algo kmp -j DROP

INPUT policy (-P) DROP

Дропаем входящие:

iptables -P INPUT -j DROP

Но ведь тогда не придут ping echo! Так как ответный ping пакет приходит на INPUT, а INPUT закрыт. Решение есть:

iptables -A INPUT -m conntrack --cstate RELATED,ESTABLISHED -j ACCEPT

Вуаля! RELATED,ESTABLISHED пакеты приниматься на INPUT'е, остальные входящие (NEW, INVALID и т.д.) будут отклонены. Однако, пинг локалхоста не доходит! Добавим правило на прием пакетов в INPUT со входящим интерфейсом lo:

iptables -A INPUT -i lo -j ACCEPT

Теперь все что придет на lo - будет отвечено.

NAT

настройка

Есть dnat, есть snat.

  • Snat - статический нат (SNAT) Если IP адрес на внешнем сетевом интерфейсе (WAN) статический и не меняется, то желательно использовать именно SNAT. В правилах фаервола указывается один или несколько IP адресов, таким образом есть возможность распределить локальные IP адреса и сети по внешним IP адресам. SNAT хорошо использовать на серверах доступа.
  • dnat - динамический нат (MASQUERADE) Менее быстрая маршрутизация чем SNAT при массовых запросах, так как для каждого нового соединения определяется IP адрес на внешнем сетевом интерфейсе (WAN). Отлично подходит для маршрутизаторов домашнего использования и когда меняется IP адрес на WAN интерфейсе.

iptables -A POSTROUTING -t nat -s 192.168.20.0/24 -o eth0 -j SNAT --to-source 192.168.1.123

проброс портов

перенаправляем входящие пакеты на порт VDS/контейнера iptables -t nat -A PREROUTING -i eth0 -p tcp -d 8.8.8.8 --dport 80 -j DNAT --to 10.10.10.137:80 iptables -t nat -A PREROUTING -i enp2s0 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.175:80

указываем направление исходящих из VDS/контейнера

iptables -t nat -A POSTROUTING -o lxcbr0 -p tcp --dport 80 -d 10.0.3.175 -j SNAT --to-source 10.0.3.1