# Iptables

#### **Инфо:**  


Iptables - это инструмент для управления файрволом в операционной системе Linux. Он позволяет настраивать правила безопасности и контролировать трафик сети.

В Ubuntu iptables является утилитой уровня ядра и доступен по умолчанию. В Ubuntu 22 (и других версиях Ubuntu) установка iptables не требуется, так как она уже включена в ядро Linux и доступна изначально.

Iptables предоставляет мощные возможности фильтрации и маршрутизации пакетов в Linux. Он работает на уровне ядра и используется для настройки правил файрвола и сетевых политик.


#### **Применение:**

##### 1. Просмотр текущих правил:

```
iptables -L
```

Пример вывода:

```
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
DROP       tcp  --  anywhere             anywhere             tcp dpt:http

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  
```

```
Цепочки (Chain):
Chain INPUT: Цепочка, которая обрабатывает входящий трафик (пакеты, направленные к системе).
Chain FORWARD: Цепочка, которая обрабатывает пересылаемый трафик (пакеты, которые должны быть переданы через систему).
Chain OUTPUT: Цепочка, которая обрабатывает исходящий трафик (пакеты, отправляемые системой).

Столбцы для каждой цепочки:
target: Цель, то есть действие, которое будет выполнено с пакетом, если он соответствует правилу.
prot: Протокол, к которому относится правило (например, TCP, UDP).
opt: Опции, связанные с протоколом или действием.
source: Исходный адрес или сеть, откуда ожидается входящий трафик.
destination: Целевой адрес или порт, куда направляется трафик.

Из примера. В цепочке INPUT есть два правила:
Первое правило разрешает входящий TCP-трафик на порт SSH (22) с любого источника.
Второе правило блокирует входящий TCP-трафик на порт HTTP (80) с любого источника.
Цепочка FORWARD не содержит правил.
Цепочка OUTPUT не содержит правил.
```

В iptables есть несколько возможных состояний для параметра `target` в правилах. Некоторые из наиболее распространенных состояний `target` включают:

1. `ACCEPT`: Пакет будет принят и разрешен.
2. `DROP`: Пакет будет отброшен и удален, без отправки какого-либо уведомления отправителю.
3. `REJECT`: Пакет будет отброшен и отправлено уведомление отправителю о том, что пакет был отклонен.
4. `LOG`: Пакет будет принят, но информация о пакете будет записана в системный журнал или файл журнала для целей мониторинга и отладки.
5. `DNAT`: Изменение адреса назначения (Destination NAT) позволяет перенаправить пакеты на другой адрес и/или порт.
6. `SNAT`: Изменение адреса источника (Source NAT) позволяет заменить исходный адрес пакета на другой адрес и/или порт.
7. `MASQUERADE`: Вид NAT, который заменяет исходный адрес источника на адрес интерфейса, через который пакет покидает систему.
8. `REDIRECT`: Перенаправление пакетов на локальный порт или сокет.
9. `MARK`: Пометка пакетов для дальнейшей обработки другими инструментами или правилами.

Каждое состояние `target` в iptables выполняет определенное действие с пакетом, определенным правилом. Выбор подходящего состояния `target` зависит от ваших потребностей и требований конкретной ситуации.


##### 2. Очистка существующих правил:  


```
iptables -F
```

##### 3. Закрыть \\ открыть доступа к порту:

```
iptables -A INPUT -p tcp --dport <порт> -j DROP
iptables -A INPUT -p tcp --dport <порт> -j ACCEPT
```

##### 4. Разрешение доступа только для определенных IP-адресов (вайтлист):

```
iptables -A INPUT -p tcp --dport <порт> -s <IP-адрес> -j ACCEPT
```

Пример:

```
iptables -A INPUT -p tcp --dport 51821 -s 192.168.1.100 -j ACCEPT
```

Команда добавляет правило в цепочку INPUT, которая разрешает входящий TCP-трафик на порт 51821 только от указанного IP-адреса.

##### 5. Сохранение и загрузка правил iptables:

```
iptables-save > /etc/iptables/rules.v4 #записать изменения в файл
iptables-restore < /etc/iptables/rules.v4 #загрузить правила в iptables
```



#### **Дополнительно:**

Чтобы правила iptables из файла `/etc/iptables/rules.v4` автоматически применялись при загрузке системы, можно использовать инструменты настройки системы для запуска команды `iptables-restore` при старте.  
  
Например можно настроить службу `netfilter-persistent` или через `systemd`.  
  
**Настройка `netfilter-persistent`:**

```
apt install netfilter-persistent
netfilter-persistent reload #применить правила iptables без перезагрузки системы
```

Автозагрузка netfilter-persistent при старте системы:

```
systemctl enable netfilter-persistent
```

**Настройка через `systemd`:**

```
vim /etc/systemd/system/iptables.service
```

Добавить в файл службы текст:

```
[Unit]
Description=Load iptables rules
After=network.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4

[Install]
WantedBy=multi-user.target
```

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

```
sudo systemctl daemon-reload
sudo systemctl enable iptables.service
```

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

```
systemctl start iptables.service
```

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

```
iptables -L INPUT --line-numbers
```

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

```
iptables -D INPUT <номер>
```