Утилита iptables в Unix/Linux
Если вы используете систему linux и нужно настроить безопасность на высоком уровне, то это можно добиться с прогой iptables (для ipv4) , а так же с ip6tables (для ipv6). Тут, в теме я предоставлю 21 пример использования этой службы и вы легко научитесь использовать iptables чтобы хорошо защитить вашу ОС от взлома или проникновения на ваш сервер.
Знак диез «#» говорит нам что команду нужно запускать от рута.
1. Чтобы показать статус, нужно:
# iptables -L -n -v
Ниже приведен пример вывода iptables для не настроенного фаервола:
Вывод будет отличаться если Вы настроите свой брандмауэр под свои нужды, приведу пример уже для настроенного iptables: Рассмотрим где и что применяется:
- -L : — Эта опция нужна для показа списка правил.
- -v : — Этот ключ отобразит дополнительную инфу. Этот ключик покажет интерфейс (его имя), опции, разные TOS маски, отобразит также суффиксы ‘K’, ‘M’ или ‘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 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 -I INPUT 2 -s 132.178.244.134-j DROP
Убедимся, обновилось ли наше правило:
# iptables -L INPUT -n --line-numbers
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 правила
Защита от DDoS с iptables, готовый скрипт
Если есть необходимость быстро и не трудно сделать защиту дома на Ubuntu, то нужно знать, что существует удобная консольная надстройка над iptables- ее название UFW, а к данной программе имеется графическая часть под названием GUFW. На этом я заканчиваю данную статью «Утилита iptables в Unix/Linux», надеюсь что я нормально расписал все.
Добрый день. У меня вот такая проблемка: хочу заблокировать любой трафик от определенного ip в внешний мир, но при этом оставить ему возможность работать с почтовым сервером.
правилами -A OUTPUT -s -p ALL -J DROP и *INPUT* я ему все перекрываю, а вот как дать ему доступ к ip почтового? (оба ip в локалке)
iptables -A INPUT -m state —state NEW -m tcp -p tcp —dport порт_на_котором_находится_почта -j ACCEPT
Спасибо, камрад!
Блокировка по 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
Блокировка по User Agent
iptables -I INPUT -p tcp -m string —algo kmp —string «User-Agent: Bittorrent» -j DROP
Блокировка доступа к хосту по IP адресу.
iptables -I INPUT -p tcp —dport 80 -m string —to 70 —algo bm —string ‘Host: 217.12.203.114’ -j DROP
Блокировка содержимого в POST и COOKIES
iptables -I INPUT -p tcp -m string —algo kmp —string «name=value» -j DROP
Добрый день.
Есть Raspberry Pi на интерфейсе eth0 все прекрасно работает ssh, smb и т.д.
Установил модем Huawei Holink который становится в системе как eth1. Выход в инет есть, но достучаться по ssh или 80 порту невозможно.
Как пофиксить?