mod
parent
3ba1ffcd48
commit
d651e1d6af
222
iptables.md
222
iptables.md
|
@ -1,5 +1,20 @@
|
|||
# iptables
|
||||
|
||||
- [iptables](#iptables)
|
||||
- [Таблицы](#таблицы)
|
||||
- [Цепочки](#цепочки)
|
||||
- [Правила - условия и действия](#правила---условия-и-действия)
|
||||
- [Просмотр](#просмотр)
|
||||
- [Управление правилами и цепочками](#управление-правилами-и-цепочками)
|
||||
- [Примеры](#примеры)
|
||||
- [Пример первоначальной настройки](#пример-первоначальной-настройки)
|
||||
- [Сброс всех правил цепочки filter](#сброс-всех-правил-цепочки-filter)
|
||||
- [Отладка](#отладка)
|
||||
- [Логирование отклоненных пакетов journald](#логирование-отклоненных-пакетов-journald)
|
||||
- [Логирование отклоненных пакетов Rsyslog](#логирование-отклоненных-пакетов-rsyslog)
|
||||
|
||||
***
|
||||
|
||||
## Таблицы
|
||||
|
||||
- `filter` - основная таблица для фильтрации пакетов, используется по умолчанию;
|
||||
|
@ -54,6 +69,9 @@
|
|||
- `--ttl-eq N` - TTL пакета равен N;
|
||||
- `--ttl-lt N` - TTL пакета меньше N;
|
||||
- `--ttl-gt N` - TTL пакета больше N
|
||||
- `-m multiport` - указать в правиле несколько портов, диапазон или набор:
|
||||
- `-m multiport --dports 8080,22,80` - применяется к указанным портам;
|
||||
- `-m multiport --dports 1024:65535` - применяется к диапазону портов
|
||||
|
||||
Действия:
|
||||
|
||||
|
@ -64,7 +82,7 @@
|
|||
- `--reject-with` - тип ответа, RFC 793 или `iptables -j REJECT -h`
|
||||
- `RETURN` - возврат пакета в вышестоящую цепочку для применения действия по умолчанию, при отсутствии вышестоящей цепочки применится действие по умолчанию
|
||||
|
||||
## Примеры
|
||||
## Просмотр
|
||||
|
||||
- Просмотр текущих правил
|
||||
|
||||
|
@ -72,10 +90,212 @@
|
|||
iptables -L
|
||||
```
|
||||
|
||||
только для конкретной цепочки
|
||||
|
||||
```bash
|
||||
iptables -L INPUT
|
||||
```
|
||||
|
||||
более наглядно
|
||||
|
||||
```bash
|
||||
iptables -vnL --line-numbers
|
||||
```
|
||||
|
||||
- Список текущих правил
|
||||
|
||||
```bash
|
||||
iptables -S
|
||||
```
|
||||
|
||||
- Очистка правил
|
||||
|
||||
```bash
|
||||
iptables -F
|
||||
```
|
||||
|
||||
очистка правил конкретной цепочки
|
||||
|
||||
```bash
|
||||
iptables -F INPUT
|
||||
```
|
||||
|
||||
**Стоит иметь ввиду, что очистка правил не изменяет правило по-умолчанию, если оно установлено в DROP, после очистки всех правил можно потерять доступ к узлу.**
|
||||
|
||||
- Для полной очистки правил и отключения фильтрации
|
||||
|
||||
```bash
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -F
|
||||
```
|
||||
|
||||
## Управление правилами и цепочками
|
||||
|
||||
Добавить правило (разрешить весь трафик с tun интерфейсов) в конец цепочки INPUT (-A, --append):
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -i tun+ -j ACCEPT
|
||||
```
|
||||
|
||||
Вставить правило в позицию 2 цепочки INPUT (-I, --insert):
|
||||
|
||||
```bash
|
||||
iptables -I INPUT 2 -i lo -j ACCEPT
|
||||
```
|
||||
|
||||
Установить политику по умолчанию DROP для цепочки INPUT (-P, --policy):
|
||||
|
||||
```bash
|
||||
iptables -P INPUT DROP
|
||||
```
|
||||
|
||||
Создание новой цепочки правил:
|
||||
|
||||
```bash
|
||||
iptables -N LOGGING
|
||||
```
|
||||
|
||||
## Примеры
|
||||
|
||||
Предположим что для цепочки `INPUT` политика по умолчанию `DROP`, это значит что все входящие пакеты будут отброшены, но нам нужен некоторый входящий трафик.
|
||||
|
||||
Разрешим трафик на локальный DNS сервер, без этого могут быть долгие подключения по ssh:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
|
||||
```
|
||||
|
||||
Разрешим движение трафика из интерфейсов создаваемых Docker (при политиках по умолчанию `DROP`, контейнеры не смогут общаться с другими интерфейсами):
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -i br+ -j ACCEPT
|
||||
```
|
||||
|
||||
Разрешим любой входящий трафик из `localhost` и откроем `http/https` порты (80/443), например для случая когда у нас есть веб-сервер и наши сайты должны быть доступны снаружи:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -i lo -j ACCEPT
|
||||
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
|
||||
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
|
||||
```
|
||||
|
||||
*Если не разрешить входящий трафик от `localhost` то могут быть странные задержки с ответами, а при дебаге можно увидеть отклоенные пакеты от 127.0.0.1*
|
||||
|
||||
Теперь локальный DNS на 53 порту доступен, docker контейнеры тоже, с localhost трафик разрешен, и для внешнего мира открыты 80 и 443 порты для наших сайтов. Но это все только для установления соединения и рукопожатия. Теперь нам нужно разрешить все установленные и связанные с ними соединения чтобы трафик действительно пошел (еще вот):
|
||||
|
||||
```bash
|
||||
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
```
|
||||
|
||||
### Пример первоначальной настройки
|
||||
|
||||
```bash
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -F
|
||||
|
||||
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m multiport --dports 8080,22,80 -j ACCEPT
|
||||
iptables -A INPUT -p udp --dport 69 -j ACCEPT
|
||||
iptables -A INPUT -p tcp --dport 5000:5678 -j ACCEPT
|
||||
|
||||
iptables -P INPUT DROP
|
||||
|
||||
iptables --line-numbers -L -v -n
|
||||
```
|
||||
|
||||
### Сброс всех правил цепочки filter
|
||||
|
||||
```bash
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -F
|
||||
```
|
||||
|
||||
## Отладка
|
||||
|
||||
### Логирование отклоненных пакетов journald
|
||||
|
||||
Работа iptables происходит на уровне ядра ОС, соответственно все события логируются также на уровне ядра.
|
||||
|
||||
Добавляем правило логирования каждого пакета с префиксом:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -j LOG --log-level info --log-prefix "IPTABLES-DROP: "
|
||||
```
|
||||
|
||||
Вывод сообщений ядра
|
||||
|
||||
```bash
|
||||
journalctl -k
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
```bash
|
||||
journalctl -k -f
|
||||
```
|
||||
|
||||
### Логирование отклоненных пакетов Rsyslog
|
||||
|
||||
*Полезно иметь возможно отладить свои правила, экономия времени и iptables становится понятнее.*
|
||||
|
||||
Суть отладки правил iptables такова:
|
||||
|
||||
создаем отдельную цепочку, куда будем перенаправлять весь трафик, который должен быть отклонен в новой цепочке ведем логирование и отклоняем пакеты
|
||||
направляем запросы для теста правил и смотрим лог отклоенных пакетов
|
||||
|
||||
Создание новой цепочки:
|
||||
|
||||
```bash
|
||||
iptables -N LOGGING
|
||||
```
|
||||
|
||||
Добавляем правило логирования каждого пакета с префиксом:
|
||||
|
||||
```bash
|
||||
iptables -A LOGGING -j LOG --log-prefix "ipt denied: "
|
||||
```
|
||||
|
||||
Отклоняем пакет:
|
||||
|
||||
```bash
|
||||
iptables -A LOGGING -j DROP
|
||||
```
|
||||
|
||||
В цепочку, откуда будут приходить пакеты для отклонения добавляем новое правило перенаправления в новую цепочку логирования:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -j LOGGING
|
||||
```
|
||||
|
||||
Теперь добавим конфиг rsyslog:
|
||||
|
||||
```bash
|
||||
nano /etc/rsyslog.d/10-iptables.conf
|
||||
```
|
||||
|
||||
Вставим следующий текст:
|
||||
|
||||
```bash
|
||||
:msg, contains, "ipt denied: " -/var/log/iptables.log
|
||||
& ~
|
||||
```
|
||||
|
||||
Сохраним и перезагрузим демона rsyslog:
|
||||
|
||||
```bash
|
||||
service rsyslog restart
|
||||
```
|
||||
|
||||
Теперь откроем файл и будем следить за 20 последних строк:
|
||||
|
||||
```bash
|
||||
echo > /var/log/iptables.log
|
||||
tail -f -n 20 /var/log/iptables.log
|
||||
```
|
||||
|
||||
|
|
Loading…
Reference in New Issue