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