Firewall start: различия между версиями
Нет описания правки |
Нет описания правки |
||
(не показаны 24 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
{{Note|Обратите внимание, что это не официальная документация, а попытка начинающего админа объяснить материал начинающим админам.}} | {{Note|Обратите внимание, что это не официальная документация, а попытка начинающего админа объяснить материал начинающим админам.}} | ||
=Сетевой экран Iptables= | =Сетевой экран Iptables= | ||
iptables — это утилита командной строки, используемая для управления встроенным брандмауэром netfilter, доступным в ядре Linux, начиная с версии 2.4. Брандмауэр — это приложение, на котором происходит фильтрация сетевого трафика на основе заданных администратором правил. | iptables — это утилита командной строки, используемая для управления встроенным брандмауэром netfilter, доступным в ядре Linux, начиная с версии 2.4. Брандмауэр — это приложение, на котором происходит фильтрация сетевого трафика на основе заданных администратором правил. | ||
==Схемы== | |||
[[Image:iptables_start1.png|thumb|600px|Логика работы брандмауэра|center]][[Image:iptables_start2.png|thumb|600px|Уровни вложенности|center]] | |||
==Синтаксис Iptables== | |||
# iptables команда таблица цепочка критерии действие | |||
# iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP | |||
*-A - команда | |||
*OUTPUT - цепочка | |||
*-p - критерий | |||
*-j - дейстиве | |||
===Таблицы=== | |||
iptables содержит пять таблиц: | |||
*'''raw''' — используется только для настройки пакетов, поэтому они освобождаются от отслеживания. | |||
*'''filter''' — таблица по умолчанию; в ней сосредоточены все действия, типичные для межсетевых экранов. | |||
*'''nat''' — используется для преобразования сетевых адресов (например, проброс портов). | |||
*'''mangle''' — используется для специальных преобразований пакетов. | |||
*'''security''' — используется в сетевых правилах для Мандатного управления доступом. | |||
Скорее всего, вам потребуются только две из них: '''filter''' и '''nat'''. Остальные таблицы используются в сложных конфигурациях с несколькими маршрутизаторами и выходят за рамки данной статьи. | |||
===Команды=== | |||
{|class="wikitable" style="float:center; margin-left:2em" | |||
!Полный вид || Сокращенный вид || Описание | |||
|- | |||
|—append || -A || добавить правило в конец указанной цепочки | |||
|- | |||
|—check || -C || проверить существующие правила в заданной цепочке | |||
|- | |||
|—delete || -D || удалить правило с указанным номером в заданной цепочке | |||
|- | |||
|—insert || -I || вставить правило с заданным номером, без указания номера — правило будет по умолчанию добавлено первым | |||
|- | |||
|—replace || -R || заменить правило с указанным номером | |||
|- | |||
|—list || -L || вывести список всех действующих правил со всех цепочек, если указать интересующую цепочку — вывод будет сделан только по ней | |||
|- | |||
|—list-rules || -S || построчный вывод всех правил во всех цепочках, если после ключа указать имя цепочки — будут выведены только ее правила | |||
|- | |||
|—flush || -F || удалить все правила, при указании имени цепочки — правила удаляться только в ней | |||
|- | |||
|—zero || -Z || обнулить все счетчики во всех цепочках, при указании цепочки — обнуление произойдет только в ней | |||
|- | |||
|—new || -N || создать пользовательскую цепочку | |||
|- | |||
|—delete-chain || -X || удалить пользовательскую цепочку | |||
|- | |||
|—policy || -P || установить политику по умолчанию для цепочки, обычно это ACCEPT или DROP, она будет применена к пакетам, не попавшим ни под один критерий | |||
|- | |||
|—rename-chain || -E || переименовать цепочку, сначала указывается текущее имя, через пробел — новое | |||
|- | |||
|—help || -h || вывести справочную информацию по синтаксису iptables | |||
|} | |||
===Цепочки (-A)=== | |||
Существует 5 видов цепочек: | |||
*PREROUTING — предназначена для первичной обработки входящих пакетов, адресованных как непосредственно серверу, так и другим узлам сети. Сюда попадает абсолютно весь входящий трафик для дальнейшего анализа. | |||
*INPUT — для входящих пакетов, отправленных непосредственно этому серверу. | |||
*FORWARD — для проходящих пакетов, не адресованных этому компьютеру, предназначены для передачи следующему узлу, в случае, если сервер выполняет роль маршрутизатора. | |||
*OUTPUT — для пакетов, отправленных с этого сервера. | |||
*POSTROUTING — здесь оказываются пакеты, предназначенные для передачи на другие узлы сети. | |||
===Критерии=== | |||
{|class="wikitable" style="float:center; margin-left:2em" | |||
!Полный вид || Сокращенный вид || Поддержка инверсии || Описание | |||
|- | |||
| —protocol || -p || да || указывает протокол, такие как tcp, udp, udplite и другие, поддерживаемые системой, ознакомиться со списком можно в файле /etc/protocols | |||
|- | |||
| —source || -s || да || указывает адрес источника пакета, в качестве значения можно указать как один IP-адрес, так и диапазон | |||
|- | |||
| —destination || -d || да || адрес получателя, синтаксис аналогичен предыдущему пункту | |||
|- | |||
| —match || -m || нет || подключает указанный модуль | |||
|- | |||
| —jump || -j || нет || когда правило подошло — выполнить указанное действие | |||
|- | |||
|—goto || -g || нет || перейти к указанной цепочке правил | |||
|- | |||
|—in-interface || -i || да || задает входящий сетевой интерфейс | |||
|- | |||
|—out-interface || -o || да || указывает исходящий сетевой интерфейс | |||
|- | |||
|—fragment || -f || да || указывает на фрагменты фрагментированных пакетов | |||
|- | |||
|—set-counters || -c || нет || устанавливает начальные значения счетчиков пакетов и байт | |||
|- | |||
|—destination-port || —dport || да || порт получателя пакета | |||
|- | |||
|—source-port || —sport || да || порт отправителя пакета | |||
|} | |||
===Правила (-j)=== | |||
Фильтрация пакетов основана на правилах. Каждое правило состоит из нескольких условий и действия-цели. Если пакет соответствует всем условиям, то к нему применяется указанное действие. Распространённые условия для проверки — на какой интерфейс пришёл пакет (например, eth0 или eth1), какого он типа (ICMP, TCP или UDP) или на какой порт направляется. | |||
*ACCEPT — разрешить дальнейшее прохождение пакета по системе; | |||
*DROP — отбросить пакет без уведомления отправителя; | |||
*LOG — зафиксировать информацию о пакете в файле системного журнала; | |||
*RETURN — прекращение движения пакета по текущей цепочке и возврат в предыдущую цепочку. Если текущая цепочка единственная — к пакету будет применено действие по умолчанию; | |||
*REDIRECT — перенаправляет пакет на указанный порт, в пределах этого же узла, применяется для реализации «прозрачного» прокси; | |||
*DNAT — подменяет адрес получателя в заголовке IP-пакета, основное применение — предоставление доступа к сервисам снаружи, находящимся внутри сети; | |||
*SNAT — служит для преобразования сетевых адресов, применимо, когда за сервером находятся машины, которым необходимо предоставить доступ в Интернет, при этом от провайдера имеется статический IP-адрес;*MASQUERADE — то же, что и SNAT, но главное отличие в том, что может использоваться, когда провайдер предоставляет динамический адрес, создаёт дополнительную нагрузку на систему по сравнению с SNAT; | |||
*TTL — используется для изменения значения поля одноименного заголовка IP-пакета, устанавливает время жизни пакета. | |||
==Команды== | |||
===Общие=== | |||
*Вывод всех активных правил: | |||
# iptables -L | |||
Или | |||
# iptables --line-numbers -L -v -n | |||
===Удаление=== | |||
====Удалить все правила==== | |||
# iptables -F | |||
====Удалить конкретную цепочку==== | |||
# iptables -F INPUT | |||
# iptables -F OUTPUT | |||
# iptables -F FORWARD | |||
====Удалить конкретное правило==== | |||
=====Вариант 1===== | |||
Если Вам нужно удалить конкретное правило из iptables, то сперва следует посмотреть, какие правила уже активны, при помощи команды: | |||
# iptables -S | |||
Пример вывода: | |||
-P INPUT DROP | |||
-P FORWARD ACCEPT | |||
-P OUTPUT ACCEPT | |||
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT | |||
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT | |||
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT | |||
А потом уже удалить конкретную цепочку: | |||
# iptables -D INPUT -p tcp --dport 80 -j ACCEPT | |||
* -D - удалить правило | |||
* -p - протокол | |||
* --dport - порт назначения | |||
* -j - Действие | |||
=====Вариант 2===== | |||
Так же можно сделать так: | |||
# iptables --line-numbers -L -v -n | |||
Выведется таблица: | |||
# iptables --line-numbers -L -v -n | |||
Chain INPUT (policy ACCEPT 55 packets, 6231 bytes) | |||
num pkts bytes target prot opt in out source destination | |||
1 0 0 DROP all -- * * 78.46.123.236 0.0.0.0/0 | |||
2 0 0 DROP all -- * * 8.8.8.8 0.0.0.0/0 | |||
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | |||
num pkts bytes target prot opt in out source destination | |||
Chain OUTPUT (policy ACCEPT 28 packets, 1760 bytes) | |||
num pkts bytes target prot opt in out source destination | |||
1 0 0 DROP all -- * * 8.8.8.8 0.0.0.0/0 | |||
Удалить правило можно следующим способом: | |||
# iptables -D INPUT 1 | |||
Смотрим результат: | |||
# iptables --line-numbers -L -v -n | |||
Chain INPUT (policy ACCEPT 24 packets, 3849 bytes) | |||
num pkts bytes target prot opt in out source destination | |||
1 0 0 DROP all -- * * 8.8.8.8 0.0.0.0/0 | |||
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) | |||
num pkts bytes target prot opt in out source destination | |||
Chain OUTPUT (policy ACCEPT 10 packets, 551 bytes) | |||
num pkts bytes target prot opt in out source destination | |||
1 0 0 DROP all -- * * 8.8.8.8 0.0.0.0/0 | |||
===Сохранение=== | |||
====Записать сохраненные изменения==== | |||
Чтобы сохранить все выполненные настройки, выполните следующую команду: | |||
# iptables-save -f /etc/sysconfig/iptables | |||
====Как сохранять правила==== | |||
Если Вам нужно сохранить правило, воспользуйтесь командой: | |||
# iptables-save > /etc/iptables.rules.v4 | |||
====Как восстанавливать правила==== | |||
Если Вам нужно восстановить правила, то примените команду: | |||
# iptables-restore < /etc/iptables.rules.v4 | |||
{{Внимание|При этом используемые правила удалятся.}} | |||
===Добавление=== | |||
====Запретить принимать трафик (a)==== | |||
# iptables --policy INPUT DROP | |||
{{Note|Здесь вместо INPUT может быть любая [[#Цепочки_(-A)|цепочка]].}} | |||
====Запретить принимать трафик с конкретного IP (b)==== | |||
# iptables -A INPUT -s 172.10.10.1 -j DROP | |||
* -A - добавить новое правило | |||
* -s - адрес-источник | |||
* -j - действие | |||
====Открыть порт (c)==== | |||
=====Открыть входящий порт===== | |||
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT | |||
* -A - добавить новое правило | |||
* -p - протокол | |||
* --dport - порт назначения | |||
* -j - Действие | |||
=====Открыть исходящий порт===== | |||
# iptables -A OUTPUT -p tcp --dport 22 -j DROP | |||
* -A - добавить новое правило | |||
* -p - протокол | |||
* --dport - порт назначения | |||
* -j - действие | |||
===Отмена=== | |||
====Разрешить принимать трафик (a)==== | |||
# iptables --policy INPUT ACCEPT | |||
{{Note|Здесь вместо INPUT может быть любая [[#Цепочки_(-A)|цепочка]].}} | |||
====Разрешить принимать трафик с конкретного IP (b)==== | |||
# iptables -A INPUT -s 172.10.10.1 -j ACCEPT | |||
* -A - добавить новое правило | |||
* -s - адрес-источник | |||
* -j - действие | |||
====Закрыть порт (c)==== | |||
=====Закрыть входящий порт===== | |||
# iptables -A INPUT -p tcp --dport 135 -j DROP | |||
* -A - добавить новое правило | |||
* -p - протокол | |||
* --dport - порт назначения | |||
* -j - действие | |||
=====Закрыть исходящий порт===== | |||
Если Вы хотите заблокировать возможность подключаться по SSH с Вашего сервера к другому хосту или серверу, введите следующую команду: | |||
# iptables -A OUTPUT -p tcp --dport 22 -j DROP | |||
* -A - добавить новое правило | |||
* -p - протокол | |||
* --dport - порт назначения | |||
* -j - действие | |||
=====Блокировка ICMP (ping)===== | |||
Если Вам нужно заблокировать запрос ICMP (ping) от и к Вашему серверу, введите следующие команды: | |||
# iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP | |||
* -A - добавить новое правило | |||
* -p - протокол | |||
*--icmp-type - тип ICMP, а именно ping | |||
* -j - действие | |||
Чтобы заблокировать входящий ping-запрос, введите следующие команды в терминале: | |||
# iptables -I INPUT -p icmp --icmp-type 8 -j DROP | |||
==Источники== | ==Источники== |
Текущая версия от 00:14, 20 марта 2024
Сетевой экран Iptables
iptables — это утилита командной строки, используемая для управления встроенным брандмауэром netfilter, доступным в ядре Linux, начиная с версии 2.4. Брандмауэр — это приложение, на котором происходит фильтрация сетевого трафика на основе заданных администратором правил.
Схемы
Синтаксис Iptables
# iptables команда таблица цепочка критерии действие
# iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
- -A - команда
- OUTPUT - цепочка
- -p - критерий
- -j - дейстиве
Таблицы
iptables содержит пять таблиц:
- raw — используется только для настройки пакетов, поэтому они освобождаются от отслеживания.
- filter — таблица по умолчанию; в ней сосредоточены все действия, типичные для межсетевых экранов.
- nat — используется для преобразования сетевых адресов (например, проброс портов).
- mangle — используется для специальных преобразований пакетов.
- security — используется в сетевых правилах для Мандатного управления доступом.
Скорее всего, вам потребуются только две из них: filter и nat. Остальные таблицы используются в сложных конфигурациях с несколькими маршрутизаторами и выходят за рамки данной статьи.
Команды
Полный вид | Сокращенный вид | Описание |
---|---|---|
—append | -A | добавить правило в конец указанной цепочки |
—check | -C | проверить существующие правила в заданной цепочке |
—delete | -D | удалить правило с указанным номером в заданной цепочке |
—insert | -I | вставить правило с заданным номером, без указания номера — правило будет по умолчанию добавлено первым |
—replace | -R | заменить правило с указанным номером |
—list | -L | вывести список всех действующих правил со всех цепочек, если указать интересующую цепочку — вывод будет сделан только по ней |
—list-rules | -S | построчный вывод всех правил во всех цепочках, если после ключа указать имя цепочки — будут выведены только ее правила |
—flush | -F | удалить все правила, при указании имени цепочки — правила удаляться только в ней |
—zero | -Z | обнулить все счетчики во всех цепочках, при указании цепочки — обнуление произойдет только в ней |
—new | -N | создать пользовательскую цепочку |
—delete-chain | -X | удалить пользовательскую цепочку |
—policy | -P | установить политику по умолчанию для цепочки, обычно это ACCEPT или DROP, она будет применена к пакетам, не попавшим ни под один критерий |
—rename-chain | -E | переименовать цепочку, сначала указывается текущее имя, через пробел — новое |
—help | -h | вывести справочную информацию по синтаксису iptables |
Цепочки (-A)
Существует 5 видов цепочек:
- PREROUTING — предназначена для первичной обработки входящих пакетов, адресованных как непосредственно серверу, так и другим узлам сети. Сюда попадает абсолютно весь входящий трафик для дальнейшего анализа.
- INPUT — для входящих пакетов, отправленных непосредственно этому серверу.
- FORWARD — для проходящих пакетов, не адресованных этому компьютеру, предназначены для передачи следующему узлу, в случае, если сервер выполняет роль маршрутизатора.
- OUTPUT — для пакетов, отправленных с этого сервера.
- POSTROUTING — здесь оказываются пакеты, предназначенные для передачи на другие узлы сети.
Критерии
Полный вид | Сокращенный вид | Поддержка инверсии | Описание |
---|---|---|---|
—protocol | -p | да | указывает протокол, такие как tcp, udp, udplite и другие, поддерживаемые системой, ознакомиться со списком можно в файле /etc/protocols |
—source | -s | да | указывает адрес источника пакета, в качестве значения можно указать как один IP-адрес, так и диапазон |
—destination | -d | да | адрес получателя, синтаксис аналогичен предыдущему пункту |
—match | -m | нет | подключает указанный модуль |
—jump | -j | нет | когда правило подошло — выполнить указанное действие |
—goto | -g | нет | перейти к указанной цепочке правил |
—in-interface | -i | да | задает входящий сетевой интерфейс |
—out-interface | -o | да | указывает исходящий сетевой интерфейс |
—fragment | -f | да | указывает на фрагменты фрагментированных пакетов |
—set-counters | -c | нет | устанавливает начальные значения счетчиков пакетов и байт |
—destination-port | —dport | да | порт получателя пакета |
—source-port | —sport | да | порт отправителя пакета |
Правила (-j)
Фильтрация пакетов основана на правилах. Каждое правило состоит из нескольких условий и действия-цели. Если пакет соответствует всем условиям, то к нему применяется указанное действие. Распространённые условия для проверки — на какой интерфейс пришёл пакет (например, eth0 или eth1), какого он типа (ICMP, TCP или UDP) или на какой порт направляется.
- ACCEPT — разрешить дальнейшее прохождение пакета по системе;
- DROP — отбросить пакет без уведомления отправителя;
- LOG — зафиксировать информацию о пакете в файле системного журнала;
- RETURN — прекращение движения пакета по текущей цепочке и возврат в предыдущую цепочку. Если текущая цепочка единственная — к пакету будет применено действие по умолчанию;
- REDIRECT — перенаправляет пакет на указанный порт, в пределах этого же узла, применяется для реализации «прозрачного» прокси;
- DNAT — подменяет адрес получателя в заголовке IP-пакета, основное применение — предоставление доступа к сервисам снаружи, находящимся внутри сети;
- SNAT — служит для преобразования сетевых адресов, применимо, когда за сервером находятся машины, которым необходимо предоставить доступ в Интернет, при этом от провайдера имеется статический IP-адрес;*MASQUERADE — то же, что и SNAT, но главное отличие в том, что может использоваться, когда провайдер предоставляет динамический адрес, создаёт дополнительную нагрузку на систему по сравнению с SNAT;
- TTL — используется для изменения значения поля одноименного заголовка IP-пакета, устанавливает время жизни пакета.
Команды
Общие
- Вывод всех активных правил:
# iptables -L
Или
# iptables --line-numbers -L -v -n
Удаление
Удалить все правила
# iptables -F
Удалить конкретную цепочку
# iptables -F INPUT # iptables -F OUTPUT # iptables -F FORWARD
Удалить конкретное правило
Вариант 1
Если Вам нужно удалить конкретное правило из iptables, то сперва следует посмотреть, какие правила уже активны, при помощи команды:
# iptables -S
Пример вывода:
-P INPUT DROP -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
А потом уже удалить конкретную цепочку:
# iptables -D INPUT -p tcp --dport 80 -j ACCEPT
- -D - удалить правило
- -p - протокол
- --dport - порт назначения
- -j - Действие
Вариант 2
Так же можно сделать так:
# iptables --line-numbers -L -v -n
Выведется таблица:
# iptables --line-numbers -L -v -n Chain INPUT (policy ACCEPT 55 packets, 6231 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DROP all -- * * 78.46.123.236 0.0.0.0/0 2 0 0 DROP all -- * * 8.8.8.8 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 28 packets, 1760 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DROP all -- * * 8.8.8.8 0.0.0.0/0
Удалить правило можно следующим способом:
# iptables -D INPUT 1
Смотрим результат:
# iptables --line-numbers -L -v -n Chain INPUT (policy ACCEPT 24 packets, 3849 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DROP all -- * * 8.8.8.8 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 10 packets, 551 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DROP all -- * * 8.8.8.8 0.0.0.0/0
Сохранение
Записать сохраненные изменения
Чтобы сохранить все выполненные настройки, выполните следующую команду:
# iptables-save -f /etc/sysconfig/iptables
Как сохранять правила
Если Вам нужно сохранить правило, воспользуйтесь командой:
# iptables-save > /etc/iptables.rules.v4
Как восстанавливать правила
Если Вам нужно восстановить правила, то примените команду:
# iptables-restore < /etc/iptables.rules.v4
Добавление
Запретить принимать трафик (a)
# iptables --policy INPUT DROP
Запретить принимать трафик с конкретного IP (b)
# iptables -A INPUT -s 172.10.10.1 -j DROP
- -A - добавить новое правило
- -s - адрес-источник
- -j - действие
Открыть порт (c)
Открыть входящий порт
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- -A - добавить новое правило
- -p - протокол
- --dport - порт назначения
- -j - Действие
Открыть исходящий порт
# iptables -A OUTPUT -p tcp --dport 22 -j DROP
- -A - добавить новое правило
- -p - протокол
- --dport - порт назначения
- -j - действие
Отмена
Разрешить принимать трафик (a)
# iptables --policy INPUT ACCEPT
Разрешить принимать трафик с конкретного IP (b)
# iptables -A INPUT -s 172.10.10.1 -j ACCEPT
- -A - добавить новое правило
- -s - адрес-источник
- -j - действие
Закрыть порт (c)
Закрыть входящий порт
# iptables -A INPUT -p tcp --dport 135 -j DROP
- -A - добавить новое правило
- -p - протокол
- --dport - порт назначения
- -j - действие
Закрыть исходящий порт
Если Вы хотите заблокировать возможность подключаться по SSH с Вашего сервера к другому хосту или серверу, введите следующую команду:
# iptables -A OUTPUT -p tcp --dport 22 -j DROP
- -A - добавить новое правило
- -p - протокол
- --dport - порт назначения
- -j - действие
Блокировка ICMP (ping)
Если Вам нужно заблокировать запрос ICMP (ping) от и к Вашему серверу, введите следующие команды:
# iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
- -A - добавить новое правило
- -p - протокол
- --icmp-type - тип ICMP, а именно ping
- -j - действие
Чтобы заблокировать входящий ping-запрос, введите следующие команды в терминале:
# iptables -I INPUT -p icmp --icmp-type 8 -j DROP