# Настройка iptables&#x20;

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

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

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

Существует три типа цепочек iptables — INPUT, FORWARD и OUTPUT.

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

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

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

{% hint style="warning" %}
При настройке правил iptables учитывайте, что для многих портов требуется не только отправить запрос, но и получить на него ответ. Будьте внимательны, чтобы случайно не запретить доступ себе — удаленное подключение по SSH также является входящим соединением.
{% endhint %}

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

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

* Accept — разрешить соединение.
* Drop — игнорировать (блокировать) соединение без сообщения источнику об отказе. Рекомендуется для портов, доступных из интернета, чтобы минимизировать выдачу информации при сканировании.
* Reject — отказать в соединении, сообщив источнику. По умолчанию отправляется ответный пакет типа icmp-port-unreachable, но возможны другие варианты (icmp-host-unreachable и т.д.).

## Настройка правил — общий формат

Общий формат команды:

iptables \[таблица] действие цепочка правило

В документации таблица filter (фильтрация) подразумевается по умолчанию, поэтому её указывать необязательно.

Примеры действий:

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

Основные опции:

* -p — протокол пакета;
* -s — IP-адрес / источник пакета;
* -j — действие (ACCEPT, DROP, REJECT и пр.).

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

Вывести все правила:

{% code title="Просмотр всех правил" %}

```bash
iptables -L
```

{% endcode %}

Более подробный вывод:

{% code title="Подробный вывод" %}

```bash
iptables -L -n -v
```

{% endcode %}

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

{% code title="Правила цепочки INPUT" %}

```bash
iptables -L INPUT
```

{% endcode %}

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

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

Просмотр правил по умолчанию:

{% code title="Просмотр policy" %}

```bash
iptables -L | grep policy
```

{% endcode %}

Установка правила по умолчанию, например, для цепочки FORWARD:

{% code title="Установить policy FORWARD DROP" %}

```bash
iptables -P FORWARD DROP
```

{% endcode %}

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

Добавить правило в конец цепочки:

{% code title="Добавить правило" %}

```bash
iptables -A
```

{% endcode %}

Вставить правило на указанную позицию (например, первое правило в INPUT):

{% code title="Вставить правило в начало INPUT" %}

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

{% endcode %}

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

{% code title="Запрет по IP" %}

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

{% endcode %}

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

{% code title="Запрет по подсети" %}

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

{% endcode %}

Запрет по имени хоста:

{% code title="Запрет по имени хоста" %}

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

{% endcode %}

Запретить все соединения с хостов, отличных от заданного:

{% code title="Разрешить только test.domain.ru" %}

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

{% endcode %}

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

{% code title="Открыть порт 25" %}

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

{% endcode %}

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

{% code title="Закрыть порт 25" %}

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

{% endcode %}

Открыть доступ к портам Apache:

{% code title="Открыть порты 80 и 443" %}

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

{% endcode %}

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

{% code title="Открыть 3306 для 1.2.3.4" %}

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

{% endcode %}

Настройка логирования и разрешение доступа для подсети:

{% code title="Логирование и разрешение" %}

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

{% endcode %}

Защита от распространенных атак:

Запретить "неопознанные" пакеты:

{% code title="DROP INVALID" %}

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

{% endcode %}

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

{% code title="DROP NULL packets" %}

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

{% endcode %}

Защита от syn-flood:

{% code title="Защита от syn-flood" %}

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

{% endcode %}

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

{% code title="Фрагментированные пакеты" %}

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

{% endcode %}

Запретить ping (ICMP echo-request):

{% code title="Запрет ping" %}

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

{% endcode %}

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

{% code title="Разрешить ping с конкретных IP" %}

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

{% endcode %}

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

{% code title="Ограничить число подключений к 80" %}

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

{% endcode %}

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

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

CentOS:

{% code title="Сохранить правила в CentOS" %}

```bash
/sbin/service iptables save
```

{% endcode %}

Debian / Ubuntu — можно использовать утилиту iptables-persistent:

{% code title="Установка iptables-persistent" %}

```bash
apt install iptables-persistent
```

{% endcode %}

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

{% code title="Сохранить правила (netfilter-persistent)" %}

```bash
netfilter-persistent save
```

{% endcode %}

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

Удалить конкретное правило:

{% code title="Удалить правило" %}

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

{% endcode %}

Удаление всех правил:

{% code title="Флеш всех правил" %}

```bash
iptables -F
```

{% endcode %}

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

{% code title="Очистить INPUT" %}

```bash
iptables -F INPUT
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.kimaro.ru/instrukcii-dlya-unix-sistem/nastroika-iptables.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
