Настройка межсетевого экрана в Linux
![]() |
Внимание! Это руководство нужно применять только войдя в систему локально. Если же Вы войдете в систему удалённо (по SSH, например), то скорее всего потеряете соединение с удалённой системой. |
Немного теории
[править]Принцип работы
[править]Все пакеты пропускаются через определенные для них последовательности цепочек. При прохождении пакетом цепочки, к нему последовательно применяются все правила этой цепочки в порядке их следования. Под применением правила понимается: во-первых, проверка пакета на соответствие критерию, и во-вторых, если пакет этому критерию соответствует, применение к нему указанного действия. Под действием может подразумеваться как элементарная операция (встроенное действие, например, ACCEPT, MARK), так и переход в одну из пользовательских цепочек. В свою очередь, действия могут быть как терминальными, то есть прекращающими обработку пакета в рамках данной базовой цепочки (например, ACCEPT, REJECT), так и нетерминальными, то есть не прерывающими процесса обработки пакета (MARK, TOS). Если пакет прошел через всю базовую цепочку и к нему так и не было применено ни одного терминального действия, к нему применяется действие по умолчанию для данной цепочки (обязательно терминальное).
Встроенные действия
[править]ACCEPT, DROP и REJECT — базовые операции фильтрации
Таблицы
[править]Таблица mangle
[править]Данная таблица предназначена для операций по классификации и маркировке пакетов и соединений, а также модификации заголовков пакетов (поля TTL и TOS).
Таблица nat
[править]Предназначена для операций stateful-преобразования сетевых адресов и портов обрабатываемых пакетов.
Таблица filter
[править]Предназначена для фильтрации трафика, то есть разрешения и запрещения пакетов и соединений.
Цепочки
[править]Таблица filter содержит следующие цепочки:
- INPUT — эта цепочка обрабатывает трафик, поступающий непосредственно самому хосту.
- FORWARD — позволяет фильтровать транзитный трафик.
- OUTPUT — эта цепочка позволяет фильтровать трафик, исходящий от самого хоста.
![]() |
Правила стоит располагать по возможности в порядке от наиболее частых попаданий к наиболее редким. |
Персональный межсетевой экран рабочей станции
[править]Проверим состояние
[править]Вариант 1 (рекомендуется в целях безопасности)
[править]sudo iptables-save
При отсутствии правил вывод будет примерно таким:
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT
Если вывод отличается, то сброс настроек можно сделать командой
sudo iptables-restore < empty.rules
где empty.rules - текстовый файл, содержащий 5 строк, как в выводе выше.
Вариант 2
[править]sudo iptables -nvL
При отсутствии правил вывод будет примерно таким:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0K packets, 0 bytes) pkts bytes target prot opt in out source destination
чтобы сбросить:
sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -F sudo iptables -X
Установим политики по умолчанию
[править]Для цепочки "проходящая" устанавливаем блокировку, для цепочки "выходная" устанавливаем разрешение, для цепочки "входная" устанавливаем блокировку. Далее будут правила, определяющие исключения для этих политик.
![]() |
Внимание! На этом этапе произойдёт отключение, если связь производилась по SSH. |
sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo iptables -P OUTPUT ACCEPT
Исключения (для входящих соединений)
[править]1. Разрешим трафик, принадлежащий установленным соединениям
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
2. Разрешим локальный интерфейс
sudo iptables -A INPUT -i lo -j ACCEPT
3. Запретим "неправильный" трафик (не открывающий новое соединение и не принадлежащий никакому установленному соединению).
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
4. Разрешим новые ICMP запросы (ping). Остальные запросы ping будут обработаны первым правилом.
sudo iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
5. Разрешим новые входные соединения по портам
Если установлен веб-сервер
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW --dport 80 -j ACCEPT
Если необходима связь по SSH
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW --dport 22 -j ACCEPT
Если установлен DNS-сервер
sudo iptables -A INPUT -p udp -m conntrack --ctstate NEW --dport 53 -j ACCEPT
есть возможность объединить несколько правил (для увеличения производительности):
sudo iptables -A INPUT -p tcp -m multiport --dports 21,22,6881:6882 -j ACCEPT
6. Все новые входящие соединения, не обработанные предыдущими цепочками, запретим.
sudo iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset sudo iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable sudo iptables -A INPUT -j REJECT --reject-with icmp-proto-unreach
Сохраним правила
[править]Arch Linux
[править]sudo iptables-save -f /etc/iptables/iptables.rules
RedHat Linux
[править]sudo /sbin/service iptables save
добавим демон для применения правил при загрузке компьютера
DAEMONS=(... iptables network ...)
Итоговый список правил
[править]sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo iptables -P OUTPUT ACCEPT sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP sudo iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT sudo iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset sudo iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable sudo iptables -A INPUT -j REJECT --reject-with icmp-proto-unreach
См. также
[править]- Iptables
- https://wiki.archlinux.org/index.php/Simple_stateful_firewall_HOWTO — Simple stateful firewall HOWTO