IPTables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux, начиная с версии 2.4. Для использования утилиты IPTables требуются привилегии суперпользователя root.
Данная инструкция относится больше к Debian – based дистрибутивам.
Ниже, схематично представлен принцип работы IPTables:
Перейдём непосредственно, к командам:
Посмотреть текущий список правил:
iptables –n –L –v
Сохранить набор правил:
iptables-save> /etc/iptables.rules
Восстановить правила:
iptables-restore </etc/iptables.rules
Отброс всего трафика:
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
Посмотреть текущий список правил с нумерацией строк:
iptables -n -L -v --line-numbers
Посмотреть все активные правила:
iptables –S
Список правил в виде таблиц для цепочки <color #22b14c>INPUT</color>:
iptables -L INPUT
Специальные правила, действующие для цепочки <color #22b14c>INPUT</color>:
iptables –S INPUT
Показать количество пакетов и общий размер:
iptables -L INPUT –v
Показать правила для цепочек <color #22b14c>INPUT</color> и <color #22b14c>OUTPUT</color> с нумерацией строк и подробностями:
iptables -L INPUT -n -v iptables -L OUTPUT -n -v --line-numbers
Удаление правила по цепочке и номеру:
iptables -D INPUT 10
Удаление правила по спецификации:
iptables -D INPUT -m conntrack --ctstate INVALID -j 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
Сброс всех цепочек:
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
<color #22b14c>ESTABLISHED</color> — пакеты, принадлежащие к установленным соединениям, состоянию <color #22b14c>RELATED</color> соответствуют пакеты, открывающие новые соединения, логически связанные с уже установленными (например, соединение данных в пассивном режиме FTP).
Разрешить установленные исходящие соединения:
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
Разрешения маршрутизации между интерфейсами:
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
<color #7092be>NAT</color> для подсети и конкретного порта назначения:
iptables -A POSTROUTING -p tcp -m tcp -s 172.16.0.0/255.255.0.0 --dport 443 -j MASQUERADE
Отбросить входящие некорректные пакеты:
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
Заблокировать соединение на сетевой интерфейс:
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
Разрешить входящие <color #7092be>SSH</color> соединения:
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
Разрешить входящий <color #7092be>SSH</color> с определенного 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
Разрешить исходящие <color #7092be>SSH</color> соединения:
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
Разрешить входящий <color #7092be>Rsync</color> с определенного IP-адреса или подсети:
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
Разрешить все входящие <color #7092be>HTTP</color> соединения:
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
Разрешить все входящие <color #7092be>HTTPS</color> соединения:
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
Разрешить все входящие <color #7092be>HTTP</color> и <color #7092be>HTTPS</color> соединения:
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
Разрешить <color #7092be>MySQL</color> с определенного 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
Разрешить <color #7092be>MySQL</color> подключение на определенный сетевой интерфейс:
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
<color #7092be>PostgreSQL</color> с определенного 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
Разрешить <color #7092be>PostgreSQL</color> для конкретного сетевого интерфейса:
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
Блокировать исходящие письма <color #7092be>SMTP</color>:
iptables -A OUTPUT -p tcp --dport 25 -j REJECT
Разрешить все входящие подключения <color #7092be>SMTP</color>:
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
Разрешить все входящие подключения <color #7092be>IMAP</color>:
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
Разрешить все входящие подключения <color #7092be>IMAPS</color>:
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
Разрешить все входящие подключения <color #7092be>POP3</color>:
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
Разрешить все входящие подключения <color #7092be>POP3S</color>:
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
Отбросить все исходящие подключения на сети <color #22b14c>Facebook</color>:
Получаем информацию о <color #22b14c>Facebook AS</color>:
whois -h v4.whois.cymru.com " -v $(host facebook.com | grep "has address" | cut -d " " -f4)" | tail -n1 | awk '{print $1}'
Добавляем правила в <color #ff7f27>IPTables</color>:
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
Заблокировать домен:
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
Просмотр файла логов по умолчанию:
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
Отбросить или принять трафик с <color #7092be>Mac-адреса</color>:
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
Блокировать или разрешить запрос <color #7092be>ICMP Ping</color>:
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 <color #7092be>multiport</color>:
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports ssh,smtp,http,https -j ACCEPT
Балансировка нагрузки с <color #7092be>random</color> или <color #7092be>nth</color>:
_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
Ограничение количества соединений с <color #7092be>limit</color> и <color #7092be>iplimit*</color>:
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
Сопоставление с <color #7092be>string*</color> в полезной нагрузке пакета:
iptables -A FORWARD -m string --string '.com' -j DROP iptables -A FORWARD -m string --string '.exe' -j DROP
Основанные на времени правила с <color #7092be>time*</color>:
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
Сравнение и отброс пакетов на основе значений <color #7092be>TTL</color>:
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
Создание защиты от <color #7092be>SSH brute-force</color>:
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
Защита от <color #7092be>Syn-flood</color>:
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
Смягчение <color #7092be>Syn-flood</color> с помощью <color #7092be>SYNPROXY</color>:
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
Блокировать новые пакеты, которые не являются <color #7092be>SYN</color>:
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
Отброс <color #22b14c>XMAS</color> пакетов:
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
Отбросить все <color #7092be>NULL</color> пакеты:
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
Блокировать необычные значения <color #7092be>MSS</color>:
iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
Блокировать пакеты с поддельными флагами <color #7092be>TCP</color>:
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
Блокировка пакетов из частных подсетей (<color blue>Spoofing</color>):
_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