Ссылки:
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 – цели для правил

Таблицы и цепочки:
По умолчанию мы имеем три таблицы: 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
------------------------