iptables · 9 min read · Feb 13, 2026

Основы Iptables - Debian/RedHat

Резюме

Вы можете найти более удобную для чтения версию здесь: 5dollarwhitebox.org

Многие люди пугаются IPTables и находят его трудным для понимания. Однако, как только вы поймете основы, все становится легко. Этот документ будет служить базовым руководством по использованию iptables. Я ни в коем случае не гуру iptables, но использую его таким образом уже довольно долго. Если я допустил какие-либо ошибки, пожалуйста, не стесняйтесь написать мне на электронную почту.

Система

Debian Sarge 3.1 Оригинальное ядро 2.6.12.4 с mirrors.kernel.org Версия утилиты администрирования iptables 1.2.11-10

Подготовка

Это руководство выполняется на системе Debian Sarge 3.1, хотя команды и синтаксис должны работать для любой дистрибуции Linux. Прежде чем вы сможете настроить iptables, вы должны сначала убедиться, что он был скомпилирован в ядро, и что у вас установлены соответствующие утилиты пользовательского пространства.

Вы должны иметь файл конфигурации с момента компиляции ядра. Поиск по нему для “CONFIG_IP_NF” должен вернуть ‘=y’ или ‘=m’ для большинства строк/опций. Здесь вы видите, что “CONFIG_IP_NF_IPTABLES” был скомпилирован как модуль ядра.

# cat /boot/config-2.4.30 | grep -i “CONFIG_IP_NF”

CONFIG_IP_NF_CONNTRACK=m
CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_AMANDA=m
CONFIG_IP_NF_TFTP=m
CONFIG_IP_NF_IRC=m
CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_LIMIT=m
CONFIG_IP_NF_MATCH_MAC=m
CONFIG_IP_NF_MATCH_PKTTYPE=m
CONFIG_IP_NF_MATCH_MARK=m
CONFIG_IP_NF_MATCH_MULTIPORT=m
CONFIG_IP_NF_MATCH_TOS=m
CONFIG_IP_NF_MATCH_RECENT=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_DSCP=m
CONFIG_IP_NF_MATCH_AH_ESP=m
CONFIG_IP_NF_MATCH_LENGTH=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_MATCH_TCPMSS=m
CONFIG_IP_NF_MATCH_HELPER=m
CONFIG_IP_NF_MATCH_STATE=m
CONFIG_IP_NF_MATCH_CONNTRACK=m
CONFIG_IP_NF_MATCH_UNCLEAN=m
CONFIG_IP_NF_MATCH_OWNER=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_MIRROR=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_NAT_AMANDA=m
CONFIG_IP_NF_NAT_SNMP_BASIC=m
CONFIG_IP_NF_NAT_IRC=m
CONFIG_IP_NF_NAT_FTP=m
CONFIG_IP_NF_NAT_TFTP=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_MARK=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
CONFIG_IP_NF_COMPAT_IPCHAINS=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_COMPAT_IPFWADM=m
CONFIG_IP_NF_NAT_NEEDED=y

Это не так уж и необходимо, так как вы быстро узнаете, работает ли iptables или нет, как только мы попытаемся добавить некоторые правила.

Вы можете проверить, установлена ли утилита администрирования iptables, выполнив:

# dpkg -l iptables

iptables 1.2.11-10 Linux kernel 2.4+ администрирование iptables для

…или для дистрибутивов на основе rpm:

# rpm -qa | grep iptables

iptables-xxxxx


…или вы можете просто проверить, есть ли бинарный файл!

# which iptables

/sbin/iptables

Если утилита отсутствует, вы можете установить ее следующим образом:

APT

# apt-get update && apt-get install iptables


RPM

# rpm -Uvh iptables-xxxx.rpm

Подготовка ################################# [100%]

Основные файлы

Debian

  • /etc/init.d/iptables – INIT-скрипт для запуска|остановки|перезапуска сервиса (и сохранения наборов правил). Этот файл больше не является стандартным с Sarge, но вы все еще можете его получить (я покажу вам).

  • /var/lib/iptables – Домашняя директория Debian для ‘активных’ и ‘неактивных’ файлов счетчиков iptables-save (т.е. Сохраненные наборы правил). В RedHat вы найдете сохраненные правила в ‘/etc/sysconfig/iptables’.

  • /var/lib/iptables/active – Активные счетчики (об этом позже)

  • /var/lib/iptables/inactive – Неактивные счетчики

  • /sbin/iptables – Утилита/бинарный файл администрирования.

RedHat

  • /etc/init.d/iptables – INIT-скрипт для запуска|остановки|перезапуска сервиса (и сохранения наборов правил).

  • /etc/sysconfig/iptables – Файл RedHat для файлов счетчиков iptables-save (т.е. Сохраненные наборы правил).

  • /sbin/iptables – Утилита/бинарный файл администрирования.

Немного о IPTables

Чтобы увидеть, какие наборы правил у нас в настоящее время установлены, выполните:

# iptables –list

* Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination*

Это то, что вы увидите, когда нет установленных наборов правил. Смотрим на это, мы видим 3 ‘Цепи’.

  • INPUT - Содержит правила для трафика, направленного на этот сервер.

  • FORWARD – Содержит правила для трафика, который будет перенаправлен на IP за этим сервером (т.е. Если этот сервер служит в качестве брандмауэра для других серверов).

  • OUTPUT – Содержит правила для трафика, который исходит с этого сервера в интернет.

В основном мы будем иметь дело с трафиком, направленным на этот сервер, и будем выдавать правила для Цепи INPUT. Когда трафик проходит через ядро, оно определяет “ЦЕЛЬ” на основе того, соответствует ли пакет правилу или нет. Общие цели:

  • ACCEPT – Трафик принимается для доставки.

  • REJECT – Трафик отклоняется, отправляя пакет обратно к отправляющему хосту.

  • DROP - Трафик сбрасывается. Ничего не отправляется обратно к отправляющему хосту.

Настройка наборов правил

Итак, давайте перейдем к делу. Важно отметить, что порядок, в котором правила добавляются, очень важен. Например, если ваше первое правило - запретить все… то независимо от того, что вы конкретно разрешаете, оно будет отклонено.

Также стоит отметить, что ничего из того, что вы делаете, не сохраняется на диске, пока вы не выполните ‘iptables-save’ (или не используете init-скрипт для сохранения). Все счетчики/наборы правил находятся в памяти. Как только сервер перезагрузится или вы выполните ‘iptables –flush’, все, над чем вы работали, будет потеряно. Лично я работаю из bash-скрипта под названием ‘iptables-rules.sh’, который позволяет мне держать все организованным и прокомментированным. Если я делаю ошибку, мне не страшно, если я просто хочу сбросить все правила, я просто возвращаюсь к своему bash-скрипту и начинаю редактировать снова, сохраняю его и выполняю скрипт (это, однако, не будет выполняться при запуске… это будет рассмотрено в следующем разделе).

Очень важно, если вы работаете на этом сервере удаленно через ssh, сделать все возможное, чтобы не заблокировать себя. Поэтому наше первое правило будет заключаться в том, чтобы гарантировать, что, независимо от всего, я все еще могу получить доступ к ssh с моего IP-адреса.

# iptables -A INPUT -s 192.168.1.10 -d 10.1.15.1 -p tcp –dport 22 -j ACCEPT

Давайте разберем это:

  • -A => Указывает iptables ‘добавить’ это правило в Цепь INPUT

  • -s => Исходный адрес. Это правило относится только к трафику, поступающему ИЗ этого IP. Замените на IP-адрес, с которого вы подключаетесь по SSH.

  • -d => Адрес назначения. Это правило относится только к трафику, направленному К этому IP. Замените на IP этого сервера.

  • -p => Протокол. Указываем трафик, который является TCP.

  • –dport => Порт назначения. Указываем трафик, который предназначен для TCP порта 22 (SSH)

  • -j => Переход. Если все в этом правиле совпадает, то ‘переходите’ к ACCEPT

Следующим шагом мы захотим использовать некоторые стандартные правила для общего сетевого трафика. Это немного выходит за рамки основ, однако iptables может определить ‘состояние’, в котором находится пакет. Это связано со стандартным TCP-соединением. Например, трехстороннее рукопожатие между двумя хостами при передаче данных.

  • NEW => Сервер1 подключается к Серверу2, отправляя SYN (Synchronize) пакет.

  • RELATED => Сервер 2 получает SYN пакет и затем отвечает SYN-ACK (Synchronize Acknowledgment) пакетом.

  • ESTABLISHED => Сервер 1 получает SYN-ACK пакет и затем отвечает финальным ACK (Acknowledgment) пакетом.

После завершения этого трехстороннего рукопожатия трафик теперь УСТАНОВЛЕН. Для такого типа TCP-соединения необходимо что-то подобное этим трем правилам:

# iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

Последнее правило, очевидно, позволяет любому трафику покинуть сервер.

Теперь, когда у нас есть наши основы, давайте посмотрим, что iptables перечисляет для наших наборов правил:

# iptables –list

* Chain INPUT (policy ACCEPT)
target prot opt source destination

ACCEPT tcp – 192.168.1.10 10.1.15.1 tcp dpt:ssh
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all – anywhere anywhere state NEW,RELATED,ESTABLISHED*

Теперь вы можете добавлять любые правила, которые вам нравятся. Если вы запускаете базовый веб-сервер, вам, вероятно, понадобится что-то подобное:

ИНДИВИДУАЛЬНЫЕ ОТКЛОНЕНИЯ ПЕРВЫМИ:


ПЛОХИЕ ПАРНИ (Блокировка IP-адреса источника):

# iptables -A INPUT -s 172.34.5.8 -j DROP

БЕЗ СПАММЕРОВ (обратите внимание на использование FQDN):

# iptables -A INPUT -s mail.spammer.org -d 10.1.15.1 -p tcp –dport 25 -j REJECT


ЗАТЕМ ОТКРЫТЬ: ———————————————————————–
MYSQL (Разрешить удаленный доступ к определенному IP):

SSH:

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 22 -j ACCEPT

Sendmail/Postfix:

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 25 -j ACCEPT

FTP: (Обратите внимание, как вы можете указать диапазон портов 20-21)

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 20:21 -j ACCEPT

Пассивные FTP порты: (Снова указываем порты с 50000 по 50050 в одном правиле)

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 50000:50050 -j ACCEPT

HTTP/Apache

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 80 -j ACCEPT

SSL/Apache

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 443 -j ACCEPT

IMAP

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 143 -j ACCEPT

IMAPS

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 993 -j ACCEPT

POP3

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 110 -j ACCEPT

POP3S

# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 995 -j ACCEPT

Любой трафик с localhost:

# iptables -A INPUT -d 10.1.15.1 -s 127.0.0.1 -j ACCEPT

ICMP/Ping:

# iptables -A INPUT -d 10.1.15.1 -p icmp -j ACCEPT


ГЛОБАЛЬНЫЕ ОТКЛОНЕНИЯ ПОСЛЕДНИМИ:

Отклонить все остальное к этому IP:

# iptables -A INPUT -d 10.1.15.1 -j REJECT

Или отклонить все остальное, приходящее к любому IP:

# iptables -A INPUT -j REJECT


Обратите внимание, что мы делаем глобальные строки REJECT последними! Эти строки должны быть последними.

Сохранение наборов правил

С помощью init-скриптов сохранение наборов правил довольно просто. Как только вы будете довольны своей конфигурацией, просто выполните одно из следующих действий:

Способ Debian

Старый стиль init-скрипта больше не является стандартным в Sarge, но он все еще доступен для наследственного использования. Я полагаю, что новый способ - использовать ‘/etc/network/if-up.d’ и ‘/etc/network/if-down.d’ для скриптов iptables (но мне это не нравится).

Вы можете получить старый INIT-скрипт следующим образом:

# gunzip /usr/share/doc/iptables/examples/oldinitdscript.gz -c > /etc/init.d/iptables

Теперь, когда у вас есть скрипт на месте, вы можете сделать необходимое.

Активные правила

Активные правила - это те, которые загружаются при запуске iptables:

# /etc/init.d/iptables save active

Сохранение набора правил iptables: сохранить “active” с счетчиками.

Это сохраняет ваши правила в /var/lib/iptables/active

Неактивные правила

Вы также можете настроить второй набор правил для остановки iptables, называемый ‘inactive’. Iptables на самом деле не “остановится”, он просто очищает наборы правил, которые находятся на месте, а затем загружает ‘неактивные’ правила.

# /etc/init.d/iptables stop

Загрузка набора правил iptables: загрузка “inactive”

Поэтому вы можете установить свои ‘неактивные’ правила, а затем сохранить их с:

# /etc/init.d/iptables save inactive

Сохранение набора правил iptables: сохранить “inactive” с счетчиками.

Способ RedHat

INIT-скрипт RedHat очень похож. Вы можете использовать его для запуска и остановки iptables, а также для сохранения наборов правил.

Чтобы сохранить ваши активные правила, выполните следующее:

# /etc/init.d/iptables save

Это сохранит ваши правила в ‘/etc/sysconfig/iptables’.

Когда вы запускаете iptables, правила читаются из ‘/etc/sysconfig/iptables’:

# /etc/init.d/iptables start

Запуск iptables [OK]

А когда вы останавливаете iptables, все правила очищаются:

# /etc/init.d/iptables stop

Остановка iptables [OK]

Ручное сохранение и восстановление

Вы также можете вручную использовать утилиты iptables-save и iptables-restore следующим образом:

Сохранить правила в файл

# iptables-save > /root/iptables-save.out

Восстановить правила

# iptables-restore -c /root/iptables-save.out

Опция -c указывает iptables-restore, что этот файл был создан с помощью iptables-save, который выводит правила как “счетчики”.

Заключение

Вот и все, iptables в его самой базовой форме. Применения iptables слишком многочисленны, чтобы даже начать действительно делать руководство по ним. Однако для базовой безопасности и понимания IPTables, я надеюсь, что это могло вам помочь. Если есть что-то, что я мог бы добавить, пожалуйста, не стесняйтесь написать мне на электронную почту.


BJ Dierkes, RHCE4-LPIC1
wdierkes [at] 5dollarwhitebox [dot] org
Техас, США

Ресурсы

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.