Принцип настройки
Общий синтаксис использования iptables:
iptables -t <таблица> <команда> <цепочка> [номер] <условие> <действие>
<таблица>
Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter.
<команда>
Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило.
<цепочка>
В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные).
[номер]
Некоторые команды требуют указания номера правила, например, на удаление или редактирование.
<условие>
Условие описывает критерии отработки того или иного правила.
<действие>
Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия.
* справедливости ради, стоит отметить, что ключ с действием не обязан идти в конце. Просто данный формат чаще всего встречается в инструкциях и упрощает чтение правил.
Ключи iptables и примеры их использования
Для работы с таблицами (iptables -t)
Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.
Команды
Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.
Ключ | Описание и примеры |
---|---|
-A | Добавление правила в конец списка: iptables -A INPUT -s 192.168.0.15 -j DROP запретить входящие с 192.168.0.15. |
-D | Удаление правила: iptables -D INPUT 10 удалить правило в цепочке INPUT с номером 10. |
-I | Вставка правила в определенную часть списка: iptables -I INPUT 5 -s 192.168.0.15 -j DROP вставить правило 5-м по списку. |
-R | Замена правила. iptables -R OUTPUT 5 -s 192.168.0.15 -j ACCEPT заменить наше 5-е правило с запрещающего на разрешающее. |
-F | Сброс правил в цепочке. iptables -F INPUT |
-Z | Обнуление статистики. iptables -Z INPUT |
-N | Создание цепочки. iptables -N CHAINNEW |
-X | Удаление цепочки. iptables -X CHAINNEW |
-P | Определение правила по умолчанию. iptables -P INPUT DROP |
-E | Переименовывание цепочки. iptables -E CHAINNEW CHAINOLD |
Условия
Данные ключи определяют условия правила.
Ключ | Описание и примеры |
---|---|
-p | Сетевой протокол. Допустимые варианты — TCP, UDP, ICMP или ALL. iptables -A INPUT -p tcp -j ACCEPT разрешить все входящие tcp-соединения. |
-s | Адрес источника — имя хоста, IP-адрес или подсеть в нотации CIDR. iptables -A INPUT -s 192.168.0.50 -j DROP запретить входящие с узла 192.168.0.50 |
-d | Адрес назначения. Принцип использования аналогичен предыдущему ключу -s. iptables -A OUTPUT -d 192.168.0.50 -j DROP запретить исходящие на узел 192.168.0.50 |
-i | Сетевой адаптер, через который приходят пакеты (INPUT). iptables -A INPUT -i eth2 -j DROP запретить входящие для Ethernet-интерфейса eth2. |
-o | Сетевой адаптер, с которого уходят пакеты (OUTPUT). iptables -A OUTPUT -o eth3 -j ACCEPT разрешить исходящие с Ethernet-интерфейса eth3. |
--dport | Порт назначения. iptables -A INPUT -p tcp --dport 80 -j ACCEPT разрешить входящие на порт 80. |
--sport | Порт источника. iptables -A INPUT -p tcp --sport 1023 -j DROP запретить входящие с порта 1023. |
Перечисленные ключи также поддерживают конструкцию с использованием знака !
. Он инвертирует условие, например,
iptables -A INPUT -s ! 192.168.0.50 -j DROP
запретит соединение всем хостам, кроме 192.168.0.50.
Действия
Действия, которые будут выполняться над пакетом, подходящим под критерии условия. Для каждой таблицы есть свой набор допустимых действий. Указываются с использованием ключа -j .
Таблица | Действие | Описание |
---|---|---|
filter | ACCEPT | Разрешает пакет. |
DROP | Запрещает пакет. | |
REJECT | Запрещает с отправкой сообщения источнику. | |
nat | MASQUERADE | Для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет. |
SNAT | Аналогично MASQUERADE, но с указанием конкретного сетевого интерфейса, чей адрес будет использоваться для подмены. | |
DNAT | Подмена адреса для входящих пакетов. | |
REDIRECT | Перенаправляет запрос на другой порт той же самой системы. | |
mangle | TOS | Видоизменение поля TOS (приоритезация трафика). |
DSCP | Изменение DSCP (тоже приоритезация трафика). | |
TTL | Изменение TTL (время жизни пакета). | |
HL | Аналогично TTL, но для IPv6. | |
MARK | Маркировка пакета. Используется для последующей фильтрации или шейпинга. | |
CONNMARK | Маркировка соединения. | |
TCPMSS | Изменение значения MTU . |
Примеры часто используемых команд iptables
Общие команды
Просмотр правил с их номерами:
iptables -L --line-numbers
Для каждой таблицы смотреть правила нужно отдельно:
iptables -t nat -L --line-numbers
Удалить все правила:
Установить правила по умолчанию:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
* в данных примерах по умолчанию для всех входящих (INPUT) и исходящих (OUTPUT) пакетов будет работать запрещающее правило (DROP).
Разрешить все
Способ 1. С помощью добавления правила:
iptables -I INPUT 1 -j ACCEPT
iptables -I OUTPUT 1 -j ACCEPT
iptables -I FORWARD 1 -j ACCEPT
* данные три команды создадут правила, которые разрешают все входящие, исходящие и транзитные пакеты.
Способ 2. Чисткой правил:
* здесь мы сначала удаляем все правила (-F), затем устанавливаем политику по умолчанию — разрешать входящие, исходящие и транзитные (-S).
Способ 3. Отключение сервиса (удобно для диагностики проблем на время отключить firewall):
service iptables stop
Работа с правилами
Добавить правило в конец списка:
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -s ! 192.168.0.25 --dport 993 -i eth0 -j ACCEPT
Добавить диапазон портов:
iptables -A INPUT -p tcp --dport 3000:4000 -j ACCEPT
* в данном случае, от 3000 до 4000.
Вставить правило:
iptables -I FORWARD 15 -p udp -d 8.8.8.8 --dport 53 -i eth1 -j ACCEPT
Заблокировать определенный IP-адрес для подключения по 25 порту:
iptables -I INPUT 1 -s 1.1.1.1 -p tcp --dport 25 -j DROP
Проброс портов (port forwarding)
Существует два способа настройки.
1. Правила PREROUTING + POSTROUTING:
iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 --dport 22 -j DNAT --to-destination 192.168.1.15:2222
iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 --sport 2222 -j SNAT --to-source 19.8.232.80:22
* где 19.8.232.80 — адрес, на котором слушаем запросы на подключение; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы; 2222 — внутренний порт.
2. Правила PREROUTING + FORWARD:
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 22 -j DNAT --to-destination 192.168.1.15:2222
iptables -A FORWARD -p tcp -d 192.168.1.15 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Ключевыми понятиями iptables являются:
Критерий - логическое выражение, анализирующее свойства пакета и/или соединения и определяющее, подпадает ли данный конкретный пакет под действие текущего правила. Критерии соединяются логическим «И».
Действие - описание действия, которое нужно проделать с пакетом и/или соединением в том случае, если они подпадают под действие этого правила. О действиях более подробно будет рассказано ниже.
Счетчик - компонент правила, обеспечивающий учет количества пакетов, которые попали под критерий данного правила. Также счетчик учитывает суммарный объем таких пакетов в байтах.
Базовая цепочка - цепочка, создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам, которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек. Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).
Пользовательская цепочка - цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями.
Правило - состоит из критерия, действия и счетчика. Если пакет соответствует критерию, к нему применяется действие, и он учитывается счетчиком. Критерия может и не быть - тогда неявно предполагается критерий «все пакеты». Указывать действие тоже не обязательно - в отсутствие действия правило будет работать только как счетчик. Правила для каждой цепочки срабатывают в порядке их следования, поэтому порядок важен.
Цепочка - упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые.
Таблица - совокупность базовых и пользовательских цепочек, объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре, так как в принципе не могут конфликтовать с именами пользовательских цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания, используется таблица filter.
Синтаксический анализ:
# Дамп правил таблицы filter $ sudo iptables-save -c -t filter # Таблица filter * filter # Цепочки INPUT, FORWARD, OUTPUT, их политики и счётчики :INPUT ACCEPT [ 19302 :9473669 ] :FORWARD ACCEPT [ 0 :0 ] :OUTPUT ACCEPT [ 5462736 :4247599532 ] # Правило: "" - счётчик правила, "-A INPUT" - цепочка, "-i em1 -p tcp -m tcp --dport 22" - критерии, "-j ACCEPT" - действие [ 17 :1020 ] -A INPUT -i em1 -p tcp -m tcp --dport 22 -j ACCEPT COMMITАрхитектура
В системе netfilter, пакеты пропускаются через цепочки. Цепочка является упорядоченным списком правил, а каждое правило может содержать критерии и действие или переход. Когда пакет проходит через цепочку, система netfilter по очереди проверяет, соответствует ли пакет всем критериям очередного правила, и если так, то выполняет действие (если критериев в правиле нет, то действие выполняется для всех пакетов проходящих через правило). Вариантов возможных критериев очень много. Например, пакет соответствует критерию –source 192.168.1.1 если в заголовке пакета указано, что отправитель - 192.168.1.1. Самый простой тип перехода, –jump, просто пересылает пакет в начало другой цепочки. Также при помощи –jump можно указать действие. Стандартные действия доступные во всех цепочках - ACCEPT (пропустить), DROP (удалить), QUEUE (передать на анализ внешней программе), и RETURN (вернуть на анализ в предыдущую цепочку). Например, команды
Iptables -A INPUT --source 192.168.1.1 --jump ACCEPT iptables -A INPUT --jump other_chain
означают «добавить к концу цепочки INPUT следующие правила: пропустить пакеты из 192.168.1.1, а всё, что останется - отправить на анализ в цепочку other_chain».
Цепочки
Существует 5 типов стандартных цепочек, встроенных в систему:
PREROUTING - для изначальной обработки входящих пакетов.
INPUT - для входящих пакетов адресованных непосредственно локальному процессу (клиенту или серверу).
FORWARD - для входящих пакетов перенаправленных на выход (заметьте, что перенаправляемые пакеты проходят сначала цепь PREROUTING, затем FORWARD и POSTROUTING).
OUTPUT - для пакетов генерируемых локальными процессами.
POSTROUTING - для окончательной обработки исходящих пакетов.
Также можно создавать и уничтожать собственные цепочки при помощи утилиты iptables.
Таблицы
Цепочки организованны в 4 таблицы:
Raw - просматривается до передачи пакета системе определения состояний. Используется редко, например для маркировки пакетов, которые НЕ должны обрабатываться системой определения состояний. Для этого в правиле указывается действие NOTRACK. Содержит цепочки PREROUTING и OUTPUT.
Mangle - содержит правила модификации (обычно заголовка) IP‐пакетов. Среди прочего, поддерживает действия TTL (Time to live), TOS (Type of Service), и MARK (для изменения полей TTL и TOS, и для изменения маркеров пакета). Редко необходима и может быть опасна. Содержит все пять стандартных цепочек.
Nat - просматривает только пакеты, создающие новое соединение (согласно системе определения состояний). Поддерживает действия DNAT, SNAT, MASQUERADE, REDIRECT. Содержит цепочки PREROUTING, OUTPUT, и POSTROUTING.
Filter - основная таблица, используется по умолчанию если название таблицы не указано. Содержит цепочки INPUT, FORWARD, и OUTPUT.
Цепочки с одинаковым названием, но в разных таблицах - совершенно независимые объекты. Например, raw PREROUTING и mangle PREROUTING обычно содержат разный набор правил; пакеты сначала проходят через цепочку raw PREROUTING, а потом через mangle PREROUTING.
Состояния
В системе netfilter, каждый пакет проходящий через механизм определения состояний, может иметь одно из четырёх возможных состояний:
NEW - пакет открывает новый сеанс. Классический пример - пакет TCP с флагом SYN.
ESTABLISHED - пакет является частью уже существующего сеанса.
RELATED - пакет открывает новый сеанс, связанный с уже открытым сеансом. Например, во время сеанса пассивного FTP , клиент подсоединяется к порту 21 сервера, сервер сообщает клиенту номер второго, случайно выбранного порта, после чего клиент подсоединяется ко второму порту для передачи файлов. В этом случае второй сеанс (передача файлов по второму порту) связан с уже существующим сеансом (изначальное подсоединение к порту 21).
INVALID - все прочие пакеты.
Диаграмма прохождения таблиц и цепочек
Упрощённая диаграмма прохождения таблиц и цепочек:
Детальная диаграмма:
Базовая конфигурация
Ниже приведён пример базовой статической конфигурации iptables. При сохранении и загрузке подобной конфигурации необходимо принимать во внимание возможность внесения в неё изменений со стороны других сервисов, например Fail2ban . Кроме того, при использовании IPv6-адресации конфигурацию для IPv6 следует выполнять независимо от IPv4.
IPv4
sudo iptables-saveСоздаём скрипт с дампом правил iptables:
sudo nano / etc/ network/ if-up.d/ iptables-rulesКопируем следующий код:
#!/sbin/iptables-restore -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -p icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited #-A OUTPUT -p icmp -j ACCEPT #-A OUTPUT -o lo -j ACCEPT #-A OUTPUT -j REJECT --reject-with icmp-host-prohibited COMMITДополняем нужными правилами с учётом iptables-save.
sudo chmod +x / etc/ network/ if-up.d/ iptables-rules sudo / etc/ network/ if-up.d/ iptables-rulesIPv6
Просмотр текущей конфигурации:
sudo ip6tables-saveСоздаём скрипт с дампом правил ip6tables:
sudo nano / etc/ network/ if-up.d/ ip6tables-rulesКопируем следующий код:
#!/sbin/ip6tables-restore # Таблица filter и её цепочки * filter:INPUT ACCEPT [ 0 :0 ] :FORWARD ACCEPT [ 0 :0 ] :OUTPUT ACCEPT [ 0 :0 ] # Разрешаем связанные и установленые соединения -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Разрешаем служебный icmp-трафик -A INPUT -p ipv6-icmp -j ACCEPT # Разрешаем доверенный трафик на интерфейс loopback -A INPUT -i lo -j ACCEPT # Сюда можно вставлять дополнительные правила для цепочки INPUT # Запрещаем всё остальное для INPUT -A INPUT -j REJECT --reject-with icmp6-adm-prohibited # Порядок и смысл правил для цепочек FORWARD и OUTPUT аналогичен INPUT -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -p ipv6-icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited # Фильтровать цепочку OUTPUT настоятельно не рекомендуется #-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #-A OUTPUT -p ipv6-icmp -j ACCEPT #-A OUTPUT -o lo -j ACCEPT #-A OUTPUT -j REJECT --reject-with icmp6-adm-prohibited COMMITДополняем нужными правилами с учётом ip6tables-save.
Сохраняем и закрываем: Ctrl + O , Enter , Ctrl + X
Делаем скрипт исполняемым и загружаем правила iptables:
sudo chmod +x / etc/ network/ if-up.d/ ip6tables-rules sudo / etc/ network/ if-up.d/ ip6tables-rulesДополнительные правила
Ниже приведены некоторые сравнительно часто используемые правила. Цепочки INPUT/OUTPUT применяются для фильтрации локального трафика. Для транзитного трафика необходимо использовать цепочку FORWARD.
Удалённый доступ
# remote.ssh -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT # remote.rdp -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 3389 -j ACCEPT # remote.vnc -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5900 -j ACCEPT
Веб и файловые сервисы
# web.http, web.https -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 21 -j ACCEPT
Почта и мгновенные сообщения
# mail.pop3, mail.pop3s -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 110 ,995 -j ACCEPT # mail.imap, mail.imaps -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 143 ,993 -j ACCEPT # mail.smtp, mail.smtps -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 25 ,465 -j ACCEPT # im.xmpp -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 5222 ,5223 -j ACCEPT # im.icq.oscar -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5190 -j ACCEPT
Сетевые службы
# network.openvpn.vpn -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 1194 -j ACCEPT # network.squid.proxy -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 3128 -j ACCEPT # network.dns -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 53 -j ACCEPT -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 53 -j ACCEPT # network.ntp -A INPUT -p udp -m conntrack --ctstate NEW -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 69 -j ACCEPT # network.dhserver.dhcp.discover-request -A INPUT -p udp -m conntrack --ctstate NEW -m udp --sport 68 --dport 67 -j ACCEPT # network.dhclient.dhcp.discover-request #-A OUTPUT -p udp -m conntrack --ctstate NEW -m udp --sport 68 --dport 67 -j ACCEPT # network.dhserver.dhcp.offer-ack #-A OUTPUT -p udp -m conntrack --ctstate NEW -m udp --sport 67 --dport 68 -j ACCEPT
Тестирование и отладка
Просмотр текущей конфигурации для IPv4 и IPv6:
sudo iptables-save sudo ip6tables-saveЛогирование
Трассировка
Модули ядра
Просмотр загруженных модулей:
lsmod | grep -E "^ip|^nf" | sortДля загрузки дополнительных модулей удобно применять автодополнение: 2x Tab
sudo modprobe nf sudo modprobe modules-load.d Всё очень просто, в очередной раз объясняя на форуме новичкам в мире Linux, что да как я понял, что на просторах интернет не найти собранную воедино статью с объяснением не только настройки iptables, но и некоторых сетевых основ.Так что вашему вниманию я представляю небольшой экскурс по настройке firewall в Linux. Углубимся лишь в настройку netfilter/iptables, остальных прикладных вопросов мы несомненно тоже коснёмся, ведь нам не хватает именно комплексных ответов на наши вопросы… И я постараюсь ка можно более доходчиво здесь все изложить.
Как это выглядит
Мы будем рассматривать типичную схему для офисов и для квартир, да-да именно квартир! Мало у кого есть собственный маленький сервачок дома под столом, но у большинства интернет дома раздается через роутер и в большинстве своём они тоже прошиты Linux.Это типичная схема малого офиса. Когда к интернет подключен 1 компьютер(сервер), а остальные подключаются к интернет уже через этот сервер.
Поехали, потихонечку...
И так что же мы имеем:- сервер с 2мя сетевыми картами и установленным на нём Debian Lenny
- имеющийся по умолчанию в Debian Lenny firewall - netfilter/iptables
- локальную сеть из N компьютеров, все соединены через коммутатор, в том числе и сервер
что такое NAT
Для начала нам нужно понять, что настраивать мы будем самый обыкновенный NAT(Network Address Translation). Для жаждущих, я в конце упомяну и о проксе сервере на примере squid. Как я уже сказал разжёвывать будем практически всё.Что же такое NAT? На самом деле все просто, все компьютеры имеют физический (MAC) и сетевой (IP) адреса. Нас в данный момент интересуют IP адреса. IP адрес в пределах одной сети должен быть уникальным! А при нынешнем стандарте IPv4 уникальными могут быть всего-то 4 294 967 296 (2 32), что совсем не много и они практически кончились. но не переживайте вот вот вступит в широкое распространение IPv6, а там адресов навалом!
Но тут вы можете заметить, компьютеров значительно больше того числа, что позволяет IPv4 или скажете, что у друга дома такой же адрес как и у вас! И вот тут-то и заходит речь о NAT - он позволяет соединять компьютерные сети между собой используя единственный, свой IP адрес, действия фаервола при этом называется SNAT(Source NAT или подмена адреса источника). Т.е. в 99% случаев вся ваша контора выходит в интернет под 1 IP адресом, при этом внутри офиса у каждого он свой. О классах IP адресов вы сможете прочесть в интерне.
Теперь, когда мы знаем что такое NAT и для чего он нужен, можно приступать непосредственно к настройке сервера.
транзитный трафик
Все команды выполняются от имени root(суперпользователь). В Debian по умолчанию отключен так называемый транзитный трафик, т.е. по умолчанию предусмотрена работа только как единичная машина. Как вы уже догадались, без транзитного трафика нету и NAT. Для его включения достаточно изменить 1 цифру - $ echo 1 > /proc/sys/net/ipv4/ip_forward , но данная настройка слетит после перезагрузки, так что лучше поправить конфиг - $ nano /etc/sysctl.conf далее ищем строчку #net.ipv4.ip_forward=1 и убираем «решётку»(символ комментария) в начале строки и проверяем что значения равно 1! Теперь можно приступать непосредственно к конфигурированию iptables.настраиваем iptables
В интернет, есть много статей о том как писать правила в iptables и что с их помощью можно творить, наиболее полным и приятным для чтения мне показалась .И так приступим. Для начала очистим таблицы от лишних правил, вдруг там что было лишнего…
$ iptables -F
$ iptables -t nat -F
$ iptables -t mangle -F
Лишнее почистили. Очень важно понять и помнить, что правила в iptables применяются иерархически, т.е. правило стоящее выше выполнится раньше. Все цепочки по умолчанию имеют политику ACCEPT - разрешают всё. что не попало под правила данной цепочки.
Условимся, что интерфейс смотрящий в локальную сеть - eth0, а в интернет - eth1, локальная сеть имеет адреса 192.168.0.0/24, а провайдер выдал нам статический адрес 10.188.106.33(пускай и не «белый» - о типах ip адресов вы также можете посмотреть в интернет). И так пишем:
$ iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A FORWARD -i eth1 -o eth0 -d 192.168.0.0/24 -j ACCEPT
$ iptables -P FORWARD DROP
тем самым разрешили ходить транзитным пакетам через firewall для нашего диапазона ip адресов, а всё остальное запрещаем.
Теперь сам NAT:
$ iptables -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 10.188.106.33
Этого достаточно для того что бы у вас заработал NAT.
по мелочам...
На клиентах указываем ip из выбранного диапазона и указываем в качестве шлюза ip адрес нашего сервера(обычно его назначают первым из подсети - я оставлю это на ваше усмотрение). Все сетевые настройки на сервере можно провести так:$ nano /etc/network/interfaces в нём указываются настройки ваших сетевых интерфейсов.
доступ в недры сети через шлюз или DNAT
И тут вы поняли, что в сети у вас есть Windows Server к которому у вас всегда был простой доступ по RDP, а тут вылез это назойливый шлюз на Debian! Всё очень просто - надо всего лишь добавить DNAT правило в наш iptables.Что за зверь DNAT? DNAT (Destination NAT или подмена адреса получателя) - сетевые карты работают в таком режиме, что они принимают только пакеты адресованные именно им, а зайти на наш сервер если ip под которым он выходит в интернет сидят еще десяток машин в вашем офисе? Как запрос дойдёт именного до него? На самом деле все запросы такого рода упираются в наш шлюз. И всё что нам надо сделать это задать правила для работы с такими пакетами.
$ iptables -A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
Это простое правило будет переадресовывать все пакеты приходящие на шлюз из интернет на порт TCP 3389(именно его использует RDP протокол) на ваш внутренний Windows Server. И, вуаля, у вас все работает.
итак что там с любимым squid
И хотя сейчас все работает, у всех есть интернет и все работает, некоторым всё же нужен прокси сервер. Я не буду рассказывать о настройке squid, я покажу правило которое позволит сделать его «прозрачным». В сквид надо лишь прописать волшебное слово transparent в нужном месте и он начнём корректно обрабатывать свалившееся на него запросы.Пишем $ iptables -A PREROUTING -d! 192.168.0.0/24 -i eth0 -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 3128 .
И что же нам это даёт? Теперь все запросы на web страницы с ваших рабочих мест по http((80) и https(443) протоколам будут перенаправляться на порт который слушает squid. Вы получает контентную фильтрацию, информацию о том кто где был и что делал в интернет, пользователь ни чего не подозревая работает как и раньше…
немного безопасности
Следует хоть минимально защитить свой шлюз поэтому добавим еще пару правил$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A INPUT -i eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP
Тем самым запретили любое общение непосредственно с шлюзом, кроме уже установленных соединений, т.е. те что были инициированы вами и вы просто получаете на них ответы. Не бойтесь наш DNAT до этих правил просто не доходит…
почему так мало?
Статья не резиновая и обо всем все-равно не расскажешь… Я привел минимальный набор действий и понятий что бы вы могли начать осваивать такую махину как шлюз на Linux. Здесь можно говорить очень и очень долго, обсуждая многие аспекты и возможности netfilter.Итого
Как мы видим все действительно просто! Главное это понять принцип функционирования сети и не боятся настраивать и читать большие мануалы.Надеюсь мне удалось собрать воедино информацию достаточную для начала вашей дружбы с программными маршрутизаторами на основе Linux.
Теги: iptables, netfilter, NAT
Определение i ptables - утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux версий 2.4, 2.6, 3.x, 4.x . Для использования утилиты iptables требуются привилегии суперпользователя (root).
Мы будем разбираться с iptables и без небольшого теоритического вступления не обойтись.
Что бы правильно составлять правила брандмауэра нужно понимать как вообще идут пакеты и что с ними происходит.
Порядок движения транзитных пакетов
Шаг | Таблица | Цепочка | Примечание |
---|---|---|---|
1 | |||
2 | mangle | PREROUTING | Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.. |
3 | nat | PREROUTING | Эта цепочка используется для трансляции сетевых адресов (). выполняется позднее, в другой цепочке. |
4 | Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет — локальному приложению или на другой узел сети. | ||
5 | mangle | FORWARD | Далее пакет попадает в цепочку FORWARD таблицы mangle. |
6 | Filter | FORWARD | В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации. |
7 | mangle | POSTROUTING | Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации. |
9 | nat | POSTROUTING | Эта цепочка предназначена в первую очередь для Source Network Address Translation . Здесь же выполняется и маскарадинг (Masquerading ). |
9 | Выходной сетевой интерфейс (например, eth1). |
Для локального приложения(входящие пакеты)
Шаг | Таблица | Цепочка | Примечание |
---|---|---|---|
1 | Входной сетевой интерфейс (например, eth0) | ||
2 | mangle | PREROUTING | Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр. |
3 | nat | PREROUTING | Преобразование адресов (Destination Network Address Translation ). |
4 | Принятие решения о маршрутизации. | ||
5 | mangle | INPUT | Пакет попадает в цепочку INPUT таблицы mangle. Здесь вносятся изменения в заголовок пакета перед тем как он будет передан локальному приложению. |
6 | filter | INPUT | Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили. |
7 | Локальный процесс/приложение (т.е., программа-сервер или программа-клиент) |
От локальных процессов(исходящие пакеты)
Шаг | Таблица | Цепочка | Примечание |
---|---|---|---|
1 | Локальный процесс (т.е., программа-сервер или программа-клиент). | ||
2 | Принятие решения о маршрутизации. Здесь решается куда пойдет пакет дальше — на какой адрес, через какой сетевой интерфейс и пр. | ||
3 | mangle | OUTPUT | Здесь производится внесение изменений в заголовок пакета. Выполнение фильтрации в этой цепочке может иметь негативные последствия. |
4 | nat | OUTPUT | Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра. |
5 | Filter | OUTPUT | Здесь фильтруется исходящий траффик. |
6 | mangle | POSTROUTING | Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра. |
7 | nat | POSTROUTING | Здесь выполняется Source Network Address Translation . Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP . |
8 | Сетевой интерфейс (например, eth0) |
Как мы поняли есть основные три таблицы:
- mangle — Данная таблица предназначена для операций по классификации и маркировке пакетов и соединений, а также модификации заголовков пакетов (поля TTL и TOS).
- filter — основная таблица для фильтрации пакетов, используется по умолчанию. Собственно в этой таблице и происходит фильтрация пакетов.
- nat — обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора. Здесь задаются правила для маршрутизации.
Для таблицы nat применимы действия:
- MASQUERADE
Действие DNAT (Destination Network Address Translation) производит преобразование адресов назначения в заголовках пакетов. Другими словами, этим действием производится перенаправление пакетов на другие адреса, отличные от указанных в заголовках пакетов.
SNAT (Source Network Address Translation) используется для изменения исходных адресов пакетов. С помощью этого действия разделить единственный внешний IP адрес между компьютерами локальной сети для выхода в Интернет. В этом случае брандмауэр, с помощью SNAT , автоматически производит прямое и обратное преобразование адресов, тем самым давая возможность выполнять подключение к серверам в Интернете с компьютеров в локальной сети.
Маскировка (MASQUERADE ) применяется в тех же целях, что и SNAT , но в отличие от последней, MASQUERADE дает более сильную нагрузку на систему. Происходит это потому, что каждый раз, когда требуется выполнение этого действия — производится запрос IP адреса для указанного в действии сетевого интерфейса, в то время как для SNAT IP адрес указывается непосредственно. Однако, благодаря такому отличию, MASQUERADE может работать в случаях с динамическим IP адресом, т.е. когда вы подключаетесь к Интернет, скажем через PPP , SLIP или DHCP .
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Выполнить MASQUERADE для всех пакетов идущих из сети 10.8.0.0 на интерфейс eth0 . Для понятности, допустим у нас две сетевые карточки и две сети. Нам надо что бы сеть 10.8.0.0/24 (первая сетевая карточка)могла выйти скажем в интернет через eth0(вторая сетевая карточка)
- raw — Предназначена для выполнения действий с пакетами до их обработки системой.
Собственно таблица по умолчанию filter .
- INPUT - обрабатывает трафик, поступающий непосредственно самому хосту.
- FORWARD - позволяет фильтровать транзитный трафик.
- OUTPUT - позволяет фильтровать трафик, исходящий от самого хоста.
Действие с пакетом.
- ACCEPT - пропуск пакета. Пакет покидает текущую базовую цепочку и следует дальше.
- REJECT - заблокировать пакет и сообщить его источнику об отказе.
- DROP - заблокировать пакет, не сообщая источнику об отказе. Более предпочтительна при фильтрации трафика на интерфейсах, подключенных к интернету, так как понижает информативность сканирования портов хоста злоумышленниками.
- LOG — сделать запись о пакете в лог файл.
Получается у нас цепочка [таблица — filter ] — [ трафик — INPUT ] — [действие — DROP ] логика действий только кажется сложной. Думаю мы с вами на примерах разберемся и станет все просто.
Команд iptables:
- -A добавить правило в конец цепочки.
- -D удалить правило.
- -I вставить правило с нужным номером.
- -L вывести все правила в текущей цепочке.
- -S вывести все правила.
- -F очистить все правила.
- -N создать цепочку.
- -X удалить цепочку.
- -P установить действие по умолчанию.
Начнем разбираться на конкретных примерах.
iptables -A INPUT -p tcp —dport 80 -j ACCEPT
-A
добавить новое правило, INPUT
для входящих пакетов, -p
протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp,
mh, — — dport
порт назначения 80(опция только для протокола), -j
выбрать действие, если правило подошло, ACCEPT
разрешить. То есть разрешить входящий трафик по протоколу tcp на порт 80.
Перечисленные ключи также поддерживают конструкцию с использованием знака ! . Он инвертирует условие, например:
iptables -A INPUT -s ! 192.168.0.50 -j DROP
-s адрес источника - имя хоста(www.help.com), IP-адрес или подсеть в нотации CIDR(192.168.0.1/16) , ! инверсия, DROP запретить. Запретить весь входящий трафик, кроме источника 192.168.0.50 (если бы не было ! , то запретить только с 192.168.0.50 )
iptables -A INPUT -s 192.168.0.50 -j DROP
Запретить входящий трафик с ip — 192.168.0.50 .
Список критериев правил:
- -p Протокол, протокол также можно указать с помощью номера или названия согласно перечислению, приведенному в /etc/protocols . Значение «любой протокол» можно указать с помощью слова all или числа 0 . Так же для протокола есть дополнительные параметры : —sport (—source-port) Позволяет указать исходящий порт (или их диапазон). —dport (—destination-port) Позволяет указать порт назначения (или их диапазон).
- -s Определяет адрес отправителя . В качестве адреса может выступать IP-адрес (возможно с маской), доменное имя (в последних двух случаях перед добавлением правила в цепочку имя резольвится в IP-адрес).
- -i Определяет входящий сетевой интерфейс. Если указанное имя интерфейса заканчивается знаком «+» (например, eth +), то критерию соответствуют все интерфейсы, чьи названия начинаются на указанное имя(etho,eth1).
- -d Определяет адрес получателя . Синтаксис аналогичен -s .
- -o Определяет исходящий сетевой интерфейс. Синтаксис аналогичен -i .
Так же критерия можно комбинировать.
iptables -A INPUT -i eth0 -s 192
.168.0.0 -j DROP
Запретить входящие пакеты с интерфейса eth0 и ip 192 .168.0.0 . А на интерфейс eth1 пакеты пройдут.
А что делать если вы за ранние не знаете какой порт открывать , например хотите что бы FTP сервер работал в пассивном режиме. Модуль conntrack о состоянии соединения поможет, а конкретней критерий - ctstate. Модуль подключается тэгом -m .
iptables -A INPUT -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack —ctstate NEW -p tcp —dport 21 -j ACCEPT # Разрешаем открывать соединения на 21 TCP-порт.
Возможные состояния:
- NEW - соединение не открыто, то есть пакет является первым в соединении.
- ESTABLISHED - пакет относится к уже установленному соединению. Обычно такие пакеты принимаются без дополнительной фильтрации, как и в случае с RELATED.
- RELATED - пакет открывает новое соединение, логически связанное с уже установленными, например, открытие канала данных в пассивном режиме FTP. Соединение получает статус RELATED если оно связано с другим соединением, имеющим признак ESTABLISHED .
- INVALID — Признак INVALID говорит о том, что пакет не может быть идентифицирован и поэтому не может иметь определенного статуса.
iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT
State и деологический предшественник conntrack, имеет единственный параметр --state , аналогичный параметру --ctstate модуля conntrack (но, в отличие от него, не поддерживающий состояния DNAT и SNAT).
Кратко рассмотрим таблицу таксировщика, которую можно найти в файле /proc/net/ip_conntrack . Здесь содержится список всех активных соединений.
Tcp 6 300 ESTABLISHED src=128.*.*.* dst=194.*.*.* sport=52524 dport=2223 src=194.*.*.* dst=128.*.*.* sport=2223 dport=52524 mark=0 use=2
Первое как понятно это протокол, потом десятичное число(что значит не знаю),потом идет время жизни соединения. Далее состояние ESTABLISHED то есть соединение уже установлено, бывает еще UNREPLIED что значит что ответного трафика еще не было. Далее расположены адреса отправителя и получателя, порт отправителя и получателя. Далее все наоборот соответственно, ASSURED этот флаг сообщает о том, что соединение установлено уверенно и эта запись не будет стерта по достижении максимально возможного количества трассируемых соединений.
Некоторые особенности протоколов.
TCP соединение всегда устанавливается передачей трех пакетов, которые инициализируют и устанавливают соединение, через которое в дальнейшем будут передаваться данные. Сессия начинается с передачи SYN пакета, в ответ на который передается SYN/ACK пакет и подтверждает установление соединения пакет ACK .
Как только трассировщик увидел первый (SYN ) пакет, то присваивает ему статус NEW . Как только через трассировщика проходит второй пакет (SYN/ACK ), то соединению присваивается статус ESTABLISHED .
С протоколом UDP немного все по другому этот протокол не предусматривает установления и закрытия соединения, но самый большой недостаток — отсутствие информации об очередности поступления пакетов. Но с точки зрения трасировщика все так же как с TCP. Первому пришедшему пакету присваивает ему статус NEW. Как только вы отправляете ответный пакет присваивается статус ESTABLISHED. Единственное отличия что статут ASSURED присваиваться только когда обменялись уже несколькими пакетами.
Логирование применений правил.
iptables дает возможность вести логи отдельных пакетов и событий. Для этого применяется действие LOG .
iptables -A INPUT -p tcp —syn -j LOG —log-level info —log-prefix «INPUT packets «
—log-level Используется для задания уровня журналирования (log level). Полный список уровней вы найдете в руководстве (man) по syslog.conf. Обычно, можно задать следующие уровни: debug , info , notice , warning , warn , err , error , crit , alert , emerg и panic . Логи пишутся в файл syslog.
—log-prefix Ключ задает текст (префикс), которым будут предварять все сообщения iptables . Сообщения со специфичным префиксом затем легко можно найти, к примеру, с помощью grep . Префикс может содержать до 29 символов, включая и пробелы.
Jun 1 17:12:20 debian kernel: INPUT packets IN=eth0 OUT= MAC=02:1e:6d:00:e2:1c:00:01:e8:11:73:69:08:00 SRC=125.94.12.95 DST=194.87.239.104 LEN=40 TOS=0x00 PREC=0x00 TTL=52 ID=38690 PROTO=TCP SPT=12557 DPT=23 WINDOW=1460$ RES=0x00 SYN URGP=0
Популярные команды управления iptables.
iptables -L -n —line-numbers Посмотреть список правил.
-n номер портов и ip в цифровом варианте.
—line-numbers номер строки.
iptables -F Полностью сбросить правила.
iptables -P INPUT ACCEPT
Правила по умолчанию для таблицы INPUT .
iptables -P OUTPUT ACCEPT
Правила по умолчанию для таблицы OUTPUT.
iptables -P FORWARD DROP
Правила по умолчанию для таблицы FORWARD.
iptables -D INPUT 1 Удаление правила по его номеру в цепочке.
iptables -D INPUT -s 123.45.67.89 -j DROP Удаление правила на основе того, что оно делает.
iptables -I INPUT … Вставка (insert) правила в начало цепочки.
iptables -I INPUT 3 … Или можно указать конкретную позицию.
REDIRECT
Действие REDIRECT предназначено для перенаправления пакетов с одного набора портов на другой внутри одной системы, не выходя за пределы хоста
.
Работает REDIRECT только в цепочках PREROUTING
и OUTPUT
таблицы nat
. Таким образом, область применения сводится только к перенаправлению. Чаще всего это используется для прозрачного прокси, когда клиент из локальной сети коннектится на 80 порт, а шлюз редиректит пакеты на локальный порт прокси:
iptables -t nat -A PREROUTING -p tcp —dport 80 -j REDIRECT —to-port 3128
Новые правила автоматически не сохраняются и после перезагрузки сервера не будут действовать. Поэтому после изменения iptables нам нужно сохранить изменения.
iptables — restore > /etc/iptables Загрузить правила из файла.
Способ сохранять и загружать правила на ваше усмотрение. Мы с вами познакомились только с основами теории iptables, возможности настройки конечно гораздо больше. Более подробно о которых расскажем в другой статье.
iptables - утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux версий 2.4 и 2.6. Для использования утилиты iptables требуются привилегии суперпользователя (root).Иногда под словом iptables имеется в виду и сам межсетевой экран netfilter.
1. Что же такое межсетевой экран и зачем он нужен?
Межсетевой экран - комплекс аппаратных или программных средств, осуществляющий контроль и фильтрацию проходящих через него сетевых пакетов на различных уровнях модели OSI в соответствии с заданными правилами.
Основной задачей сетевого экрана является компьютерных сетей или отдельных узлов от несанкционированного доступа. Также сетевые экраны часто называют фильтрами, так как их основная задача - не пропускать (фильтровать) пакеты, не подходящие под критерии, определённые в конфигурации.
2. Принципы работы iptables
Когда пакет приходит на наш межсетевой экран, то он сначала попадает на сетевое устройство, перехватывается соответствующим драйвером и далее передается в ядро. Далее пакет проходит ряд таблиц и затем передается либо локальному приложению, либо переправляется на другую машину.
В Iptables используется три вида таблиц:
- Mangle - обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.
- Nat - эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях.
- Filter - здесь производится фильтрация трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
Соответственно, нас интересует третья таблица Filter. В этой таблицы имеются три встроенные цепочки:
- INPUT - для входящих пакетов.
- FORWARD - для проходящих через данную машину к другой.
- OUTPUT - для исходящих.
Пакет, проходящий через эти цепочки, исходя из правила может быть пропущен (ACCEPT) или отброшен (DROP).
Программа Iptables позволяет редактировать правила через терминал путем ввода команд.
Немного о написании правил:
Каждое правило -- это строка, содержащая в себе критерии, определяющие, подпадает ли пакет под заданное правило, и действие, которое необходимо выполнить в случае выполнения критерия. В общем виде правила записываются примерно так:
Iptables [-t имя-таблицы ] команда [шаблон] [-j действие ]
Опция -t задает таблицу . Если опция упущена, то по умолчанию предполагается использование таблицы filter. Если предполагается использование другой таблицы, то это требуется указать явно.
Далее, непосредственно за именем таблицы, должна стоять команда. Если спецификатора таблицы нет, то команда всегда должна стоять первой.
Команда
определяет действие iptables, например: вставить правило, или добавить правило в конец цепочки, или удалить правило и т.п.
Список команд:
- -A имя-цепочки правило (добавить правило в конец цепочки; ключ --set-counters позволяет установить счётчики пакетов и байтов)
- -I имя-цепочки номер правило (вставить правило в цепочку перед правилом с указанным номером, нумерация с 1; ключ --set-counters позволяет установить счётчики пакетов и байтов)
- -R имя-цепочки
номер
правило
(заменить;
ключ --set-counters позволяет установить счётчики пакетов и байтов) - -D имя-цепочки номер (удалить правило с указанным номером, нумерация с 1)
- -D имя-цепочки правило (удалить правило по текстуальному совпадению)
- -C имя-цепочки
пакет
(тестировать прохождение пакета;
исходящий адрес, адрес назначения, протокол, интерфейс, порты задаются соответствующими ключами) - -L
[имя-цепочки
] (показать список правил; дополнительные ключи:
- -v (вывести дополнительную информацию, в частности, счётчики)
- --exact (показывать счётчики без округления до KB, MB и т.д.)
- --numeric (показывать адреса и номера портов в виде чисел)
- --line-numbers (выводить номера правил)
- -F имя-цепочки (удалить все правила из цепочки)
- -Z имя-цепочки (обнулить счетчики)
- -N имя-цепочки (создать цепочку)
- -X имя-цепочки (удалить пустую цепочку, на которую нет ссылок)
- -P имя-цепочки
действие
(изменить действие по умолчанию: ACCEPT,
DROP, QUEUE, RETURN) - -E старое-имя-цепочки новое-имя-цепочки (переименовать цепочку)
Раздел шаблон задает критерии проверки, по которым определяется подпадает ли пакет под действие этого правила или нет.Здесь можно указать самые разные критерии - IP-адрес источника пакета или сети, сетевой интерфейс. IP-адрес места назначения, порт, протокол и т.д. Остальные параметры для фильтации можно посмотреть в справке по утилите iptables(man iptables)
И наконец действие указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле. Здесь можно заставить ядро передать пакет в другую цепочку правил, "сбросить" пакет, выдать на источник сообщение об ошибке и т.п.
Список некоторых действий:
- ACCEPT - пропустить пакет; просмотр таблицы завершается
- DROP - выбросить молча; просмотр завершается не только для текущей цепочки, но и для других таблиц
- REJECT - выбросить, известив отправителя (--reject-with тип-извещения )
3. Порядок следования сетевого пакета, предназначенного локальному процессу/приложению:
Для локального приложения
Шаг | Таблица | Цепочка | Примечание |
---|---|---|---|
1 | Кабель (т.е. ) | ||
2 | Входной | ||
3 | mangle | PREROUTING | Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр. |
4 | nat | PREROUTING | Преобразование адресов (Destination Network Address Translation). Фильтрация пакетов здесь допускается только в исключительных случаях. |
5 | Принятие решения о маршрутизации. | ||
6 | mangle | INPUT | Пакет попадает в цепочку INPUT таблицы mangle. Здесь внесятся изменения в заголовок пакета перед тем как он будет передан локальному приложению. |
7 | filter | INPUT | Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили. |
8 | Локальный процесс/приложение (т.е., программа-сервер или программа-клиент) |
Важно помнить, что на этот раз пакеты идут через цепочку INPUT, а не через FORWARD.
Порядок движения пакетов, созданных локальными процессами.
От локальных процессов
Шаг | Таблица | Цепочка | Примечание |
---|---|---|---|
1 | Локальный процесс (т.е., программа-сервер или программа-клиент). | ||
2 | Принятие решения о маршрутизации. Здесь решается куда пойдет пакет дальше -- на какой адрес, через какой сетевой интерфейс и пр. | ||
3 | mangle | OUTPUT | Здесь производится внесение изменений в заголовок пакета. Выполнение фильтрации в этой цепочке может иметь негативные последствия. |
4 | nat | OUTPUT | Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра. |
5 | Filter | OUTPUT | Здесь фильтруется исходящий траффик. |
6 | mangle | POSTROUTING | Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра. |
7 | nat | POSTROUTING | Здесь выполняется Source Network Address Translation. Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP. |
8 | Сетевой интерфейс (например, eth0) | ||
9 | Кабель (т.е., Internet) |
Порядок движения транзитных пакетов
Шаг | Таблица | Цепочка | Примечание |
---|---|---|---|
1 | Кабель (т.е. Интернет) | ||
2 | Сетевой интерфейс (например, eth0) | ||
3 | mangle | PREROUTING | Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.. |
4 | nat | PREROUTING | Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях |
5 | Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет -- локальному приложению или на другой узел сети. | ||
6 | mangle | FORWARD | Далее пакет попадает в цепочку FORWARD таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации. |
7 | Filter | FORWARD | В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации. |
8 | mangle | POSTROUTING | Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации. |
9 | nat | POSTROUTING | Эта цепочка предназначена в первую очередь для Source Network Address Translation. Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскарадинг (Masquerading). |
10 | Выходной сетевой интерфейс (например, eth1). | ||
11 | Кабель (пусть будет LAN). |
Есть три различных варианта прохождения пакетов.
1. Из вне на локальную службу (сервер) этого компьютера (INPUT).
2. От локальной службы (сервера) этого компьютера во вне (OUTPUT).
3. Прохождение мимо, шлюзование, мимо этого сетевого интерфейса этого компьютера (FORWARD).
4. Несколько примеров настройки:
пример скрипта:
#задаем переменные для обозначения внешнего и внутреннего сетевого интерфейса
LOCAL_IF="eth0"
INET_IF="eth0:g"
#=======================
# Удалить все правила из цепочки.
#=======================
iptables -F
iptables -X
#=======================
# Устанавливаем политику по умолчанию.
#=======================
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
#=======================
# Создаем правила для всех интерфейсов.
#=======================
# http - открываем 80 порт
iptables -A INPUT -i ALL -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -i ALL -p icmp -j ACCEPT
#=======================
# Создаем правила для внутреннего интерфейса.
#=======================
# ssh - открываем 22
iptables -A INPUT -p tcp -i $LOCAL_IF -m tcp --dport 22 -j ACCEPT
осталось запустить скрипт
примеры отдельных цепочек:
Разрешаем все на внутренних интерфейсах (lo, eth0, eth1 - внутренние интрефейсы)
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
Разрешаем доступ к заданному порту из инета
iptables -A INPUT -p tcp -m tcp -d внешний_ip --dport 80 -j ACCEPT
Открываем протокол
iptables -A INPUT -p gre -j ACCEPT
5. Ссылки на документацию по настройке iptables
http://www.posix.ru/network/iptables/ -статья Дмитрия Кулакова "Настройка межсетевого экрана Iptables"
http://www.opennet.ru/docs/RUS/iptables/ - статья Оскара Андерсона в переводе Андрея Киселева "Руководство по iptables"
http://system-administrators.info/?p=396 - статья "netfilter и iptables в Linux: принципы работы, настройка"
http://www.iptables.ru/ - пошаговое конфигурирование iptables. технической поддержки
Оставьте свой комментарий!