---
title: "Настройка iptables на Linux-серверах"
description: "Настройка iptables на Linux-серверах. Документация и инструкции по использованию и настройке облачных серверов Timeweb Cloud."
---

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

Iptables — это межсетевой экран для операционных систем Linux, который позволяет управлять прохождением трафика. При попытке установке соединения с сервером (или при отправке запроса с сервера) Iptables проверяет цепочку правил для конкретного соединения и выполняет заданную настройку. 

Iptables предустановлен во всех современных дистрибутивах Linux.

## Типы цепочек

Существует три типа цепочек iptables — input, forward и output.

-   **INPUT** —  эта цепочка используется для обработки входящих соединений. 
-   **OUTPUT** — используется для исходящих соединений.
-   **FORWARD** — используется для обработки транзитного трафика, например, в случае маршрутизатора. Если вы не занимаетесь настройкой маршрутизации, то правила этого типа вам не потребуются.

Цепочка — это упорядоченная последовательность правил. Правило содержит в себе критерий (например, IP-адрес источника пакета) и действие, которое нужно применить к пакету с этим критерием (например, «заблокировать»). Если критерий отсутствует, правило применяется ко всем пакетам.

При определении, что нужно сделать с пакетом, iptables просматривает соответствующую цепочку с начала списка, перебирая правила, пока не найдет совпадение. Если совпадение не найдено (соединение не попадает ни под одно созданное правило), применяется правило по умолчанию. 

При настройке правил iptables помните, что для многих портов при передаче данных требуется не только отправить запрос, но и получить на него ответ. Также будьте внимательны, чтобы случайно не запретить доступ для себя — удаленное подключение к серверу по SSH тоже является входящим соединением.

## Действия с соединениями

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

**Accept** — разрешить соединение.

**Drop** — игнорировать (блокировать) соединение без сообщения источнику об отказе. Это рекомендуемый вариант для обработки трафика на портах, подключенных к интернету, так как в этом случае злоумышленники получают минимум информации при сканировании портов.

**Reject** — отказать в соединении, сообщив источнику запроса об отказе. По умолчанию отправляется ответный пакет «icmp-port-unreachable», но также возможна дополнительная настройка сообщения (например, «icmp-host-unreachable», «icmp-net-prohibited», «icmp-host-prohibited» и др.). 

## Настройка правил

В рамках данной статьи общий формат для настройки правил будет следующим:

```shell
iptables действие цепочка правило
```

В нем пропущено указание _таблицы_ (она должна следовать сразу после _iptables_), так как мы рассматриваем настройки для основной таблицы фильтрации **filter**, которая подразумевается в командах iptables по умолчанию. Указывать ее дополнительно необязательно. 

_Действие_ в данном случае — это действие, которое необходимо выполнить с правилом (например, добавить его или удалить). 

Примеры доступных действий в iptables:

-   \-A — добавить правило в цепочку;
-   \-I — добавить правило в  цепочку, указав номер;
-   \-D — удалить правило;
-   \-F — удалить все правила;
-   \-L — вывести все правила в текущей цепочке;
-   \-P — установить действие по умолчанию.

Дополнительные опции:

-   \-p — указать протокол пакета;
-   \-s — указать IP-адрес / источник пакета;
-   \-j — указать, что нужно сделать с пакетом (разрешить / заблокировать и пр.).

### **Просмотр существующих правил**

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

```shell
iptables -L
```

Либо:

```shell
iptables -L -n -v
```

Также можно вывести правила для конкретной цепочки, например:

```shell
iptables -L INPUT
```

### **Правила по умолчанию**

В случае, если ни одно из созданных правил не подходит для определенного пакета, к нему будет применено правило по умолчанию. 

Просмотреть правила по умолчанию можно командой:

```shell
iptables -L | grep policy
```

Если вы не вносили изменений в policy, то изначально для всех цепочек будут установлены разрешающие правила по умолчанию.

![Putty Q Ckhask2v Q](https://content.timeweb.com/assets/d91f7faf-f820-4187-b003-bbb96b2926d7?width=402&height=64)

Установить правило по умолчанию можно с помощью опции -P, например:

```shell
iptables -P FORWARD DROP
```

### **Примеры настроек**

Добавить правило к существующей цепочке можно командой:

```shell
iptables -A
```

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

```shell
iptables -I цепочка номер правило
```

Например, это правило будет указано первым в цепочке INPUT:

```shell
iptables -I INPUT 1 --dport 80 -j ACCEPT
```

Запретить все входящие соединения с конкретного IP:

```shell
iptables -A INPUT -s 1.2.3.4 -j DROP
```

Запретить соединения из подсети:

```shell
iptables -A INPUT -s 1.2.3.4/24 -j DROP
```

В качестве источника может быть указан как IP-адрес, и хост. Например, так можно запретить все соединения с test.domain.ru:

```shell
iptables -A INPUT -s test.domain.ru -j DROP
```

Запретить все соединения с хостов, отличных от test.domain.ru:

```shell
iptables -A INPUT ! -s test.domain.ru -j DROP
```

Открыть доступ к порту 25 (SMTP) для всех:

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

Закрыть для всех (требуется просто заменить ACCEPT на DROP):

```shell
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j DROP
```

Открыть доступ к портам Apache для всех:

```shell
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
```

Открыть доступ к порту 3306 для конкретного IP:

```shell
iptables -A INPUT -s 1.2.3.4 -p tcp -m tcp --dport 3306 -j ACCEPT
```

Настройка логирования:

```shell
iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j LOG --log-level INFO --log-prefix "New connection from 1.2.3.4/24:" 
iptables -A INPUT -s 1.2.3.4/24 -m multiport --dports 22,8080,139,445 -j ACCEPT
```

При такой настройке при каждом новом соединении к серверу из подсети 1.2.3.4/24 в журнал будет добавляться соответствующая запись.

Для защиты от распространенных атак можно добавить такие настройки:

Запретить все «неопознанные» пакеты:

```shell
iptables -A INPUT -m state --state INVALID -j DROP
```

Запретить нулевые пакеты:

```shell
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
```

Защититься от атак типа syn-flood:

```shell
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP 
iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
```

Запретить фрагментированные пакеты для защиты от ping flood:

```shell
iptables -A INPUT -p icmp --fragment -j LOG --log-prefix "ping flooding" 
iptables -A INPUT -p icmp --fragment -j DROP
```

Запретить ping:

```shell
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP 
iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j DROP
```

Разрешить ping с определенных адресов:

```shell
iptables -A INPUT -s 1.2.3.4 -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -s 1.22.33.44 -p icmp --icmp-type echo-request -j ACCEPT
```

Установить лимит подключений (connlimit), равный 5, для 80 порта:

```shell
iptables -A INPUT -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 5 --connlimit-mask 32 -j DROP
```

### **Сохранение изменений**

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

CentOS:

```shell
/sbin/service iptables save
```

Для сохранения правил в Debian / Ubuntu можно использовать утилиту `iptables-persistent`. Установить ее можно командой:

```
apt install iptables-persistent
```

В процессе установки система запросит, необходимо ли сохранить существующие правила — нажмите «Да».

В дальнейшем, если вы внесете изменения в правила iptables, их можно будет сохранить командой:

```shell
netfilter-persistent save
```

### **Удаление правил**

Удалить конкретное правило можно с помощью опции -D, например:

```shell
iptables -D INPUT -s 1.2.3.4 -j DROP
```

Удаление **всех** правил выполняется командой:

```shell
iptables -F
```

Удаление правил для определенной цепочки:

```shell
iptables -F INPUT
```
