Firewall start: различия между версиями

Материал из ALT Linux Wiki
(Новая страница: «{{stub}} {{Note|Обратите внимание, что это не официальная документация, а попытка начинающего админа объяснить материал начинающим админам.}} =Сетевой экран Iptables= {{Category navigation|title=Начинающему системному администратору|category=Начинающему системному администрат...»)
 
Нет описания правки
 
(не показано 25 промежуточных версий этого же участника)
Строка 1: Строка 1:
{{stub}}
{{Note|Обратите внимание, что это не официальная документация, а попытка начинающего админа объяснить материал начинающим админам.}}
{{Note|Обратите внимание, что это не официальная документация, а попытка начинающего админа объяснить материал начинающим админам.}}
=Сетевой экран Iptables=
=Сетевой экран Iptables=
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
==Источники==
*[https://selectel.ru/blog/setup-iptables-linux/ selectel.ru]
*[https://blog.sedicomm.com/2016/12/16/iptables-ustanovka-i-nastrojka/ blog.sedicomm.com]


{{Category navigation|title=Начинающему системному администратору|category=Начинающему системному администратору|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Начинающему системному администратору|category=Начинающему системному администратору|sortkey={{SUBPAGENAME}}}}

Текущая версия от 21:14, 19 марта 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
Примечание: Здесь вместо INPUT может быть любая цепочка.

Запретить принимать трафик с конкретного 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
Примечание: Здесь вместо INPUT может быть любая цепочка.

Разрешить принимать трафик с конкретного 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

Источники