===== Шпаргалка iptables ===== **IPTables** — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux, начиная с версии 2.4. Для использования утилиты IPTables требуются привилегии суперпользователя **root**. Данная инструкция относится больше к **Debian – based** дистрибутивам. Ниже, схематично представлен принцип работы **IPTables**: {{:linux:iptables:1551460907673.png}} Перейдём непосредственно, к командам: Посмотреть текущий список правил: iptables –n –L –v {{:linux:iptables:1551460972294.png}} Сохранить набор правил: iptables-save> /etc/iptables.rules {{:linux:iptables:1551461038392.png}} Восстановить правила: iptables-restore Отброс всего трафика: iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP Посмотреть текущий список правил с нумерацией строк: iptables -n -L -v --line-numbers {{:linux:iptables:1551461125036.png}} Посмотреть все активные правила: iptables –S {{:linux:iptables:1551461157921.png}} Список правил в виде таблиц для цепочки **INPUT**: iptables -L INPUT * **INPUT** — позволяет модифицировать пакет, предназначенный самому хосту. {{:linux:iptables:1551461278251.png}} Специальные правила, действующие для цепочки **INPUT**: iptables –S INPUT {{:linux:iptables:1551461320355.png}} Показать количество пакетов и общий размер: iptables -L INPUT –v {{:linux:iptables:1551461352006.png}} Показать правила для цепочек **INPUT** и **OUTPUT** с нумерацией строк и подробностями: iptables -L INPUT -n -v iptables -L OUTPUT -n -v --line-numbers * **OUTPUT** — позволяет модифицировать пакеты, исходящие от самого хоста. {{:linux:iptables:1551461420453.png}} Удаление правила по цепочке и номеру: iptables -D INPUT 10 {{:linux:iptables:1551461476742.png}} Удаление правила по спецификации: iptables -D INPUT -m conntrack --ctstate INVALID -j DROP * **conntrack** — инструмент, позволяющий системному администратору наблюдать таблицы состояний соединений и взаимодействовать с ними: очищать таблицы целиком, удалять отдельные записи, маркировать соединения вручную (аналог действия **CONNMARK**), устанавливать тайм-ауты соединений. * Состояние **INVALID** означает, что принадлежность пакета к соединению установить не удалось. * **DROP** — заблокировать пакет, не сообщая источнику об отказе. Более предпочтительна при фильтрации трафика на интерфейсах, подключенных к интернету, так как понижает информативность сканирования портов хоста злоумышленниками. Сбросить все правила, удалить все цепочки и принять изменения: iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -t nat -F iptables -t mangle -F iptables -F iptables –X * **FORWARD** — через эту цепочку проходит транзитный трафик. * **ACCEPT** – принять изменения. Сброс всех цепочек: iptables –F Сброс одной цепочки: iptables –F INPUT Добавить правило в файрволл: iptables -I INPUT 2 -s 192.168.0.101 -j DROP Разрешить петлевые соединения: iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT Разрешить установленные и связанные входящие соединения: iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT **ESTABLISHED** — пакеты, принадлежащие к установленным соединениям, состоянию **RELATED** соответствуют пакеты, открывающие новые соединения, логически связанные с уже установленными (например, соединение данных в пассивном режиме **FTP**). Разрешить установленные исходящие соединения: iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешения маршрутизации между интерфейсами: iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT **NAT** для подсети и конкретного порта назначения: iptables -A POSTROUTING -p tcp -m tcp -s 172.16.0.0/255.255.0.0 --dport 443 -j MASQUERADE * **MASQUERADE** - может быть использовано вместо SNAT, даже если вы имеете постоянный IP адрес, однако, невзирая на положительные черты, маскарадинг не следует считать предпочтительным в этом случае, поскольку он дает большую нагрузку на систему. * Действие **MASQUERADE** допускается указывать только в цепочке **POSTROUTING** таблицы nat, так же как и действие SNAT Отбросить входящие некорректные пакеты: iptables -A INPUT -m conntrack --ctstate INVALID -j DROP Блокировать нежелательный IP-адрес: iptables -A INPUT -s 192.168.0.101 -j DROP Блокировать нежелательный IP-адрес и отклонить: iptables -A INPUT -s 192.168.252.10 -j REJECT * **REJECT** — заблокировать пакет и сообщить его источнику об отказе. По умолчанию об отказе сообщается отправкой ответного **ICMP**-пакета «icmp-port-unreachable». Однако, это действие поддерживает опцию –reject-with, позволяющую указать формулировку сообщения об отказе (возможные значения: icmp-net-unreachable, icmp-host-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited). Для протокола **TCP** поддерживается отказ в форме отправки **RST**-пакета (–reject-with tcp-reset). Заблокировать соединение на сетевой интерфейс: iptables -A INPUT -i eth0 -s 192.168.252.10 -j DROP Открыть диапазон портов: iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1:65535 -j ACCEPT Разрешить входящие **SSH** соединения: iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить входящий **SSH** с определенного IP-адреса или подсети: iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT * **NEW** — соединение не открыто, то есть пакет является первым в соединении. Разрешить исходящие **SSH** соединения: iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить входящий **Rsync** с определенного IP-адреса или подсети: * **rsync** — программа для UNIX-подобных систем, которая выполняет синхронизацию файлов и каталогов в двух местах с минимизированием трафика, используя кодирование данных при необходимости. iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить все входящие **HTTP** соединения: iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить все входящие **HTTPS** соединения: iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить все входящие **HTTP** и **HTTP**S соединения: iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить **MySQL** с определенного IP-адреса или подсети: iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить **MySQL** подключение на определенный сетевой интерфейс: iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT **PostgreSQL** с определенного IP-адреса или подсети: iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить **PostgreSQL** для конкретного сетевого интерфейса: iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT Блокировать исходящие письма **SMTP**: iptables -A OUTPUT -p tcp --dport 25 -j REJECT Разрешить все входящие подключения **SMTP**: iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить все входящие подключения **IMAP**: iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить все входящие подключения **IMAPS**: iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить все входящие подключения **POP3**: iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT Разрешить все входящие подключения **POP3S**: iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT Отбросить сетевые подключения из локальных сетей на внешний интерфейс: 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 Отбросить все исходящие подключения на сети **Facebook**: Получаем информацию о **Facebook AS**: whois -h v4.whois.cymru.com " -v $(host facebook.com | grep "has address" | cut -d " " -f4)" | tail -n1 | awk '{print $1}' {{:linux:iptables:1551462673328.png}} Добавляем правила в **IPTables**: for i in $(whois -h whois.radb.net -- '-i origin AS32934' | grep "^route:" | cut -d ":" -f2 | sed -e 's/^[ \t]*//' | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 | cut -d ":" -f2 | sed 's/$/;/') ; do iptables -A OUTPUT -s "$i" -j REJECT Done {{:linux:iptables:1551462708466.png}} Заблокировать домен: iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP Логирование и отброс пакетов: 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 * Занесение информации о пакетах в системный журнал (**LOG** и **LOGMARK**). Просмотр файла логов по умолчанию: tail -f /var/log/messages grep --color 'IP SPOOF' /var/log/messages Логировать и отбрасывать пакеты, с занесением ограниченного количества записей в лог: 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 Отбросить или принять трафик с **Mac-адреса**: iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT Блокировать или разрешить запрос **ICMP Ping**: iptables -A INPUT -p icmp --icmp-type echo-request -j DROP iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP Указание нескольких портов c **multiport**: * **multiport** — позволяет указать несколько (до 15) портов и/или их диапазонов (для протоколов TCP, UDP, SCTP, DCCP и UDP Lite) iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports ssh,smtp,http,https -j ACCEPT Балансировка нагрузки с **random** или **nth**: _ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13") for ip in "${_ips[@]}" ; do iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth – counter 0 --every 4 --packet 0 \ -j DNAT --to-destination ${ip}:80 done или _ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13") for ip in "${_ips[@]}" ; do iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \-j DNAT --to-destination ${ip}:80 done Ограничение количества соединений с **limit** и **iplimit***: iptables -A FORWARD -m state --state NEW -p tcp -m multiport --dport http,https -o eth0 -i eth1 -m limit --limit 20/hour --limit-burst 5 -j ACCEPT или iptables -A INPUT -p tcp -m state --state NEW --dport http -m iplimit --iplimit-above 5 -j DROP Ведение списка последних подключений для сравнения: iptables -A FORWARD -m recent --name portscan --rcheck --seconds 100 -j DROP iptables -A FORWARD -p tcp -i eth0 --dport 443 -m recent --name portscan --set –j DROP Сопоставление с **string*** в полезной нагрузке пакета: iptables -A FORWARD -m string --string '.com' -j DROP iptables -A FORWARD -m string --string '.exe' -j DROP Основанные на времени правила с **time***: iptables -A FORWARD -p tcp -m multiport --dport http,https -o eth0 -i eth1 -m time --timestart 21:30 --timestop 22:30 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT Сравнение и отброс пакетов на основе значений **TTL**: iptables -A INPUT -s 1.2.3.4 -m ttl --ttl-lt 40 -j REJECT Создание защиты от сканирования портов: iptables -N port-scanning iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN iptables -A port-scanning -j DROP {{:linux:iptables:1551463624143.png}} Создание защиты от **SSH brute-force**: iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP Защита от **Syn-flood**: iptables -N syn_flood iptables -A INPUT -p tcp --syn -j syn_flood iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN iptables -A syn_flood -j DROP iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j LOG --log-prefix PING-DROP: iptables -A INPUT -p icmp -j DROP iptables -A OUTPUT -p icmp -j ACCEPT Смягчение **Syn-flood** с помощью **SYNPROXY**: iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460 iptables -A INPUT -m conntrack --ctstate INVALID -j DROP Блокировать новые пакеты, которые не являются **SYN**: iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP или iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP Быстрая проверка фрагментированных пакетов: iptables -A INPUT -f -j DROP Отброс **XMAS** пакетов: iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP * **XMAS** пакеты - можно использовать в качестве метода снятия отпечатков стека TCP/IP, отправляя пакеты, а затем ожидая и анализируя ответы. Отбросить все **NULL** пакеты: * Согласно нормам RFC заголовок IP-пакета должен содержать сведения об используемом протоколе транспортного уровня в поле “Protocol”. При использовании IP Null атаки отправляются пакеты с нулевым значением этого поля. Пограничные маршрутизаторы и файрволлы, скорее всего, беспрепятственно пропустят такой пакет, как не классифицированный. Не смотря на то, что в настоящее время нулевое значение в поле “протокол” зарезервировано для указания IPv6 Hop-by-Hop Option (HOPOPT), далеко не каждый сервер может принять и корректно обработать такой пакет. А если такие пакеты поступают в большом количестве, их анализ будет занимать достаточно значительную часть системных ресурсов, вплоть до их полного исчерпания и отказа сервера. iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP Блокировать необычные значения **MSS**: * **MSS** - является параметром протокола TCP и определяет максимальный размер полезного блока данных в байтах для TCP-пакета. iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP Блокировать пакеты с поддельными флагами **TCP**: iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP Блокировка пакетов из частных подсетей (**Spoofing**): _subnets=("224.0.0.0/3" "169.254.0.0/16" "172.16.0.0/12" "192.0.2.0/24" "192.168.0.0/16" "10.0.0.0/8" "0.0.0.0/8" "240.0.0.0/5") for _sub in "${_subnets[@]}" ; do iptables -t mangle -A PREROUTING -s "$_sub" -j DROP done iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP