Все ленты — последние статьи

CheatSheet: 20 примеров использования iptables для администраторов.


 Файрволл в системе linux контролируется программой, названой iptables (для ipv4) и ip6tables (для ipv6). В данной шпаргалке рассмотрены самые распространенные способы использования iptables для тех, кто хочет защитить свою систему от взломщиков или просто разобраться в настройке.

1. Показать статус.
# iptables -L -n -v

 Примерный вывод команды для неактивного файрволла:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

 

 Для активного файрволла:
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
  394 43586 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
   93 17292 ACCEPT     all  --  br0    *       0.0.0.0/0            0.0.0.0/0
    1   142 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  br0    br0     0.0.0.0/0            0.0.0.0/0
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
    0     0 TCPMSS     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x06/0x02 TCPMSS clamp to PMTU
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 wanin      all  --  vlan2  *       0.0.0.0/0            0.0.0.0/0
    0     0 wanout     all  --  *      vlan2   0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  br0    *       0.0.0.0/0            0.0.0.0/0
Chain OUTPUT (policy ACCEPT 425 packets, 113K bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain wanin (1 references)
 pkts bytes target     prot opt in     out     source               destination
Chain wanout (1 references)
 pkts bytes target     prot opt in     out     source               destination

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

 Примерный вывод:
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  0.0.0.0/0            0.0.0.0/0           state INVALID
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
Chain FORWARD (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0           state INVALID
3    TCPMSS     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x06/0x02 TCPMSS clamp to PMTU
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
5    wanin      all  --  0.0.0.0/0            0.0.0.0/0
6    wanout     all  --  0.0.0.0/0            0.0.0.0/0
7    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
Chain wanin (1 references)
num  target     prot opt source               destination
Chain wanout (1 references)
num  target     prot opt source               destination

 Вы можете использовать номера строк для того, чтобы добавлять новые правила.
1.2 Отобразить INPUT или OUTPUT цепочки правил.
# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v --line-numbers
2. Остановить / Запустить / Перезапустить файрволл.
 Силами самой системы:
# service iptables stop
# service iptables start
# service iptables restart

 Можно также использовать команды 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).
3. Удалить правила файрволла.
 Чтобы отобразить номер строки с существующими правилами:
# 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 : Удалить одно или несколько правил из цепочки.
4. Добавить правило в файрволл.
 Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:
# 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 202.54.1.2 -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  --  202.54.1.2           0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED
5. Сохраняем правила файрволла.
 Силами системы:
# service iptables save

 Через iptables-save:
# iptables-save > /root/my.active.firewall.rules
# cat /root/my.active.firewall.rules
6. Восстанавливаем правила.
 Силами системы:
# service iptables restart

# wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

 Список ip адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 (C)
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)
9. Блокировка определенного 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
10. Заблокировать входящие запросы порта.
 Чтобы заблокировать все входящие запросы порта 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.4r:
# 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
11. Заблокировать запросы на исходящий ip адрес.
 Чтобы заблокировать определенный домен, узнаем его адрес:
# host -t a www.facebook.com

 Вывод:
 www.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.facebook.com -j DROP
# iptables -A OUTPUT -p tcp -d facebook.com -j DROP
12. Записать событие и сбросить.
 Чтобы записать в журнал движение пакетов перед сбросом, добавим правило:
# 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 --color 'IP SPOOF' /var/log/messages
13. Записать событие и сбросить (с ограничением на количество записей).
 Чтобы не переполнить раздел / раздутым журналом, ограничим количество записей с помощью -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
14. Сбрасывать или разрешить трафик с определенных 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
15. Разрешить или запретить 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

 Разрешить для определенных сетей / хостов:
# 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
16. Открыть диапазон портов.
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
17. Открыть диапазон адресов.
## разрешить подключение к порту 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
18. Установленные соединения и перезапуск файрволла.
 После перезапуска iptables, сервис сбрасывает все соединения и выгружает модули из системы. Отредактируем /etc/sysconfig/iptables-config и установим значение данной строки в no, чтобы предотвратить это:
IPTABLES_MODULES_UNLOAD = no
19. Закрыть или открыть стандартные порты.
 (Заменить 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 (Apache) 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
20. Ограничить количество параллельных соединений к серверу для одного адреса.
 Для ограничений используется 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 -h

 Чтобы посмотреть помощь по определенным командам и целям:
# iptables -j DROP -h
Проверка правила iptables.
 Проверяем открытость / закрытость портов:
# netstat -tulpn

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

 Если порт 80 не открыт, запустим apache:
# service httpd start

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

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

 Проверяем с помощью telnet
$ telnet www.cyberciti.biz 80

 Вывод:
Trying 75.126.153.206…
Connected to www.cyberciti.biz
Escape character is '^]'.
^]
telnet> quit
Connection closed.


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

Starting Nmap 5.00 ( http://nmap.org ) at 2011-12-13 13:19 IST