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