Рубрики
iptables \ Fail2ban Конспект

iptables: конспект / iptables / conntrack / NAT / sysctl

Ссылки:

https://ru.wikibooks.org/wiki/Iptables

https://old.calculate-linux.org/main/ru/iptables

https://wiki.dieg.info/iptables
https://wiki.dieg.info/nat

http://dragonflybsd.blogspot.com/2016/04/conntrack.html
http://conntrack-tools.netfilter.org/manual.html

http://sysadminblog.ru/linux/2012/05/22/primery-ispolzovaniya-iptables.html

https://habr.com/ru/company/ruvds/blog/580648/

Linux: IPTABLES – руководство: часть 4 – цели для правил


трафик_микротик трафик_mikrotik трафик_две_сетевушки chains netfilter

Таблицы и цепочки:

По умолчанию мы имеем три таблицы: FILTER, NAT, MANGLE
По умолчанию мы имеем пять цепочек: PREROUTING, FORWARD, POSTROUTING, INPUT, OUTPUT 
 
filter: (DROP, LOG, ACCEPT, REJECT)
-FORWARD - цепочка используется для фильтрацию пакетов, идущих транзитом через брандмауэр.
-INPUT - через эту цепочку проходят пакеты, которые предназначены локальным приложениям(брандмауэр).
-OUTPUT - используются для фильтрации исходящих пакетов, сгенерированных приложениями на самом брандмауэре.
 
nat: (DNAT,SNAT)
-PREROUTING - используется для внесения изменений на ходе брандмауэра. (dnat)
-OUTPUT - предназначена для преобразования пакетов, созданных приложениями внутри брандмауэра, перед принятием решения о маршрутизации.
-POSTROUTING - применяется для преобразования пакетов перед выдачей их во вне. (snat)
 
mangle: (MARK,TOS,TTL)
-PREROUTING - используется для внесения изменений в  пакеты на входе брандмауэра.
-POSTROUTING - применяется для изменения в пакеты перед выдачей их во вне.
-INPUT - через эту цепочку проходят пакеты, которые предназначены локальным приложениям(брандмауэру).
-FORWARD - используется для модификации заголовков пакетов, идущих транзитом через брандмауэр.
-OUTPUT - для внесения изменений в заголовок пакетов, поступающих от приложений внутри брандмауэра.

Порядок прохождения транзитных пакетов:
mangle PREROUTING
nat PREEOUTING
mangle FORWARD
filter FORWARD
mangle POSTROUTING
nat POSTROUTING
 
Порядок прохождения пакетов предназначенных для приложения компьютера:
mangle PREPOUTING
nat PREROUTING
mangle INPUT
filter INPUT
 
Порядок прохождения пакетов  отправленные приложениями компьютера:
mangle OUTPUT
nat OUTPUT
filter OUTPUT
mangle POSTROUTING
nat POSTROUTING

NAT - NETWORK ADDRESS TRANSLATION
RFC-1918 - документ по не маршрутизированным адресам
SNAT - замена IP-адреса или порта источника (Например настройка доступа к интернету для ПК из локальной сети через маршрутизатор)
DNAT - замена IP-адреса или порта назначения (Например доступ из интернета на ПК в локальной сети)
MASQUERADE - разбирается сам что куда подменять (используется когда у вас нет постоянного внешнего IP, или получаете его по DHCP)
REDIRECT - выполняет перенаправление пакетов и потоков на другой порт той же самой машины

Настройка политики

!!! По умолчанию политика ACCEPT
Отбрасываем все входящие подключения:
!!! Рекомендуется для построения firewall, запрещено все кроме разрешённого
iptables -P INPUT DROP

Отбрасываем идущий трафик через нас:
iptables -P FORWARD DROP

Отбрасываем исходящий трафик:
!!! обычно не используется
iptables -P OUTPUT DROP

IPTABLES основное:

!!! если не указывать таблицу по умолчанию таблица FILTER.
!!! L: Вывести список правил.
!!! v: Отображение подробной информации. Этот ключ будет выводить имя интерфейса, параметры правил и маски TOS. 
!!! n: Не резолвить IP адреса, показывать в цифровом виде. Ускоряет вывод.
!!! --line-numbers: показать номер правила в цепочке
!!! Счетчики пакетов и байтов, также будут показаны в списке, с 'K' суффиксом, 'М' или 'G' в зависимости от необходимого множителя.

Отображение состояния брандмауэра / Показать текущие правила (по умолчанию таблица FILTER):
iptables -L -n -v 

Показать текущие правила  с номером строки (по умолчанию таблица FILTER):
iptables -n -L -v --line-numbers

Показать таблицу Filter:
iptables -L -n -v -t filter

Показать таблицу NAT:
iptables -n -t nat -L

Показать таблицу MANGLE:
iptables -n -t mangle -L

Показать из таблицы FILTER цепочку INPUT 
iptables -L INPUT -n -v 

Показать из таблицы FILTER цепочку OUTPUT
iptables -L OUTPUT -n -v --line-numbers

Построение правил в iptables

iptables [-t table] command [match] [target/jump]
command:
-A - добавить правило в конец цепочки (APPEND)
-D - удалить правило из цепочки (DELETE)
-R - заменить одно правило другим (REPLACE)
-I - вставить правило в указанное место в цепочке (INSERT) (по умолчанию вставляет в начало)
-L - показать список правил (LIST)
-F - очистить цепочку или таблицу (FLUSH)
-Z - обнулить счетчики (ZERO)
-N - создать цепочку пользователя (NEW)
-X - удалить цепочку пользователя 
-P - установить политику по умолчанию (DROP, ACCEPT)

Общие критерии match
-p - протокол (-p tcp)
-s - определяет IP-адрес источника (-s 10.0.0.1)
-d - определяет  IP-адрес назначения
-i - определяет входящий интерфейс
-o - определяет исходящий интерфейс (o eth0)
-f - определяет фрагментыm фрагментированного пакета (!-f) 
 
!!! Символ "!" инвертирует значение параметра.

Критерии:

TCP критерии:
    --sport - порт источника
    --dport - порт назначения (--dport 1024:65535)
    --tcp-flags - определение TCP-флагов
    --syn - запрос на соединение

UDP критерии:
    --sport - порт источника
    --dport - порт назначения

ICMP критерии:
    --icmp-type - определяет тип ICMP пакета (--icmp-type echo-request)

Действия(-j):

ACCEPT - принять пакеты
DROP - сбросить пакет
REJECT - сбросить пакет с сообщение об ошибке
RETURN - возвращает из цепочки
LOG - помещает информацию в системный журна

Терминальные и нетерминальные действия:


Терминальными называются действия, которые прерывают прохождение пакета через текущую базовую цепочку. 
То есть если к пакету в рамках некоторого правила было применено терминальное действие,
 он уже не проверяется на соответствие всем следующим правилам в этой цепочке (и в тех цепочках, 
из которых она была вызвана, если это пользовательская цепочка). 
Терминальными являются все действия, специфичные для таблиц filter и nat. 
Из приведенных выше в этом разделе — ACCEPT, DROP, REJECT, NFQUEUE, QUEUE.

Например:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "IN HTTP: "
Второе из приведенных правил (логирование) никогда не будет срабатывать, так как все пакеты,
 удовлетворяющие этому критерию (входящие TCP-пакеты на порт 80), 
будут пропущены по первому из этих правил, и до второго просто не дойдут.


Нетерминальными, соответственно, являются действия, не прерывающие процесс прохождения пакета через цепочки. 
Нетерминальными являются действия, специфичные для таблицы mangle, а из перечисленных выше — LOG, ULOG и NFLOG.

Например:
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "IN HTTP: "
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Теперь все входящие на TCP-порт 80 пакеты будут сначала заноситься в лог, и только потом пропускаться.

Действие RETURN с точки зрения такой классификации занимает промежуточное положение — оно может прервать прохождение пакета 
через отдельную цепочку (или несколько цепочек, если для перехода в них использовалась опция -g, а не -j), 
но совсем не обязательно, чтобы это приводило к завершению обработки пакета в рамках текущей базовой цепочки.

Удаление правил брандмауэра

!!! D: удалить одно или несколько правил из указанной цепочки
Для отображения номера строки наряду с другой информацией по существующим правилам, введите:
# iptables -L INPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers | less
# iptables -L OUTPUT -n --line-numbers | grep 8.8.8.8
Вы получите список IP. Посмотрите на число слева, а вводите число, чтобы удалить его. 

Например, удаление линии номер 4, введите:
# iptables -D INPUT 4

Или найти источник IP 202.54.1.1 и удалить из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP
  

Добавление правил брандмауэра

Чтобы вставить одно или несколько правил в указанной цепочке, как правило используется следующий синтаксис. 

Сначала узнать номер строки:
# iptables -L INPUT -n --line-numbers

Вывод например:
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED

Чтобы вставить правило между 1 и 2, введите:
# iptables -I INPUT 2 -s 8.8.8.8 -j DROP

Для просмотра обновленных правил, введите:
# iptables -L INPUT -n --line-numbers

Вывод например:
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    DROP       all  --  8.8.8.8              0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED

Блокировать весь трафик:

# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n

Блокировать только входящий трафик:

# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT

Блокировка сетевых адресов локальной сети на внешнем интерфейсе

IP-спуфинг — атака заключающаяся в использовании в IP-пакетах, отправляемых жертве,
в качестве обратного адреса IP-адрес хоста, которому она доверяет. 
Пакеты с немаршрутизируемыми адресами источника должны быть отвергнуты, 
используя следующий синтаксис:
# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Диапазон адресов IPv4 для частных сетей (убедитесь, что они заблокированы на внешнем интерфейсе)

    10.0.0.0/8 -j (A)
    172.16.0.0/12 (B)
    192.168.0.0/16 ©
    224.0.0.0/4 (MULTICAST D)
    240.0.0.0/5 (E)
    127.0.0.0/8 (LOOPBACK)

Блокировка IP-адресов

Чтобы заблокировать IP адрес 1.2.3.4, введите:
# iptables -A INPUT -s 1.2.3.4 -j DROP

Блокировка входящие запросов на порт

Чтобы заблокировать все запросы на порт 80, введите:
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

Чтобы заблокировать порт 80 только для IP-адреса 1.2.3.4, введите:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

Блокировка исходящего IP-адреса

Чтобы заблокировать исходящий трафик определенного хоста или домена, такого как sysadminblog.ru, введите:
host -t a sysadminblog.ru

Ответ будет:
sysadminblog.ru has address 95.211.41.31

Запишите свой ​​IP-адрес и введите следующую команду, чтобы блокировать весь исходящий трафик с 95.211.41.31:
# iptables -A OUTPUT -d 95.211.41.31 -j DROP

Можно использовать маски:
# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
# iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

Вы также можете использовать доменное имя, введите:
# iptables -A OUTPUT -p tcp -d www.sysadminblog.ru -j DROP
# iptables -A OUTPUT -p tcp -d sysadminblog.ru -j DROP
Хотя в документации пишут, что использование доменного имени вместо IP не рекомендуется.

Логирование и блокирование пакетов

Введите следующую команду, чтобы логировать и блокировать IP-спуфинг на открытый интерфейс с именем eth1:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

По умолчанию все логируется в файл /var/log/messages.

Комментарий от akkerman:
Так лучше не делать, в особенности для явно левого трафика. 
LOG можно вставлять только строго с -m limit, 
иначе любая DoS-атака будет во много раз эффективнее: 
фактически косвенным образом злоумышленник получает прямой 
путь интенсивного воздействия непосредственно на файловую систему сервера.

Как делать правильнее, написано ниже
Логирование и блокирование пакетов с ограниченным количеством записей журнала
Параметр -m может ограничить количество записей в журнале созданных в единицу времени. 
Это используется для предотвращения флуда в файле журнала. 
Чтобы записывать не более 7 записей в 5 минут, введите:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Логировать все из цепочки undef:
iptables -A undef_in -j LOG --log-level info --log-prefix "--- IN --- DROP "
iptables -A undef_in -j DROP
iptables -A undef_out -j LOG --log-level info --log-prefix " --- OUT --- DROP "
iptables -A undef_out -j DROP
iptables -A undef_fw -j LOG --log-level info --log-prefix "--- FW --- DROP "
iptables -A undef_fw -j DROP

Блокирование или разрешение трафика от Mac-адреса

Используйте следующий синтаксис:
# iptables -A INPUT -m mac --mac-source 00:19:99:3C:AB:23 -j DROP
## *only accept traffic for TCP port # 8080 from mac 00:19:99:3C:AB:22 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:19:99:3C:AB:22 -j ACCEPT

Запретить или разрешить ICMP запросы для ping

Введите следующую команду, чтобы заблокировать ICMP запросы:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

Ping ответ также может быть ограничен определенными сетями или хостами:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

Следующий пример принимает только ограниченный тип ICMP запросов:
### ** assumed that default INPUT policy set to DROP ** #############
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** all our server to respond to pings ** ##
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Ограничить число одновременных подключений к серверу для каждого клиента по IP

Вы можете использовать модуль connlimit, чтобы поставить такие ограничения. 

Для ограничения не больше 3 SSH соединений на хост, введите:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

Установить HTTP запросов до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
Параметры в примере,
    --connlimit-above 3: Соответствует ли количество существующих соединений выше 3.
    --connlimit-mask 24: Группировать хосты по префиксу. Для IPv4, префиксы от 0 до 32.

INPUT разрешаем

Разрешаем работу локальных приложений использующих loop интерфейс
iptables -A INPUT -i lo -j ACCEPT

Разрешаем все с хоста
iptables -I INPUT -s 192.168.15.0/24 -j ACCEPT
iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT
 
Разрешаем трафик для уже установленных соединений:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Разрешаем доступ к ssh для сети:
iptables -A INPUT -s 10.0.0.0/23 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

Разрешаем порт 53 (DNS):
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT

Разрешаем доступ к веб сервер http:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

Разрешаем доступ на 80 порт только определенного адреса и интерфейса ppp0:
iptables -A INPUT -p tcp -s 8.8.8.8 --dport 80 -i ppp0 -j ACCEPT 

Разрешаем NTP (сервер времени):
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

Разрешаем POP3 и IMAP:
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

Разрешаем samba \ шары:
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT

Разрешаем доступ к веб сервер https:
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

Разрешаем udp/tcp 514 rsyslog:
iptables -A INPUT -i eth0 -p udp --dport 514 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 514 -j ACCEPT

Разрешаем принт сервер cups / printing service udp/tcp port 631 for LAN users 
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT

Разрешаем соединение с PPTP-сервером для всех:
iptables -A INPUT -p tcp --dport 1723 -j ACCEP

Разрешаем прокси squid:
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT
 
Разрешаем mysql / mariadb:
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

Разрешаем tcp 9102 на клиенте Bareos (обычно на клиенте с которого делает backup сервер bareos):
iptables -A INPUT -p tcp --dport 9102 -j ACCEPT

Разрешаем доступ к zabbix-agent с хоста:
iptables -A INPUT -s 192.168.1.200/32 -p tcp -m tcp --dport 10050 -j ACCEPT


Разрешаем доступ к ipa портам (ldap,https,ntp,bind):
iptables -A -p tcp -m multiport --dports 53,80,88,389,443,464,663 -j ACCEPT
iptables -A -p udp -m multiport --dports 53,88,123,464 -j ACCEPT

Разрешаем доступ к ipa портам (ldap,https,ntp,bind) с определённой сети и определенного интерфейса:
iptables -A -s 192.168.1.0/24 -p tcp -m multiport --dports 53,80,88,389,443,464,636  -i eth0 -j ACCEPT
iptables -A -s 192.168.1.0/24 -p udp -m multiport --dports 53,88,123,464 -i eth0  -j ACCEPT

Разрешаем протокол GRE для всех:
iptables -A INPUT -p gre -j ACCEPT

Включаем логирование для пакетов INVALID:
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "Strange:"

Пример включения логирования на разрешающие правило:
iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j LOG --log-level INFO --log-prefix "New connection from ours: "
iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j ACCEPT

INPUT drop



Отбрасываем подключения IP-атакующего\порт-бедалага:
iptables -A INPUT -s IP-атакующего -p tcp --destination-port порт-бедалага -j DROP 

Ограничиваем максимальное число «полуоткрытых» соединений с одного IP к конкретному порту:
iptables -I INPUT -p tcp --syn --dport порт_бедалага -m iplimit --iplimit-above 10 -j DROP 

Отключаем ответы на запросы ICMP ECHO:
iptables -A INPUT -p icmp -j DROP --icmp-type 8

NAT

!!! В организация NAT не должно быть в принципе.
!!! Доступ к интернету должен осуществляется через proxy сервер

iptables -t nat -A POSTROUTING -o isp -j MASQUERADE

iptables -t nat -A POSTROUTING -o isp -j SNAT --to-source 10.0.0.23
iptables -t nat -A PREROUTING -i eth1 -j DNAT --to-destination 192.168.1.25

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.10.15.50:3128 
iptables -t nat -A PREROUTING -p tcp -d 192.168.3.124 --dport 3389 -j DNAT --to 10.70.70.105:3389
iptables -t nat -A PREROUTING -p tcp -d 192.168.3.124 --dport 5090 -j DNAT --to 10.70.70.101:5090

IP FORWARD / MASQUERADE / Включение IP Forward

FORWARD:
!!! По умолчанию ip forward выключен
!!! Если forward выключен то не будет работать маршрутизация между интерфейсами

Проверяем текущие состояние:
cat /proc/sys/net/ipv4/ip_forward - проверяем текущие состояние ip_forward

Включение forward:
!!! это будет работать до перезагрузки
echo 1 > /proc/sys/net/ipv4/ip_forward

!!! Для постоянного включения необходимо отредактировать файл  /etc/sysctl.conf, найти строку net.ipv4.ip_forward=1 и убрать комментарий с неё
nano /etc/sysctl.conf
---------------------
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
---------------------
sysctl -p  - выполняем для применения изменений без перезагрузки 

NAT:
Примеры настройки MASQUERADE:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -t nat -A POSTROUTING -o isp -j MASQUERADE

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Пример работы своей цепочки(из wiki):

!!!Например, предположим, что нам нужно обеспечить доступ к определенным портам нашего сервера для всех хостов из подсети 10.134.0.64/26, кроме 10.134.0.67 и 10.134.0.100.
iptables -F # Очищаем все цепочки таблицы filter
iptables -N our_subnet # Создаем специальную цепочку для проверки пакетов из нашей подсети
iptables -A our_subnet -s 10.134.0.67 -j RETURN # Запрещенный хост — выходим
iptables -A our_subnet -s 10.134.0.100 -j RETURN # Запрещенный хост — выходим

# Всем остальным разрешаем доступ к нужным портам
iptables -A our_subnet -p tcp -m multiport --dports 22,53,8080,139,445 -j ACCEPT
iptables -A our_subnet -p udp -m multiport --dports 53,123,137,138 -j ACCEPT
iptables -A our_subnet -p icmp --icmp-type 8 -j ACCEPT

# Разрешаем пакеты по уже установленным соединениям
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Все пакеты из нашей подсети отправляем на проверку
iptables -A INPUT -s 10.134.0.64/26 -j our_subnet
iptables -P INPUT DROP # Что не разрешено — то запрещено
iptables -P OUTPUT ACCEPT # На выход — можно все

iptables ipset (списки)

Пример правил:
iptables -A INPUT -p tcp -m set --match-set whitelist src -m comment --comment WHITELIST -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set blacklist src -m comment --comment BLACKLIST -j DROP
iptables -A INPUT -p udp -m set --match-set asterisk-blacklist src -m multiport --dports 5060,5038,2000,4569,2727,4520,5000,8088,10000:20000 -m comment --comment "::01-asterisk-blacklist:: Blacklist" -j DROP
iptables -A INPUT -p tcp -m set --match-set asterisk-blacklist src -m multiport --dports 5060,5038,2000,4569,2727,4520,5000,8088,10000:20000 -m comment --comment "::01-asterisk-blacklist:: Blacklist" -j DROP
iptables -A INPUT -p udp -m set --match-set sip src -m multiport --dports 10000:20000 -m comment --comment "::08-sip:: RTP" -j ACCEPT
iptables -A INPUT -p udp -m set --match-set sip src -m multiport --dports 4000:4999 -m comment --comment "::08-sip:: T.38" -j ACCEPT
iptables -A INPUT -p udp -m set --match-set sip src -m udp --dport 5060 -m comment --comment "::08-sip:: SIP" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set asterisk-mgmt src -m tcp --dport 5038 -m comment --comment "::08-sip:: AMI" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set ssh src -m tcp --dport 22 -m comment --comment "::99-system:: SSH" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set sshttl src -m tcp --dport 22 -m comment --comment "::99-system:: SSH" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set zabbix src -m tcp --dport 10050 -m comment --comment "::99-system:: Zabbix" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set bareos src -m tcp --dport 9102 -m comment --comment "::99-system:: Bareos" -j ACCEPT
iptables -A INPUT -p udp -m set --match-set tftp src -m udp --dport 69 -m comment --comment "::89-tftp:: TFTP" -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set web src -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set web src -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

Пример списка:
/etc/iptables/blacklist.ipset 
-! create blacklist hash:net family inet hashsize 131072 maxelem 262144 counters timeout 7200
-! add blacklist 10.100.2.50/32
-! add blacklist 192.168.100.0/24

Сохранение правил брандмауэра

Чтобы сохранить правила брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables save

В других дистрибутивах
iptables-save > /root/my.active.firewall.rules
или
iptables-save

Восстановление правил брандмауэра

Для восстановление правил брандмауэра из файла /root/my.active.firewall.rules, введите:
# iptables-restore  < /root/my.active.firewall.rules
# iptables-restore  /root/my.active.firewall.rules
Для восстановление правил брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables restart

Остановка, перезапуск, запуск брандмауэра Если у Вас CentOS / RHEL / Fedora Linux, вводите:

# service iptables stop
# service iptables start
# service iptables restart

Чтобы отчистить правила iptables его собственными средствами введите:

!!! F: Удаление всех правил (flushing)
!!! X: Удаление цепочки
!!! t <таблица>: Выбрать таблицу и удалить правила
!!! P: Установить политику по умолчанию (например DROP, REJECT или ACCEPT)

# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT

Очистка таблицы filter:

iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

Очистка таблицы nat:

iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING

Очистка таблицы mangle:

iptables -t mangle -F PREROUTING

Чистим ветки логов:

iptables -F undef_in
iptables -F undef_out
iptables -F undef_fw
iptables -X undef_in
iptables -X undef_out
iptables -X undef_fw

Разрешаем принимать трафик на loopback-интерфейсе:

iptables -A INPUT eth2 -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A FORWARD -i lo -o eth1 -j ACCEPT$IPT -A FORWARD -i eth2 -o lo -j ACCEPT
iptables -A FORWARD -i lo -o eth2 -j ACCEPT$IPT -A FORWARD -i eth1 -o lo -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Разрешение исходящего трафика:

iptables -A OUTPUT -o eth0 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A OUTPUT -o eth2 -j ACCEPT

Разрешить соединения, которые инициированы изнутри

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Следующими правилами разрешаем коннекты на наш сервер из вне:

iptables -A INPUT -p udp --dport 33434:33523 -j ACCEPT - Разрешить traceroute
iptables -A INPUT -p tcp --dport 22 -j ACCEPT - Разрешаем SSH
iptables -A INPUT -p tcp --dport 10000 -j ACCEPT - Разрешаем webmin
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT - Доступ на http

Проброс RDP на сервер терминалов:

iptables -t nat -A PREROUTING -p tcp --dport 3389 -i eth0 -j DNAT --to 192.168.0.100
iptables -A FORWARD -i eth0 -d 192.168.0.100 -p tcp --dport 3389 -j ACCEPT

Выход из локалки на почтовые сервера

iptables -A FORWARD -d smtp.mail.ru -o eth0 -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A FORWARD -d smtp.masterhost.ru -o eth0 -p tcp -m tcp --dport 25 -j ACCEPT

Входящий трафик  на почтовые сервера
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

Заворачиваем трафик на порт сквида:

iptables -t nat -A PREROUTING -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -s 0/0 -d 0/0 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -p udp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -s 0/0 -d 0/0 -j REDIRECT --to-port 3128

Если прокси не установлена,либо нет нужды в использовании SQUID, то просто форвардим нужные порты:

iptables -A FORWARD -o eth0 -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -j ACCEPT 

Прячем NAT:

iptables -t mangle -A PREROUTING -j TTL --ttl-set 64
iptables -t mangle -A PREROUTING -j RETURN

Все что не разрешено, но ломится отправим в цепочку undef:

iptables -N undef_in
iptables -N undef_out
iptables -N undef_fw
iptables -A INPUT -i vlan2 -j undef_in
iptables -A OUTPUT -j undef_out
iptables -A FORWARD -j undef_fw

Антибрут ssh:

iptables -A INPUT -m state  --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp  --dport 22 -m state --state NEW  -m recent --set --name SSH
iptables -A INPUT -p tcp -m tcp  --dport 22 -m state --state NEW  -m recent --update --seconds 60  --hitcount 4 --rttl --name SSH -j DROP
iptables -A INPUT -p tcp -m tcp  --dport 22 -m state --state NEW -j ACCEPT
После этого хосты, пытающиеся перебирать пароль, будут блокироваться: 
все IP из черного списка будут фиксироваться в файле /proc/net/ipt_recent/SSH

Разрешаем некоторые ICMP-сообщения

https://ru.wikipedia.org/wiki/ICMP  - icmp-type
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 3 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 11 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 12 -j ACCEPT

open firewall:

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags  SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT # Небольшая защита от DoS
iptables -A INPUT -p all -m state --state  RELATED,ESTABLISHED -j ACCEPT # Разрешаем уже установленные соединения
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # Разрешаем 22 порт
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT # Разрешаем 80 порт
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 3 -j ACCEPT # Разрешаем некоторые ICMP-сообщения
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 11 -j ACCEPT # Разрешаем некоторые ICMP-сообщения
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 12 -j ACCEPT # Разрешаем некоторые ICMP-сообщения
iptables -A INPUT DROP

sysctl \ conntrack

Итак, есть /proc/net/nf_conntrack, в нём можно найти наши проблемные записи, 
но напрямую их поправить не удастся (или можно, тогда как?). 
Timeout NAT. Информация о сессиях также может быть удалена по timeout. 
Т.е. если в течение долгого времени в рамках соединения обмена трафика нет - сессия закрывается и информация о ней так же удаляется из таблицы NAT. 
По умолчанию значения тайм-аутов стоят достаточно большие.
Поэтому, при больших потоках трафика, даже если nf_conntrack_max установлен в максимальное значение, 
существует риск столкнуться с переполнением таблицы и разрывами соединений. 

apt install conntrack-tools - установка пакета
conntrack -L conntrack
conntrack -L conntrack -s 192.168.0.100 - список для нужного внутреннего IP
conntrack -L conntrack -d 8.8.8.8 - на какой-то адрес
conntrack -L conntrack -q 192.168.0.1 - коннекты, проходящие через старый gate
conntrack -D conntrack -s 192.168.0.100 -q 192.168.0.1 - удалить проблемную запись
conntrack -F conntrack - есть и "оружие последнего дня", полная очистка таблицы
conntrack -h - помощь

# sysctl net.netfilter.nf_conntrack_max - посмотреть текущий размер таблицы NAT
net.netfilter.nf_conntrack_max = 65536

# sysctl -a | grep conntrack_max - посмотреть текущий размер таблицы NAT
net.netfilter.nf_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max = 65536
net.nf_conntrack_max = 65536

# sysctl net.netfilter.nf_conntrack_count - посмотреть заполненность таблицы
net.netfilter.nf_conntrack_count = 654

NAT tweak

# sysctl net.netfilter.nf_conntrack_max - посмотреть текущий размер таблицы NAT
net.netfilter.nf_conntrack_max = 65536

# sysctl -a | grep conntrack_max - посмотреть текущий размер таблицы NAT
net.netfilter.nf_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max = 65536
net.nf_conntrack_max = 65536

# sysctl net.netfilter.nf_conntrack_count - посмотреть заполненность таблицы
net.netfilter.nf_conntrack_count = 654


Посмотреть установленные значения задержек (в секундах):
# sysctl -a | grep conntrack | grep timeout
net.netfilter.nf_conntrack_generic_timeout = 600 - NAT- сервер будет хранить информацию о сессии даже в том случае, если будет проходит 1 пакет в 10 минут.
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000 - TCP- сессию NAT- сервер будет отслеживать 5 дней(!), если даже за это период пройдет только 1 пакет, это может привести к быстрому заполнению nf_conntrack_max
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.ipv4.netfilter.ip_conntrack_generic_timeout = 600
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent2 = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 432000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 10
net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans = 300
net.ipv4.netfilter.ip_conntrack_udp_timeout = 30
net.ipv4.netfilter.ip_conntrack_udp_timeout_stream = 180
net.ipv4.netfilter.ip_conntrack_icmp_timeout = 30

ipteplse-sex

vim  /etc/systemd/system/sex-sec.service
----------------------------------------
[Unit]
Description= add iptables and route
After=syslog.target

[Service]
Type=simple
TimeoutStartSec=10
ExecStart=/etc/iptables/sex_sec.sh

[Install]
WantedBy=multi-user.target
----------------------------------------

mkdir /etc/iptables

vim /etc/iptables/sex_sec.sh
----------------------------
#!/bin/bash
iptables-restore /etc/iptables/iptable.4
ip6tables-restore /etc/iptables/iptable.6 
sleep 30
#!/bin/bash

list_net_ip="192.168.55 192.168.80 192.168.88 10.12.88"
ip_router="192.168.16.55"
i=99

for x in ${list_net_ip} ; do
      i=$(ip route | grep "${x}" 1>/dev/null ; echo $?)
      if ((i > 0)) ; then
       #echo -e "ip route add ${x} via ${ip_router}"
       ip route add ${x}.0/24 via ${ip_router}
      fi
done

-----------------------------
chmod +x /etc/iptables/sex_sec.sh

vim  /etc/iptables/iptable.4
----------------------------
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-6e31867864c0 -j MASQUERADE
-A POSTROUTING -o ovsbr0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.2/32 -d 172.18.0.2/32 -p tcp -m tcp --dport 443 -j MASQUERADE
-A POSTROUTING -s 172.18.0.5/32 -d 172.18.0.5/32 -p tcp -m tcp --dport 8080 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-6e31867864c0 -j RETURN
-A DOCKER ! -i br-6e31867864c0 -p tcp -m tcp --dport 8443 -j DNAT --to-destination 172.18.0.2:443
-A DOCKER ! -i br-6e31867864c0 -p tcp -m tcp --dport 32768 -j DNAT --to-destination 172.18.0.5:8080
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp0s20f0u2 -j ACCEPT
-A INPUT -i enp0s20f0u1u2 -j ACCEPT
-A INPUT -i enp0s20f0u1u1 -j ACCEPT
-A INPUT -i zthnhjuefn -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m udp --dport 5678 -j ACCEPT
-A INPUT -s 192.168.16.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.15.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 100/sec -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i zthnhjuefn -j ACCEPT
-A FORWARD -i enp0s20f0u1u1 -j ACCEPT
COMMIT

----------------------------

vim /etc/iptables/iptable.6
------------------------
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
COMMIT
------------------------