Утилита iptables в Unix/Linux

:

: 10

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

Знак диез «#» говорит нам что команду  нужно запускать от рута.

1. Чтобы показать статус, нужно:

# iptables -L -n -v

Ниже приведен пример вывода iptables для не настроенного фаервола:

пример использования iptables -L -n -v

Вывод будет отличаться если Вы настроите свой брандмауэр под свои нужды, приведу пример уже для настроенного iptables: пример уже для настроенного iptablesРассмотрим где и что применяется:

  • -L : — Эта опция нужна для показа списка правил.
  • -v : — Этот ключ отобразит дополнительную инфу. Этот ключик покажет интерфейс (его имя), опции, разные TOS маски, отобразит также суффиксы ‘K’, ‘M’ или ‘G’.
  • -n : — Эта опция нужна для отображения IP адреса и  его порта в виде чисел (не беря во внимания DNS сервер для определения имени что собственно ускоряет отображение).

2. Чтобы вывести правила в виде списка, а так же с нумерацией строчек:

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

В итоге у Вас будет примерно это на выводе: Пример вывода iptables -n -L -v --line-numbersИспользуйте нумерацию для строк чтобы прописать новое правила.

3. Чтобы можно было отобразить INPUT, OUTPUT цепочки правил нужно выполнить:

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

4. Чтобы застопать, стартануть или перезапустить файрвол нужно выполнить:

Использовать средства самой ОС:

# service ufw stop
# service ufw start

Остановить/запустить/перезапустить службу:

# 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).

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 198.158.234.134

Как увидеть список IP-шников. Нужно посмотреть слева на нумерацию и я могу удалить строки которые уже присутствуют. Например для номера 4:

# iptables -D INPUT 4

Или поищем IP-шник источника (192.168.244.134) и после чего удалим его из наших правил:

# iptables -D INPUT -s 192.168.244.134 -j DROP

Пояснение по ключу:
-D : служит для удаления 1 или пары правил из цепи.

6. Если Вы хотите прописать новое правило в фаервол, выполните:

Если необходимо добавить одно или парочку правил в одну цепочку, то для начала выведем список с нумерацией строк:

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

пример использования iptables -L INPUT -n --line-numbers

Допустим Вам нужно вставить правило между первой и второй строкой, то нужно выполнить:

# iptables -I INPUT 2 -s 132.178.244.134-j DROP

Убедимся, обновилось ли наше правило:

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

пример вывода когда мы вставили наше правило между 1 и 2 строкой

7. Что бы сохранить правило (а) в фаерволе нужно.

Можно это сделать с помощью следующей команды:

# iptables-save > /etc/iptables.rules

8. Чтобы восстановить правило (а) в фаерволе нужно.

Можно это сделать  с помощью следующей команды:

# service iptables save

Если необходимо, можно сохранить все правила в файл:

# iptables-save > /etc/iptables.rules

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

# iptables-restore < /etc/iptables.rules

9. Чтобы вернуть как все и было (Установить все как было по дефолту).

Чтобы вернуть как было весь трафик нужно выполнить:

# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n

После того как вы выполните команды что выше, то ни 1 из пакетов не покинет прописанный хост.

# ping linux-notes.org

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 linux-notes.org

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

# iptables -A INPUT -i eth1 -s 192.168.244.0/24 -j DROP
# iptables -A INPUT -i eth1 -s 11.11.11.0/8 -j DROP

Список айпишников  для всей изолированной сети ( изолированных сетей):

11.11.11.0/8 -j (A)
172.16.15.0/12 (B)
192.168.244.0/16 (C)
225.0.0.0/4 (MULTICAST D)
144.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)

12. Чтобы заблокировать определенный IP адрес нужно:

# iptables -A INPUT -s 192.168.244.144 -j DROP
# iptables -A INPUT -s 192.168.0.0/24 -j DROP

192.168.244.144 — Это айпишник надоедливого человека, допустим мы его захотели забанить.

13. Как сделать блокировку входящего запроса с порта?

Если вам нужно например сделать блокировку всех входящих запросов с порта 80, то выполните:

# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

Чтобы сделать блокировку запроса на порту 80 с ИП-адреса 192.168.244.144 нужно:

# iptables -A INPUT -p tcp -s 192.168.244.144 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

14.  Как заблокировать запросы на исходящий айпишник?

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

# host -t a linux-notes.org

Вывод: linux-notes.org has address 65.178.248.45

Найдем CIDR для 65.178.248.45:

# whois 65.178.248.45 | grep CIDR

Вывод: CIDR: 65.178.2145.0/18

Сделаем блокировку на 65.178.2145.0/18:

# iptables -A OUTPUT -p tcp -d 65.178.2145.0/18 -j DROP

Можно кат же заблокировать сам домен:

# iptables -A OUTPUT -p tcp -d www.linux-notes.org -j DROP
# iptables -A OUTPUT -p tcp -d linux-notes.org -j DROP

15. Как записать события или сбросить их?

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

# iptables -A INPUT -i eth1 -s 11.11.11.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 11.11.11.0/8 -j DROP

Посмотрим лог (по умолчанию /var/log/messages):

# tail -f /var/log/messages
# grep -i --color 'IP SPOOF' /var/log/messages

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

Чтобы не заполнить какой то раздел большим журналом, можно сделать ограничение на количество записей с использованием опции «-m». Например, чтобы записывать каждые 4 минуты и  максимум 6 строк выполните:

# iptables -A INPUT -i eth1 -s 10.10.10.0/8 -m limit --limit 4/m --limit-burst 6 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.10.10.0/8 -j DROP

16. Как сбросить или разрешить прохождения трафика с некоторого мак-адреса?

# iptables -A INPUT -m mac --mac-source AA:0F:EA:81:03:18 -j DROP

Чтобы разрешить только для TCP по порту 8080 с некоторого мак-адреса, допустим с AA:0F:EA:81:03:19 выполните:

# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source AA:0F:EA:81:03:19 -j ACCEPT

17. Как разрешить или запретить запросы 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.244.0/25 -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. Как можно открыть диапазон определенных портов?

Сделать это можно очень просто, стоит указать в каких пределах можно открыть порты, в данном примере я открою с 666-6666:

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 666:6666 -j ACCEPT

19. Как можно открыть диапазон определенных ИП адресов?

Например нужно разрешить подключение Apache по порту 80  если адреса в диапазоне от 192.168.244.66 до 192.168.244.244, а сделать это можно следующим образом:

# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.244.66-192.168.244.244 -j ACCEPT

Приведу пример еще и для nat-а:

# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.244.22-192.168.244.24

20. Покажу как можно открыть или закрыть стандартные порты.

Делается это следующим образом, нужно заменить ACCEPT на DROP, чтобы заблокировать какой то порт. Для службы ssh tcp по порту 22:

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -s 132.148.244.0/26 -m state --state NEW -p tcp --dport 22 -j ACCEPT

Для службы cups (printing service) или udp/tcp по порту 631 в локальной сети:

# iptables -A INPUT -s 132.168.244.0/26 -p udp -m udp --dport 631 -j ACCEPT
# iptables -A INPUT -s 132.168.244.0/26 -p tcp -m tcp --dport 631 -j ACCEPT

Синхронизация времени (time sync) через службу NTP в локальной сети (udp по порту 123):

# iptables -A INPUT -s 132.168.244.0/26 -m state --state NEW -p udp --dport 123 -j ACCEPT

Для службы tcp по порту 25 (smtp):

# iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

Для службы  dns server-а по порту 53:

# 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 по порту 80 и 443:

# 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 по порту 110 (pop3):

# iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT

Для tcp по порту 143 (imap):

# iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

Для службы  Samba file server в локальной сети по портам: 137, 138, 139, 445:

# iptables -A INPUT -s 132.168.244.0/26 -m state --state NEW -p tcp --dport 137 -j ACCEPT
# iptables -A INPUT -s 132.168.244.0/26 -m state --state NEW -p tcp --dport 138 -j ACCEPT
# iptables -A INPUT -s 132.168.244.0/26 -m state --state NEW -p tcp --dport 139 -j ACCEPT
# iptables -A INPUT -s 132.168.244.0/26 -m state --state NEW -p tcp --dport 445 -j ACCEPT

Для  proxy server-а в локальной сети по порту 3128:

# iptables -A INPUT -s 132.168.244.0/26 -m state --state NEW -p tcp --dport 3128 -j ACCEPT

Для mysql server-а  для локальной сети по порту 3306:

# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

21. Если нужно как то ограничить количество одновременных соединений на сервер для конкретного ИП-адреса.

Если это нужно сделать, то нам нужно использовать connlimit модуль. для того чтобы разрешить только 4 ssh соединения для одного клиента выполните:

# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 4 -j REJECT

Если нужно установить количество запросов для HTTP например до 23 с маской 24:

# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 23 --connlimit-mask 24 -j DROP

Пояснения по ключикам:
—connlimit-above 23 : Говорит, что данное правило выполняется когда количество соединений больше 23.
—connlimit-mask 24 : Говорит какую маску нужно использовать, у меня это 24.

22. Перенаправление трафика с одного порта на другой

Синтаксис:

# iptables -t nat -A PREROUTING -i $interfaceName -p tcp --dport $srcPortNumber -j REDIRECT --to-port $dstPortNumber

Например, для перенаправления всего входящего трафика с 80-го порта на порт 8080, выполните:

# iptables -t nat -I PREROUTING --src 0/0 --dst 192.168.1.5 -p tcp --dport 80 -j REDIRECT --to-ports 8080

23. Как сбросить счетчики пакетов?

Чтобы увидеть счетчики iptables, выполните:

# iptables -L -n -v

Чтобы очистить / сбросить счетчики для всех правил:

# iptables -Z

Для сброса счетчиков только для цепочки INPUT:

# iptables -Z INPUT

Чтобы сбросить счетчики только для правила №4 в цепочке INPUT:

# iptables -Z INPUT 4

Как получить помощь по iptables?

Чтобы найти помощь по iptables,используйте мануал (man):

# man iptables

Если нужно просмотреть только по конкретным командам и целям, используйте:

# iptables -j DROP -h

Чтобы выполнить проверку правил iptables на открытые и закрытые порты:

# netstat -tulpn

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

# netstat -tulpn | grep :80

Посмотрим разрешает ли соединение с 80 портом в iptables:

# iptables -L INPUT -v -n | grep 80

Или можно его открыть для всех:

# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

Так же можно это проверить и с использованием телнет (telnet):

# telnet linux-notes.org 80

Можете заюзать nmap для такой же проверки:

# nmap -sS -p 80 linux-notes.org

Iptables очень хороший инструмент для сисадмина.

Вот еще полезное чтиво:

Открыть порт ssh по стуку с IPtables в Unix/Linux

Добавить Iptables правила с CSF

Открытие портов в IPtables для почты на Linux

Фильтрация MAC используя Iptables в Linux

Безопасность в WordPress с IPtables

Сохранить/Восстановить правила IPtables в Unix/Linux

Настройка IPtables для web сервера на Unix/Linux

сбросить или удалить все Iptables правила

Удалить iptables правило

Защита от DDoS с iptables, готовый скрипт

Если есть необходимость быстро и не трудно сделать защиту дома на Ubuntu, то нужно знать, что существует удобная консольная надстройка над iptables- ее название UFW, а к данной программе имеется графическая часть под названием GUFW. На этом я заканчиваю данную статью «Утилита iptables в Unix/Linux», надеюсь что я нормально расписал все.