Настройка межсетевого экрана в 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