IPTABLES

1. Показать статус.

Thank you for reading this post, don't forget to subscribe!

# iptables -L -n -v

Где:
-L : Пока­зать спи­сок правил.
-v : Отоб­ра­жать допол­ни­тель­ную инфор­ма­цию. Эта опция пока­зы­ва­ет имя интер­фей­са, опции, TOS мас­ки. Так­же отоб­ра­жа­ет суф­фик­сы 'K', 'M' or 'G'.
-n : Отоб­ра­жать IP адрес и порт чис­ла­ми (не исполь­зуя DNS сер­ве­ра для опре­де­ле­ния имен. Это уско­рит отображение).

2. Отобразить список правил с номерами строк.

# iptables -n -L -v --line-numbers

3. Отобразить INPUT или OUTPUT цепочки правил.

# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v --line-numbers

4. Остановить, запустить, перезапустить файрвол.

Сила­ми самой системы:
# service iptables stop
# service iptables start

Мож­но так­же исполь­зо­вать коман­ды iptables для того, что­бы оста­но­вить фай­р­вол и уда­лить все правила:
# 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

Где:
-F : Уда­лить (flush) все правила.
-X : Уда­лить цепочку.
-t table_name : Выбрать таб­ли­цу (nat или mangle) и уда­лить все правила.
-P : Выбрать дей­ствия по умол­ча­нию (такие, как DROP, REJECT, или ACCEPT).

5. Удалить правила файрвола.

Что­бы отоб­ра­зить номер стро­ки с суще­ству­ю­щи­ми правилами:
# 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 202.54.1.1

Полу­чим спи­сок IP адре­сов. Про­сто посмот­рим на номер сле­ва и уда­лим соот­вет­ству­ю­щую стро­ку. К при­ме­ру для номе­ра 3:
# iptables -D INPUT 3

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

Где:
-D : Уда­лить одно или несколь­ко пра­вил из цепочки.

6. Добавить правило в файрвол.

Что­бы доба­вить одно или несколь­ко пра­вил в цепоч­ку, для нача­ла отоб­ра­зим спи­сок с исполь­зо­ва­ни­ем номе­ров строк:
# iptables -L INPUT -n --line-numbers

При­мер­ный вывод:

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

Про­ве­рим, обно­ви­лось ли правило:
# iptables -L INPUT -n --line-numbers

Вывод ста­нет таким:

7. Сохраняем правила файрвола.

Через iptables-save:
# iptables-save > /etc/iptables.rules

8. Восстанавливаем правила.

Через iptables-restore
# iptables-restore < /etc/iptables.rules

9. Устанавливаем политики по умолчанию.

Что­бы сбра­сы­вать весь трафик:
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n

После выше­пе­ре­чис­лен­ных команд ни один пакет не поки­нет дан­ный хост.
# ping google.com

10. Блокировать только входящие соединения.

Что­бы сбра­сы­вать все не ини­ци­и­ро­ван­ные вами вхо­дя­щие паке­ты, но раз­ре­шить исхо­дя­щий трафик:
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -L -v -n

Паке­ты исхо­дя­щие и те, кото­рые были запом­не­ны в рам­ках уста­нов­лен­ных сес­сий - разрешены.
# ping google.com

11. Сбрасывать адреса изолированных сетей в публичной сети.

# 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

Спи­сок IP адре­сов для изо­ли­ро­ван­ных сетей:
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)

12. Блокировка определенного IP адреса.

Что­бы забло­ки­ро­вать адрес взлом­щи­ка 1.2.3.4:
# iptables -A INPUT -s 1.2.3.4 -j DROP
# iptables -A INPUT -s 192.168.0.0/24 -j DROP

13. Заблокировать входящие запросы порта.

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

Что­бы забло­ки­ро­вать запрос пор­та 80 с адре­са 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 DR

14. Заблокировать запросы на исходящий IP адрес.

Что­бы забло­ки­ро­вать опре­де­лен­ный домен, узна­ем его адрес:
# host -t a facebook.com

Вывод: facebook.com has address 69.171.228.40

Най­дем CIDR для 69.171.228.40:
# whois 69.171.228.40 | grep CIDR

Вывод:
CIDR: 69.171.224.0/19

Забло­ки­ру­ем доступ на 69.171.224.0/19:
# iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

Так­же мож­но исполь­зо­вать домен для блокировки:
# iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP
# iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP

15. Записать событие и сбросить.

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

# 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):
# tail -f /var/log/messages
# grep -i --color 'IP SPOOF' /var/log/messages

16. Записать событие и сбросить (с ограничением на количество записей).

Что­бы не пере­пол­нить раз­дел раз­ду­тым жур­на­лом, огра­ни­чим коли­че­ство запи­сей с помо­щью -m. К при­ме­ру, что­бы запи­сы­вать каж­дые 5 минут мак­си­мум 7 строк:
# 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

16. Сбрасывать или разрешить трафик с определенных MAC адресов.

# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
## *разрешить только для TCP port # 8080 с mac адреса 00:0F:EA:91:04:07 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

17. Разрешить или запретить ICMP Ping запросы.

Что­бы запре­тить 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

Раз­ре­шить для опре­де­лен­ных сетей / хостов:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

Раз­ре­шить толь­ко часть ICMP запросов:
### ** предполагается, что политики по умолчанию для входящих установлены в 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
## ** разрешим отвечать на запрос ** ##
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

18. Открыть диапазон портов.

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

9. Открыть диапазон адресов.

## разрешить подключение к порту 80 (Apache) если адрес в диапазоне от 192.168.1.100 до 192.168.1.200 ##
# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

## пример для nat ##
# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

20. Закрыть или открыть стандартные порты.

Заме­нить ACCEPT на DROP, что­бы забло­ки­ро­вать порт.

## ssh tcp port 22 ##
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

## cups (printing service) udp/tcp port 631 для локальной сети ##
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

## time sync via NTP для локальной сети (udp port 123) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

## tcp port 25 (smtp) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

# dns server ports ##
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/https www server port ##
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

## tcp port 110 (pop3) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT

## tcp port 143 (imap) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

## Samba file server для локальной сети ##
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

## proxy server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT

## mysql server для локальной сети ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

21. Ограничить количество параллельных соединений к серверу для одного адреса.

Для огра­ни­че­ний исполь­зу­ет­ся 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 : Ука­зы­ва­ет мас­ку сети.

Помощь по iptables.

Для поис­ка помо­щи по iptables, вос­поль­зу­ем­ся man:
$ man iptables

Что­бы посмот­реть помощь по опре­де­лен­ным коман­дам и целям:
# iptables -j DROP -h

Проверка правила iptables.

Про­ве­ря­ем откры­тость / закры­тость портов:
# netstat -tulpn

Про­ве­ря­ем откры­тость / закры­тость опре­де­лен­но­го порта:
# netstat -tulpn | grep :80

Про­ве­рим, что iptables раз­ре­ша­ет соеди­не­ние с 80 портом:
# iptables -L INPUT -v -n | grep 80

В про­тив­ном слу­чае откро­ем его для всех:
# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

Про­ве­ря­ем с помо­щью telnet
$ telnet ya.ru 80

Мож­но исполь­зо­вать nmap для проверки:
$ nmap -sS -p 80 ya.ru