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

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

Если вы используете систему 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», надеюсь что я нормально расписал все.

8 thoughts on “Утилита iptables в Unix/Linux

  1. Добрый день. У меня вот такая проблемка: хочу заблокировать любой трафик от определенного ip в внешний мир, но при этом оставить ему возможность работать с почтовым сервером.
    правилами -A OUTPUT -s -p ALL -J DROP и *INPUT* я ему все перекрываю, а вот как дать ему доступ к ip почтового? (оба ip в локалке)

  2. Блокировка по REQUEST_URI
    iptables -I INPUT -p tcp -m string —to 70 —algo bm —string ‘GET /announce?info_hash=’ -j DROP

    Блокировка по User Agent
    iptables -I INPUT -p tcp -m string —algo kmp —string «Bittorrent» -j DROP

  3. Блокировка доступа к хосту по IP адресу.
    iptables -I INPUT -p tcp —dport 80 -m string —to 70 —algo bm —string ‘Host: 217.12.203.114’ -j DROP

  4. Блокировка содержимого в POST и COOKIES
    iptables -I INPUT -p tcp -m string —algo kmp —string «name=value» -j DROP

  5. Добрый день.
    Есть Raspberry Pi на интерфейсе eth0 все прекрасно работает ssh, smb и т.д.
    Установил модем Huawei Holink который становится в системе как eth1. Выход в инет есть, но достучаться по ssh или 80 порту невозможно.
    Как пофиксить?

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.