21 пример использования iptables для администраторов. В статье рассмотрены наиболее распространенные примеры.
Примерный вывод команды для не активного файрвола:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) |
Примерный вывод команды для активного файрвола:
Chain INPUT (policy DROP 0 packets, 0 bytes) |
Где:-L
: Показать список правил;-v
: Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы ‘K’, ‘M’ or ‘G’;-n
: Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).
Отобразить список правил с номерами строк
iptables -n -L -v --line-numbers |
Примерный вывод:
Chain INPUT (policy DROP) |
Вы можете использовать номера строк для того, чтобы добавлять новые правила.
Отобразить INPUT или OUTPUT цепочки правил
iptables -L INPUT -n -v |
Остановить, запустить, перезапустить файрвол
Силами самой системы
service iptables stop |
Можно также использовать команды iptables для того, чтобы остановить файрвол и удалить все правила (можно bash-скрипт сделать, так проще):
iptables -F |
Где:-F
: Удалить flush
все правила;-X
: Удалить цепочку;-t table_name
: Выбрать таблицу nat
или mangle
и удалить все правила;-P
: Выбрать действия по умолчанию (такие, как DROP
, REJECT
, или ACCEPT
).
Удалить правила файрвола
Чтобы отобразить номер строки с существующими правилами:
iptables -L INPUT -n --line-numbers |
Получим список IP адресов.
Просто посмотрим на номер слева и удалим соответствующую строку.
К примеру для номера 3:
iptables -D INPUT 3 |
Или найдем IP адрес источника 192.168.1.1
и удалим из правила:
iptables -D INPUT -s 192.168.1.1 -j DROP |
Где:-D
: Удалить одно или несколько правил из цепочки.
Добавить правило в файрвол
Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:
iptables -L INPUT -n --line-numbers |
Примерный вывод:
Chain INPUT (policy DROP) |
Чтобы вставить правило между 1 и 2 строкой:
iptables -I INPUT 2 -s 192.168.1.1 -j DROP |
Проверим, обновилось ли правило:
iptables -L INPUT -n --line-numbers |
Вывод станет таким:
Chain INPUT (policy DROP) |
Сохраняем правила iptables
service iptables save |
Устанавливаем политики по умолчанию
Чтобы сбрасывать весь трафик:
iptables -P INPUT DROP |
После вышеперечисленных команд ни один пакет не покинет данный хост.
Блокировать только входящие соединения
Чтобы сбрасывать все не инициированные вами входящие пакеты, но разрешить исходящий трафик:
iptables -P INPUT DROP |
Пакеты исходящие и те, которые были запомнены в рамках установленных сессий - разрешены.
Сбрасывать адреса изолированных сетей в публичной сети
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j DROP |
Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A) |
Блокировка определенного IP адреса
Чтобы заблокировать адрес взломщика 1.2.3.4
:
iptables -A INPUT -s 1.2.3.4 -j DROP |
Заблокировать входящие запросы порта
Чтобы заблокировать все входящие запросы порта 80
:
iptables -A INPUT -p tcp --dport 80 -j DROP |
Чтобы заблокировать запрос порта 80
с адреса 1.2.3.4
:
iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP |
Заблокировать запросы на исходящий IP адрес
Чтобы заблокировать определенный домен, узнаем его адрес:
host -t a vkontakte.ru |
Вывод:
vkontakte.ru has address 95.213.4.242 |
Найдем CIDR
для 95.213.4.244
:
whois 95.213.4.244 | grep CIDR |
CIDR: 95.0.0.0/8 |
Заблокируем доступ на 95.0.0.0/8
:
iptables -A OUTPUT -p tcp -d 95.0.0.0/8 -j DROP |
Также можно использовать домен для блокировки:
iptables -A OUTPUT -p tcp -d www.vkontakte.ru -j DROP |
Записать событие и сбросить
Чтобы записать в журнал движение пакетов перед сбросом, добавим правило:
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: " |
Проверим журнал (по умолчанию /var/log/messages
):
tail -f /var/log/messages |
Записать событие и сбросить (с ограничением на количество записей)
Чтобы не переполнить раздел раздутым журналом, ограничим количество записей с помощью -m
.
К примеру, чтобы записывать каждые 5 минут максимум 7 строк:
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: " |
Сбрасывать или разрешить трафик с определенных MAC адресов
iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP |
Разрешить или запретить ICMP Ping запросы
Чтобы запретить:
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP |
Разрешить для определенных сетей / хостов:
iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT |
Разрешить только часть ICMP запросов:
### ** предполагается, что политики по умолчанию для входящих установлены в DROP ** ### |
Открыть диапазон портов
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT |
Открыть диапазон адресов
## разрешить подключение к порту 80 (Apache) если адрес в диапазоне от 192.168.1.100 до 192.168.1.200 ## |
## пример для nat ## |
Закрыть или открыть стандартные порты
Заменить ACCEPT
на DROP
, чтобы заблокировать порт.
## ssh tcp port 22 ## |
Ограничить количество параллельных соединений к серверу для одного адреса
Для ограничений используется connlimit
модуль.
Чтобы разрешить только 3 ssh соединения на одного клиента:
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT |
Установить количество запросов HTTP до 20
:
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP |
Где:--connlimit-above 3
: Указывает, что правило действует только если количество соединений превышает 3;--connlimit-mask 24
: Указывает маску сети.