много раз я пытался понять эту штуку, но в целом не понимал, пытался ролики смотреть, но все равно мало было понятно
можно только по конкретным образцам правил под себя подогнать
pre-up iptables -t nat -A POSTROUTING -s ‘192.168.180.0/24’ -o vmbr5 -j MASQUERADE
pre-up iptables -t nat -A PREROUTING -i vmbr5 -p udp --dport 51820 -j DNAT --to 192.168.25.2:51820
а вот как с нуля составить? или как уже готовые правила подправить?
вот возникла недавно потребность, когда я в виртуальной машине с zabbix добавил еще один интерфейс из другой сети, откуда доступ в вебморду нежелателен и вот как его закрыть?
кто не знает, если просто в консоли ввести какое-то правило, то оно не сохраняется в файле и до следущего перезагруза будет работать
zabbix виртуалка сделана на базе alpine linux 8, а в разных линупсах настройки фаерволла хранятся в разных местах и файлы по разному называются
в моем случае это /etc/sysconfig/iptables
вот его содержимое
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
### DNS-notrack
-A PREROUTING -p udp --sport 53 -j NOTRACK
-A OUTPUT -p udp --dport 53 -j NOTRACK
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:ICMP - DROP [0:0]
:NTP - DROP [0:0]
:SSH - DROP [0:0]
:ZBX - DROP [0:0]
:WEB - DROP [0:0]
:SNMPTRAP - DROP [0:0]
:SQL - DROP [0:0]
### ICMP-chain
-A ICMP -p icmp -m limit --limit 5/s --limit-burst 5 -j ACCEPT
### NTP-chain
### SSH-chain
-A SSH -s 0/0 -p tcp --dport 22 -j ACCEPT
### ZBX-chain
-A ZBX -s 0/0 -p tcp --dport 10050 -j ACCEPT
-A ZBX -s 0/0 -p tcp --dport 10051 -j ACCEPT
### WEB-chain
-A WEB -s 0/0 -p tcp -m multiport --dports 80,443 -j ACCEPT
### WEB-chain
-A WEB -s 0/0 -p udp --dport 162 -j ACCEPT
### Lo
-A INPUT -i lo -j ACCEPT
### DNS notrack
-A INPUT -s 8.8.8.8 -p udp --sport 53 -j ACCEPT
-A INPUT -s 8.8.4.4 -p udp --sport 53 -j ACCEPT
### ICMP
-A INPUT -s 0/0 -p icmp -j ICMP
### NTP
-A INPUT -s 0/0 -p udp --dport 123 -j NTP
### SSH
-A INPUT -s 0/0 -p tcp --dport 20:22 -j SSH
### ZBX
-A INPUT -s 0/0 -p tcp -m multiport --dports 10050,10051 -j ZBX
### WEB/HTTP/HTTPS
-A INPUT -s 0/0 -p tcp -m multiport --dports 80,443 -j WEB
### SNMP Traps
-A INPUT -s 0/0 -p udp --dport 162 -j SNMPTRAP
### OUT-for-notrack
-A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
-A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
### DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
Файл состоит из:
-
объявления таблиц,
-
описания цепочек,
-
правил,
-
завершающего
COMMIT.
Пример минимального файла:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
COMMIT
в чем цимес очередного унылого поста с буквами, которых и так полно?
весь цимес в картинках правильных ![]()
когда я пробовал осилить, то мне попадались ролики с неправильными картинками и одна из них вот
ну или вот
в курсах микротик примерно такая же диаграмма
можно еще вот такую подкинуть
как же правильно тогда?
одним из пунктов поиска ответов на вопрос у меня являются гуглокартинки, иногда там неожиданно можно найти подходящую картинку и посмотреть еще к ней статью или даже ролик и я такие картинки нашел
вернемся опять к тому, что выдал чатик гпт о фрмате файла
Пример минимального файла:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
COMMIT
Подробно по элементам
1. Таблица
*filter
Объявляет таблицу. Возможные варианты:
-
*filter— фильтрация пакетов (самая частая) -
*nat— NAT (DNAT, SNAT, MASQUERADE) -
*mangle— изменение пакетов -
*raw— до трекинга соединений -
*security— SELinux/LSM (редко)
2. Цепочки (chains)
:INPUT ACCEPT [0:0]
Формат:
:<ИМЯ_ЦЕПОЧКИ> <POLICY> [<packets>:<bytes>]
-
INPUT,OUTPUT,FORWARD— встроенные цепочки -
POLICY— политика по умолчанию (ACCEPT,DROP) -
[0:0]— счётчики пакетов и байт (информационные)
Пользовательская цепочка:
:MYCHAIN - [0:0]
(у неё нет политики)
3. Правила
-A INPUT -p tcp --dport 22 -j ACCEPT
Формат:
-A <ЦЕПОЧКА> <условия> -j <ДЕЙСТВИЕ>
Часто используемые параметры:
-
-p tcp|udp|icmp— протокол -
--dport / --sport— порт -
-s / -d— источник / назначение -
-i / -o— интерфейс -
-m state --state ESTABLISHED,RELATED -
-j ACCEPT | DROP | REJECT | LOG | DNAT | SNAT | MASQUERADE
Порядок правил критически важен — они обрабатываются сверху вниз.
4. COMMIT
COMMIT
Обязательная строка, означающая конец таблицы.
Без неё iptables-restore не применит правила.
вот из этой картинки видно, что такое таблицы, а что такое цепочки и какие цепочки к каким таблицам относятся
и теперь мы видим, что *filter это общая таблица и там всего 3 цепочки дефолтных, которые и определены ниже в файле
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
а что такое цепочки и как они устроены?
оказывается можно из одной цепочки правил прыгнуть в другую цепочку правил как это делается в подпрограммах бейсика или асма
и прыгнуть я тут не просто так написал, потому что именно этим термином обозначен параметр -j и после него всегда идет обычно дефолтные названиця цепочек
например -A INPUT -p tcp --dport 22 -j ACCEPT
но если мы возьмем наш Zabbix, то там несколько по другому выглядит
WEB/HTTP/HTTPS
-A INPUT -s 0/0 -p tcp -m multiport --dports 80,443 -j WEB
это уже сбивает с толку, поэтому я тут и приложил картинку выше, которая показывает, что можно прыгнуть в другую цепочку правил -j WEB
перейдем в нее
WEB-chain
-A WEB -s 0/0 -p tcp -m multiport --dports 80,443 -j ACCEPT
WEB-chain
-A WEB -s 0/0 -p udp --dport 162 -j ACCEPT
тут правда 162 порт не в тему, но да ладно
как видим, цепочка веб ведет к разрешению пакетов только при совпадении портов 80 и 443,а вот дефолтные настройки всех цепочек
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:ICMP - DROP [0:0]
:NTP - DROP [0:0]
:SSH - DROP [0:0]
:ZBX - DROP [0:0]
:WEB - DROP [0:0]
:SNMPTRAP - DROP [0:0]
:SQL - DROP [0:0]
т.е. сначала все запрещаем, потом добавляем правила разрешения
теперь встает вопрос, как пакет вообще идет?
у него есть 2 варианта - с интерфейса на другой сетевой интерфейс и тогда компутер работает как роутер (в частности настройка маскарадинга или разрешение исходящих пакетов в инторнет)
либо же пакет предназначен локальному процессу
и вот тут очень хорошо нарисованы эти таблицы (были в платном пдф, но я таки вытащил их)
вариант 2 - роутер
вариант 3 - наш с одним интерфейсом и локальным процессом
вот эти 3 части картинок дают полную картину работы фаерволла
и вот уже после всего этого можно только понять первую картинку прохождения пакетов по всем этим таблицам с цепочками
теперь возвращаемся к вопросу о том, как на одном интерфейсе запретить приходить пакетам на вебморду заббикса, но не препятствовать приходить им на заббикс сервер
а еще там работает база данных и тоже к ней как бы доступ надо закрыть
и вот тут мы начинаем понимать, зачем сделано перенаправление на отдельные кастомные цепочки типа -j WEB
заходим туда
WEB-chain
-A WEB -s 0/0 -p tcp -m multiport --dports 80,443 -j ACCEPT
и просто дописываем входящий интерфейс -i eth0
т.е. на нулевой интерфейс только разрешаем приход пакетов, а второй eth1 уже не в списке и если на него будут приходить пакеты на 80 и 443 порты, то будут забанены
а что с базой данных? для нее нет никаких правил, только цепочка определена
:SQL - DROP [0:0]
причем порт 3306 так же нигде не определен, а значит по дефолту все забанено, что явно не разрешено правилами, но ведь все работает?
а оказывается есть такое правило
#Lo
-A INPUT -i lo -j ACCEPT
разрешить любой трафик на интерфейсе loopback, через который пхп соединяется с бд
ssh я просто остановлю как сервис, т.к. больше не нужен и при необходимости из прокса можно зайти








