Настройка межсетевого экрана в Linux


Немного теории

править

Принцип работы

править

Все пакеты пропускаются через определенные для них последовательности цепочек. При прохождении пакетом цепочки, к нему последовательно применяются все правила этой цепочки в порядке их следования. Под применением правила понимается: во-первых, проверка пакета на соответствие критерию, и во-вторых, если пакет этому критерию соответствует, применение к нему указанного действия. Под действием может подразумеваться как элементарная операция (встроенное действие, например, 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

Установим политики по умолчанию

править

Для цепочки "проходящая" устанавливаем блокировку, для цепочки "выходная" устанавливаем разрешение, для цепочки "входная" устанавливаем блокировку. Далее будут правила, определяющие исключения для этих политик.

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

Сохраним правила

править
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

См. также

править