Если у вас вдруг возникнет необходимость ограничить количество сессий для айпи адресов в вашей локальной сети, то после прочтения данной заметки у вас будет готовое решение. Воспользуемся штатными возможностями пакетного фильтра iptables, а именно его модулями connlimit и recent. Модуль connlimit сильно расходует ресурсы машины, и использовать его рекомендуется только в маленьких сетях, да и работает он только с протоколом TCP.
В этом руководстве я опишу как настроить полный NAT из одной сети в другую, на примере двух офисных сетей. Для настройки данного решения вам понадобится iptables с поддержкой NETMAP и пакет iproute2 для настройки маршрутизации. Я настраивал эту схему на базе Linux ubuntu 8.04server, iptables v 1.4.7 и iproute2 v ss071016. Кратко опишу, что же такое патч NETMAP для iptables, он позволяет нам делать двухстороннюю трансляцию сетей в другие сети один в один, например транслировать сеть 1.1.1.1/24 в сеть 2.2.2.2/24, и обратно, транслируя айпи адрес 1.1.1.89/32 в айпи 2.2.2.89/32 и тд.
Не так давно в сети появился сайт с которого можно скачать диски с дополнениями к Ubuntu Linux, некоторое время спустя список дополнений пополнился, на сайте появились сборки Ubuntu ServerPack, Ubuntu DocsPack, и Ubuntu GamePack. В этом небольшом обзоре я расскажу про Ubuntu ServerPack.
Ubuntu ServerPack является набором программного обеспечения для настройки серверных приложений, таких как Mail server, DNS, и тд. Пригодится это набор людям у которых ограничен доступ в интернет, или лимитирован трафик. Так же в набор интегрировано сторонние программное обеспечения для разных нужд. Список приложений и прочего контента вошедшего в сборку в продолжении поста.
Сегодня мы поговорим о OpenVPN. Для начала немного информации о OpenVPN:
OpenVPN — свободная реализация технологии Виртуальной Частной Сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Она позволяет устанавливать соединения между компьютерами находящимися за NAT-firewall без необходимости изменения его настроек. OpenVPN была создана Джеймсом Йонан (James Yonan) и распространяется под лицензией GNU GPL.
Иногда может возникнуть необходимость заблокировать доступ к некоторым сайтам, и внесение их адресов или даже подсетей в фаервол не приносит желаемых результатов, так как продуманные пользователи продолжают посещать их используя веб прокси количество которых так велико что о блокировке их не может быть и речи…. Есть конечно и явные минусы этого способа, но в моем случае минусы приниматься во внимание не стали. Из плюсов стоит отметить полную блокировку сайтов, они не будут работать даже через веб и обычные прокси сервера, с них не будет доставлятся почта и тд.
Правила маршрутизации определяют, куда отправлять IP-пакеты. Данные маршрутизации хранятся в одной из таблиц ядра. Вести таблицы маршрутизации можно статически или динамически. Статический маршрут — это маршрут, который задается явно с помощью команды route. Динамическая маршрутизация выполняется процессом-демоном (routed или gated), который ведет и модифицирует таблицу маршрутизации на основе сообщений от других компьютеров сети. Для выполнения динамической маршрутизации разработаны специальные протоколы: RIP, OSPF, IGRP, EGP, BGP и т. д.
Динамическая маршрутизация необходима в том случае, если у вас сложная, постоянно меняющаяся структура сети и одна и та же машина может быть доступна по различным интерфейсам (например, через разные Ethernet или SLIP интерфейсы). Маршруты, заданные статически, обычно не меняются, даже если используется динамическая маршрутизация.
В этой небольшой статье кратко описано как превратить вашу машину с Linux в точку доступа WI-FI для пользования интернетом например с кпк, смартфона или ноутбука. Так же подразумевается что ваш сетевой беспроводной адаптер уже работает на машине с Linux. Читать далее »
Если у Вас есть Ваша собственная домашняя сеть с двумя или более компьютерами и она подключена к интернету, вы точно знаете о тех проблемах с одновременным доступом к сети, которые практически неизбежны при таком подключении. Самой большой и раздражающей проблемой является разделение ширины канала между всеми участниками сети: когда вы пытаетесь работать через ssh с удалённым сервером, а в этот момент ваша wife/брат/друг решает поглядеть новый и очень классный видео клип с Google Video или YouTube, Ваше соединение замирает и вы можете забыть о комфортабельной работе . В этой маленькой статье я дам вам простое решение этой проблемы, которое позволит вам делать все, что угодно не думая о проблемах разделения трафика!
Для начала замечу, что Ваша сеть должна быть подключена к Internet при помощи Linux сервера. Если Вы подключены через какой-то тупой аппаратный маршрутизатор, то Вам сильно не повезло и вы не сможете воспользоваться приведенным примером. Читать далее »
С помощью этого мощного набора расширений для iptables вы сможете
строить свои правила, основываясь на анализе содержимого пакетов,
диапазона портов и даже создавать ловушки для злоумышленников.
Iptables в Linux позволяет строить весьма мощные брандмауэры, ничуть
не уступающие по своим характеристикам многим коммерческим системам
защиты. По сути своей, iptables основывается на фильтрации пакетов,
проходящих через соединение, и в соответствии с набором правил
определяет ту или иную реакцию брандмауэра на эти пакеты. В самых
простых случаях iptables может использоваться для того, чтобы сбросить
одни пакеты и пропустить другие. При этом обычно анализируются
IP-адрес пакета, номер порта и направление движения пакета. Кроме того
iptables может анализировать статус пакета (NEW, ESTABLISHED, RELATED
и пр. прим. перев.)
1. Введение
Многие часто задаются вопросом как быстро настроить раздачу инетернета на несколько копьютеров в локальной сети, пробросить порты внутрь сети, а так же обеспечить безопасность шлюза. Так же иногда необходимо сделать лимит скорости доступа для некоторых компьтеров, не у всех же резиновый канал в интернет, а компьютеров может быть много, да и если скорость не делить между ними могут возникать проблемы с качеством поставляемых услуг, таких как если один абонент запустит торрент клиент, откроет сотню соединений, остальные абоненты в этот момент ощутят резкое падение скорости, и явно не будут рады. В этой статье рассказано какие программы помогут вам решить эти проблемы, настроить фиксированный доступ в интернет для компьютеров вашей локальной сети и решить проблемы со скоростью доступа раз и навсегда.
Для настройки всех необходимых сервисов я использовал одну программу стороннего разработчика (Master Shaper), все остальные необходимые программы присутствуют в штатных репозитариях Ubuntu Linux.
2. Настройка iptables (firewall & nat)
Начнем пожалуй с настройки NAT и фаервола, так же включим форвардинг и исправим некоторые параметры SYSCTL, для выделения нужного количества ресурсов, если у вас к примеру более 5000 компьютеров в локальной сети.
Реализовать все это можно с помощью одного скрипта, который приведен ниже, все парамтры с комментариями.
Код:
#!/bin/bash
OUT="eth0" # Имя исходящего интерфейса, смотрящего в интернет.
OUTADDR="1.1.1.1" # Адрес исходящего интерфейса
IN="eth1" # Имя входящего интерфейса, смотрящего в локальную сеть
INADDR="2.2.2.2" # Адрес входящего интерфейса
NETWORK="10.0.0.0/8" # Адресация вашей локальной сети
ANYWHERE="0.0.0.0/0" # Назначение, любое.
PORTS="1024:65535" # Порты, которые считаются локальными
MULTICAST="224.0.0.0/4" # Мультикаст пакеты, если у вас не используется оставьте как есть,
# если используется IP TV тогда надо удалить этот пункт
ADMINS="2.2.2.3 2.2.2.4" # IP адреса администраторов, имеют полный доступ на сервер, без каких либо ограничений.
##############################################################################################
# Здесь прописаны параметры запуска\остановки\статуса скрипта. лучше не трогайте =)
# Остановка скрипта
case "$1" in
stop)
echo "Shutting down firewall..."
# Назначение глобальных политик фаервола
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
# Загружаем модули, для корректной работы VPN, Active ftp, DCC in IRC которые будут идти через нат.
modprobe ip_nat_ftp
modprobe ip_nat_pptp
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
# Изменение параметров SYSCTL
# Включение форвардинга
echo 1 > /proc/sys/net/ipv4/ip_forward
# Включение форвардинга для VPN
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
# Увеличение размера очередей
echo 32000000 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
# Время ожидания до закрытия соединения
echo 14400 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
# Время ожидания до посылки FIN пакета
echo 60 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
# Время ожидания до посылки FIN пакета
echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
# Для защиты от syn флуда
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Увеличиваем размер backlog очереди
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog
# Число начальных SYN и SYNACK пересылок для TCP соединения
echo 4 > /proc/sys/net/ipv4/tcp_synack_retries
echo 4 > /proc/sys/net/ipv4/tcp_syn_retries
#Какие порты использовать в качестве локальных TCP и UDP портов
echo "16384 61000" > /proc/sys/net/ipv4/ip_local_port_range
Сколько секунд ожидать приема FIN до полного закрытия сокета
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
# Как часто посылать сообщение о поддержании keep alive соединения
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
# Сколько пакетов проверки keepalive посылать, прежде чем соединение будет закрыто.
echo 2 > /proc/sys/net/ipv4/tcp_keepalive_probes
# Зaпрещаем TCP window scaling
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
# Запрещаем selective acknowledgements, RFC2018
echo 0 > /proc/sys/net/ipv4/tcp_sack
# Запрещаем TCP timestamps, RFC1323
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
# Уличиваем размер буфера для приема и отправки данных через сокеты.
echo 1048576 > /proc/sys/net/core/rmem_max
echo 1048576 > /proc/sys/net/core/rmem_default
echo 1048576 > /proc/sys/net/core/wmem_max
echo 1048576 > /proc/sys/net/core/wmem_default
# Через какое время убивать соединеие закрытое на нашей стороне
echo 1 > /proc/sys/net/ipv4/tcp_orphan_retries
# Temporary eth0 completely disabled
#iptables -A INPUT -i $OUT -j DROP
# Admins - full control (even dagerous)
for admin_ips in $ADMINS; do
iptables -A INPUT -s $admin_ips -m state --state NEW -j ACCEPT
done
# Silently Drop Stealth Scans
# All of the bits are cleared
iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
После настройки этого скрипта под себя у вас выйдет фаервол с политикой DROP, и NAT.
3. Установка и настройка Shaper.
Скачайте с сайта разработчика дистрибутив программы .
В архиве вы найдете подробное описание продукта, а так инструкции по использованию и установки.
Программа имеет WEB интерфейс для работы и настройки, а так же серверную часть.
Master Shaper позволяет создавать тарифы, возможна настройка приоритезации трафика, очень гибкая и функциональная система.
Настройка и установка займет у вас совсем не много времени.
netfilter (встроенные в ядро linux в отличие от ipchains умеет отслеживать соединения (stateful packet filtering), при этом пакеты обязательно дефрагментриуются; цепочки правил объединяются в таблицы различного назначения (filter, nat, mangle), используются специальные модули для различных протоколов (в т.ч. прикладного уровня). Также позволяет менять заголовки пакетов и помечать пакеты для дальнейшего использования при маршрутизации и управлении трафиком. В основном, работает на межсетевом уровне TCP/IP, но захватывает транспортный уровень (TCP, UDP)и уровень доступа к сети (MAC адреса).Одновременное использование данных из 2 пакетов по-прежнему невозможно, для настоящей фильтрации на прикладном уровне пользуйтесь прокси серверами.
В статье описываются:
предварительные условия использования netfilter
основные понятия (таблицы, цепочки, правила) и путь пакета
отслеживание соединений
утилита управления цепочками iptables
действия (target)
шаблоны (match)
утилиты iptables-save и iptables-restore
сервис в Red Hat Linux
примеры и советы
Предварительные условия
Для работы netfilter необходимо иметь ядро 2.3.15 или более новое,
при генерации которого включены CONFIG_NETFILTER, CONFIG_IP_NF_IPTABLES, CONFIG_IP_NF_FILTER (таблица filter), CONFIG_IP_NF_NAT (таблица nat), CONFIG_BRIDGE_NETFILTER, а также многочисленные дополнительные модули: CONFIG_IP_NF_CONNTRACK (отслеживание соединений), CONFIG_IP_NF_FTP (вспомогательный модуль для отслеживания FTP соединений), CONFIG_IP_NF_MATCH_* (дополнительные типы шаблонов соответствия пакетов: LIMIT, MAC, MARK, MULTIPORT, TOS, TCPMSS, STATE, UNCLEAN, OWNER), CONFIG_IP_NF_TARGET_* (дополнительные действия в правилах:REJECT, MASQUERADE, REDIRECT, LOG, TCPMSS), CONFIG_IP_NF_COMPAT_IPCHAINS для совместимости с прочие CONFIG_IP_NF_* и CONFIG_IP6_NF_*.Полезно также указать CONFIG_PACKET.
Наличие netfilter в ядре определяется по файлам /proc/net/ip_tables_names (список используемых таблиц), /proc/net/ip_tables_targets (2.6) и /proc/net/ip_tables_matches (2.6).
Управление осуществляется с помощью утилиты iptables.
Функциональность netfilter может расширяться с помощью модулей ядра. Головной модуль ядра называется iptable_filter, модуль поддержки утилиты iptables называется ip_tables, вспомогательные модули обычно имеют префикс “ipt_” (ipt_state, ipt_REJECT, ipt_LOG; хотя — ip_conntrack). Большинство модулей загружается автомагически, но некоторые всё же приходиться загружать вручную (ip_conntrack_ftp — иначе может не работать в режиме Active; ip_conntrack_irc — иначе может не работать отсылка файлов по DCC; ip_nat_ftp; ip_nat_irc).
Управление дополнительными модулями ядра осуществляется с помощью разделяемых библиотек(см. /lib/iptables/) для утилиты iptables. netfilter позволяет эмулировать ipfwadm и ipchains с помощью модулей ядра (с некоторых пор перестали включаться в стандартное ядро), при этом модуль ip_tables необходимо
выгрузить.
Таблицы, цепочки, путь пакета
Каждый проверяемый IP-пакет проходит по цепочке (”сквозь строй”) правил, определяющих, что с ним делать. Правило состоит из шаблона, которому должен соответствовать пакет, и действия. Каждая цепочка имеет действие по умолчанию (политику).В отличие от ipchains правила входной цепочки (INPUT) применяются после принятия решения о том, что это “наш” пакет и маршрутизировать его не надо; правила выходной цепочки (OUTPUT) применяются не только к исходящим наружу пакетам, но и к передаваемым на локальный интерфейс. Правила цепочки FORWARD применяются только к транзитным пакетам. Имеется возможность добавлять к набору свои цепочки. netfiler обрабатывает несколько наборов (таблиц) цепочек: таблица filter приблизительно соответствует набору цепочек в ipchains, таблица nat обеспечивает функциональность подстановки адресов (только первый пакет соединения обрабатывается полностью, в последующих пакетах соединения адреса подменяются по аналогии с первым пакетом, остальные действия не производятся), таблица mangle — преобразование пакетов (манипулирование TOS, TTL, маркеры).
Приблизительная схема обработки пакетов (взята из NAG2, по-моему, ради красоты
картинки художник пожертвовал истиной: пропал маршрут из второй точки маршрутизации на localhost,он не проходит через FORWARD):
В таблицах nat и mangle имеются цепочки PREROUTING и POSTROUTING.Правила цепочки PREROUTING применяется к пакетам сразу после получения пакета на входе интерфейса перед выбором маршрута, а правила цепочки POSTROUTING непосредственно перед выводом пакета через интерфейс. В таблице nat нет цепочек INPUT и FORWARD.
Реальная последовательность обработки входящего пакета, предназначенного для локального процесса такова:
просматривается цепочка PREROUTING таблицы mangle (используется для преобразования пакетов),здесь же происходит отслеживание соединений
просматривается цепочка PREROUTING таблицы nat (используется для DNAT,
фильтровать здесь не стоит)
маршрутизация: если пакет надо маршрутизовать вовне, то переходим к обработке проходящего пакета
просматривается цепочка INPUT таблицы mangle
просматривается цепочка INPUT таблицы filter
Реальная последовательность обработки пакета, уходящего с нашего хоста такова:
маршрутизация: определение исходящего адреса, адреса назначения, используемого интерфейса; если пакет маршрутизируется внутрь, то переходим к предыдущей процедуре (п. 1 или 4?)
просматривается цепочка OUTPUT таблицы mangle, фильтровать здесь не стоит,
здесь же происходит отслеживание локально создаваемых соединений
просматривается цепочка OUTPUT таблицы nat (NAT для локально сгенерированных пакетов)
повторная маршрутизация, т.к. в таблицах mangle и nat пакет мог быть изменён; если пакет маршрутизируется внутрь, то переходим к предыдущей процедуре (п. 1 или 4?)
просматривается цепочка POSTROUTING таблицы nat (используется для SNAT, фильтровать здесь не стоит)
Реальная последовательность обработки проходящего пакета (от п.3 первой процедуры):
просматривается цепочка FORWARD таблицы mangle
просматривается цепочка FORWARD таблицы filter
повторная маршрутизация, т.к. в таблице mangle пакет мог быть изменён;
если пакет маршрутизируется внутрь, то переходим к первой процедуре (п. 1 или 4?)
просматривается цепочка POSTROUTING таблицы nat (используется для SNAT и Masquerading, фильтровать здесь не стоит)
Текст и иллюстрации документации netfilter имеют множество разночтений, оставляя свободу воли (то ли пакетов, то ли разработчиков . Автор iptables-tutorial рекомендует использовать тестовый набор правил, записывающий в журнал имя каждой пройденной пакетом цепочки и таблицы.
Отслеживание соединений
netfilter отслеживает соединения с помощью модуля ip_conntrack (имеет параметр hashsize, задающий размер хеша) и протоколозависимых модулей (icmp, tcp, ftp, tftp, irc, amanda, sctp) при обработке цепочки PREROUTING таблицы nat (для локально сгенерированных пакетов при обработке цепочки OUTPUT) и хранит их в специальной таблице. При этом все пакеты обязательно дефрагментируется. Соединения удаляются из таблицы по истечению интервала ожидания при отсутствии очередного пакета. При выгрузке модуля (см. IPTABLES_MODULES_UNLOAD в /etc/sysconfig/iptables-config) таблица соединений очищается. Рассматриваемый пакет может находиться с точки зрения настройки (у ядра своя таблица состояний) в одном из 4 состояний относительно ранее отслеженных соединений:
NEW (замечен первый пакет в соединении; обычно это пакет с флагом SYN, но может быть и без него: в результате удаления из таблицы по истечению периода ожидания ранее установленного соединения или балансировки нагрузки по нескольким сетевым экранам; однако, см. ниже /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_loose)
ESTABLISHED (после получения ответного пакета соединение переходит в это состояние из состояния NEW или RELATED; в частности, второй пакет при установлении TCP-соединения (SYN/ACK) уже находится в состоянии ESTABLISHED; для ICMP: Echo, Timestamp, Information, Address mask; [ответы ICMP также могут иметь это состояние, если они являются результатом посланного нами пакета?])
RELATED (соединение, порождённое соединением в состоянии ESTABLISHED, например, передача ftp данных, порождённая управляющим ftp соединением, или DCC для IRC или ICMP сообщение об ошибке; требуется протоколозависимый модуль)
INVALID (классифицировать пакет не удалось; например, ICMP ответ на несуществующий пакет; такие пакеты рекомендуется выбрасывать)
Пакет в состоянии NEW с точки зрения conntrackможет быть продолжением реального соединения (т.е. не иметь бита SYN), например, в результате изменения цепочек, загрузки модуля и т.д.. В любом случае, при “отлове” подозрительных соединений необходимо предусмотреть сброс попыток соединений, в которых мошенниками подставлен наш адрес:
-A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
Максимально возможное число отслеживаемых соединений задаётся в файле /proc/sys/net/ipv4/ip_conntrack_max (каждое соединение занимает 350 байт невытесняемой памяти). Набор заплаток tcp-window-tracking для ядра 2.4 (входит в ядро 2.6) обеспечивает возможность задать значения по умолчанию для интервалов ожидания при удалении записи о соединении из таблицы для различных ситуаций в /proc/sys/net/ipv4/netfilter/ip_conntrack_*_timeout* (в секундах). Мне пришлось записать 600 в ip_conntrack_tcp_timeout_close[_wait] по всей цепочке, иначе завершение соединения блокировалось (FIN/ACK от клиента или RST от сервера), часть завершающих пакетов всё равно “режется” (клиент закрывает полузакрытый сокет только когда ему требуется следующее соединения, а запись о соединении из таблицы conntrack уже удалена, а увеличивать ip_conntrack_tcp_timeout_close до суток не хочется). Также позволяет “порулить” поведением машины состояний через переменные (/proc/sys/net/ipv4/netfilter/):
ip_conntrack_tcp_be_liberal
все пакеты, не попадающие в окно, считаются INVALID
только RST пакеты, не попадающие в окно, считаются INVALID (пришлось поставить)
ip_conntrack_log_invalid (выводить в журнал INVALID пакеты)
ip_conntrack_tcp_loose (при “подхватывании” уже установленного
соединения сколько пакетов требуется в обоих направлениях для подтверждения;если 0, то установленное соединение не подхватывается вовсе; по умолчанию — 3)
ip_conntrack_max_retrans (число повторных пакетов без подтверждения ACK, которое требуется для удаления соединения из таблицы после дополнительного
ожидания ip_conntrack_timeout_max_retrans секунд; по умолчанию — 3)
Таблицу текущих соединений можно посмотреть в файле /proc/net/ip_conntrack
тип протокола
номер протокола
осталось секунд до удаления этого соединения из таблицы
[состояние-соединения-в-терминах-ядра]
исходящий адрес
адрес назначения
исходящий порт или ICMP-тип
порт назначения или ICMP-код
[ICMP-идентификатор]
[UNREPLIED] (соединение в состоянии ESTABLISHED, но ждёт подтверждения от протоколозависимого модуля, например, это был второй пакет при установлении TCP-соединения)
ожидаемые адреса и порты (ICMP-тип и код) ответного пакета
[ASSURED] (соединение перешло в состояние ESTABLISHED и протоколозависимый модуль подтвердил наличие соединения, например, завершён третий этап установления TCP-соединения)
use=1 (?)
Управление цепочками
Управление цепочками производится с помощью программы iptables.
После загрузки определены цепочки (все с политикой ACCEPT) INPUT, FORWARD и OUTPUT в таблице filter; PREROUTING, POSTROUTING и OUTPUT в таблице nat;
PREROUTING, INPUT, FORWARD, OUTPUT и POSTROUTING в таблице mangle. Удалить их нельзя. Формат команды:
iptables [-t имя-таблицы] команда [шаблон] [-j действие]
Команды:
-A имя-цепочкиправило(добавить правило в конец цепочки; ключ –set-counters позволяет установить счётчики пакетов и байтов)
-I имя-цепочкиномерправило (вставить правило в цепочку перед правилом с указанным номером, нумерация с 1; ключ –set-counters позволяет установить счётчики пакетов и байтов)
-R имя-цепочкиномерправило (заменить;
ключ –set-counters позволяет установить счётчики пакетов и байтов)
-D имя-цепочкиномер (удалить правило с указанным номером, нумерация с 1)
-D имя-цепочкиправило (удалить правило по текстуальному совпадению)
Действия (действие в недопустимом месте эквивалентно DROP), при завершении
просмотра текущей цепочки, производится просмотр следующих по порядку таблиц:
ACCEPT — пропустить пакет; просмотр таблицы завершается
DROP — выбросить молча; просмотр завершается не только для текущей цепочки, но и для других таблиц
REJECT — выбросить, известив отправителя (–reject-with тип-извещения); типы извещения: tcp-reset (только для TCP!), icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable (по умолчанию), icmp-proto-unreachable, icmp-net-prohibited или icmp-host-prohibited; для цепочек INPUT, FORWARD и OUTPUT; просмотр завершается не только для текущей цепочки, но и для других таблиц
LOG — записать в журнал ; приоритет по умолчанию — warning (–log-level приоритет); источник всегда — kern; каждая запись содержит имена входного (IN=) и выходного (OUT=) интерфейсов, MAC адреса (MAC=), исходный IP-адрес (SRC=), IP-адрес назначения (DST=), длину пакета,
флаги и указатели TCP (SYN, URGP=, WINDOW=), ToS (TOS=), ? (PREC=), TTL (TTL=), флаги IP (DF), идентификатор (ID=), протокол (PROTO=), порты источника (SPT=) и назначения (DPT=), ? (RES=); в начале записи можно вставить свою строку длиной до 29 символов (–log-prefix “строка“);
можно добавить в журнал номера TCP-последовательностей (–log-tcp-sequence), TCP опции (–log-tcp-options) и IP опции (–log-ip-options)
ULOG — записать в собственный журнал (используется интерфейс netlink и групповая рассылка; позволяет делать такие вещи, как запись журнала в MySQL, обработка в реальном времени и т.д. (см. проект );
параметры: –ulog-nlgroup netlink-группа, –ulog-prefix “строка”, –ulog-cprange длина, –ulog-qthreshold пакетов-в-группе
имя пользовательской цепочки — происходит переход на выполнение подпрограммы (пользовательской цепочки), по завершении её выполняется следующее правило, если в подпрограмме не было выполнено какое завершающее просмотр действие (ACCEPT, DROP, REJECT)
RETURN — завершение просмотра текущей цепочки; если это была пользовательская цепочка, то происходит возврат к месту вызова; для базовой цепочки производится действие по умолчанию
QUEUE — поставить пакет в очередь на обработку пользовательской программой
(см. Netfilter Hacking HOW-TO)
действия только для таблицы nat:
DNAT — подмена в пакете адреса назначения; проверка производится только для первого пакета соединения (цепочка PREROUTING или OUTPUT), остальные пакеты преобразуются “по аналогии”; ответные пакеты преобразуются соответственно; новый адрес назначения (или адреса для балансировки нагрузки) задаётся параметром –to-destination IP-адрес[:порт][-IP-адрес]; используется для “проброса” соединения из интернет на сервер, находящийся внутри; чтобы к такому серверу можно было обратиться изнутри сети по внешнему адресу, необходимо в дополнение к DNAT преобразовать исходный адрес (SNAT), иначе ответы сервера пойдут клиенту напрямую минуя обратное преобразование DNAT, а клиент их не примет; к сожалению, при этом в журнал сервера не попадут реальные IP адреса клиентов; также при этом легко получить open relay из своего SMTP сервера; поэтому SNAT необходимо ограничить локальными исходящими адресами; проблему можно решить, сделав отдельный DNS сервер для локальной сети; и не забудьте добавить аналогичное (DNAT) правило в цепочку OUTPUT для доступа к серверу с самого сетевого экрана (если это необходимо) и правила в таблицу filter
SNAT — подменить в пакете исходящий адрес на указанный или из указанного интервала, при необходимости исходящий номер порта на случайный номер своего порта из заданного интервала, занести эту информацию в таблицу, чтобы при получении ответа было можно проделать обратную операцию; новый исходящий адрес (или адреса для балансировки нагрузки) задаётся параметром –to-source IP-адрес[-IP-адрес][:порт-порт];
проверка производится только для первого пакета соединения (цепочка POSTROUTING), остальные пакеты преобразуются “по аналогии”; ответные пакеты преобразуются соответственно; используется для скрытия структуры внутренней сети при выходе пользователей в интернет или при нехватке общемаршрутизируемых IP-адресов;
если свой IP-адрес получается динамически, то лучше воспользоваться MASQUERADE;
MASQUERADE — подменить в пакете исходящий адрес на адрес своего исходящего интерфейса (этот адрес может выделяться динамически по DHCP или PPP), при необходимости исходящий номер порта на случайный номер своего порта из заданного интервала, занести эту информацию в таблицу, чтобы при получении ответа было можно проделать обратную операцию; интервал портов задаётся параметром –to-ports порт-порт; проверка производится только для первого пакета соединения (цепочка POSTROUTING), остальные пакеты преобразуются “по аналогии”; ответные пакеты преобразуются соответственно; таблица очищается при отключении интерфейса; используется для скрытия структуры внутренней сети при выходе пользователей в интернет
или при нехватке общемаршрутизируемых IP-адресов при динамическом получении внешнего IP-адреса; более общее средство — см. SNAT
REDIRECT — подмена в пакете номера порта назначения на указанный порт, адрес назначения на свой адрес (?); локальные пакеты перенаправляются на адрес 127.0.0.1; проверка производится только для первого пакета соединения (цепочка PREROUTING или OUTPUT),
остальные пакеты преобразуются “по аналогии”; ответные пакеты преобразуются соответственно; новый порт (интервал портов?) назначения задаётся параметром –to-ports порт-порт;
используется для организации
MIRROR — удалён в ядре 2.6 (меняет местами исходящий IP адрес и IP адрес назначения; предполагалось удивить хакеров)
действия только для таблицы mangle:
CLASSIFY — установка маркера классификации при управлении трафиком (tc, qdiscs), цепочка POSTROUTING (–set-class MAJOR:MINOR)
TOS — установка или изменение полей TOS (–set-tos тип-сервиса);
типы сервиса: Normal-Service, Minimize-Cost, Maximize-Reliability, Maximize-Throughput, Minimize-Delay; только в цепочках FORWARD и OUTPUT; используется при
DSCP — установка или изменение полей Differentiated Services, развитие ToS(–set-dscp число или –set-dscp-class класс)
ECN — сброс полей ECN (–ecn-tcp-remove)
TTL — изменение TTL (–ttl-set число; –ttl-dec число; –ttl-inc число); можно использовать увеличение на 1 в дополнение к NAT,
чтобы скрыть наличие сетевого экрана, или установку в одно и то же значение, чтобы скрыть внутреннюю структуру сети
TCPMSS — изменение размера TCP сегмента (Maximum Segment Size) явно
(–set-mss байт) или с привязкой к размеру MTU (–clamp-mss-to-pmtu устанавливает MSS равным Path MTU — 40);
только в момент установления соединения (т.е. у пакета д.б. установлен флаг SYN); особенно полезен, если ISP блокирует сообщения ICMP о необходимости фрагментации, а в результате при пересылке маленьких блоков (ssh) всё работает, а когда доходит до больших блоков (scp), то соединение “подвисает”
MARK — устанавливается маркер данного пакета (–set-mark число);
сохраняется только в пределах хоста; используется при
NETMAP — адреса из указанной исходящей сети преобразуются в новые указанные адреса (–to); номера хостов внутри сети не изменяются; используется вместо перенумерации сети; использовать в цепочке PREROUTING; аналогичный результат (но более эффективно) можно получить с помощью
SAME — адреса из указанной исходящей сети преобразуются в новые указанные адреса (–to); номер хоста изменяется (интервал новых IP-адресов меньше исходного), но только при необходимости; использовать в цепочке PREROUTING
имя цепочки, определяемой модулем расширения
пустое действие — только увеличить счетчики байтов и пакетов и перейти к следующему правилу в цепочке, счетчики — 64-битные
Шаблоны
Шаблон правила может включать (если в качестве адреса хоста указывается
имя, соответствующее нескольким адресам, то добавляется соответствующее
количество правил; восклицательный знак инвертирует шаблон; несколько подшаблонов действуют как “И”):
–proto[col] | -p [!] протокол
(можно указывать имя протокола (см. /etc/protocols) или номер протокола; имя протокола ALL означает tcp или udp или icmp)
–source | -s | –src [!] address[/mask]
(маска может быть записана как в виде 4-х десятичных чисел через точку, так и указанием длины маски сети)
–destination | -d | –dst [!] address[/mask]
–in-interface | -i [!] имя[+] (имя входного интерфейса;
например, ppp0, lo, eth0; шаблон “+” — соответствует любой подстроке; можно использовать только в цепочках INPUT, FORWARD и PREROUTING)
–out-interface | -o [!] имя[+] (имя выходного интерфейса;
например, ppp0, lo, eth0; шаблон “+” — соответствует любой подстроке; можно использовать только в цепочках OUTPUT, FORWARD и POSTROUTING)
[!] –fragment | -f (только для последующих кусков фрагментированных пакетов; при использовании отслеживания соединений все пакеты
дефрагментируются при обработке цепочки PREROUTING таблицы nat)
–match | -mимя-модуля-расширения (модули tcp, udp и icmp
приводятся в действие неявно, при использовании шаблона –protocol)
Параметры модуля расширения tcp
–source-port [!] [port[:port]]
(можно использовать номера портов или имена сервисов из /etc/services; если опустить первый порт интервала, то подразумевается 0; если опустить последний порт интервала, то подразумевается 65535)
–destination-port [!] [port[:port]]
–tcp-flags [!] маска-флагов обязательные-флаги
(маска-флагов — список через запятую проверяемых флагов (SYN, ACK, FIN, RST, URG, PSH, ALL, NONE); обязательные-флаги — список через запятую флагов, которые д.б. установлены в пакете; остальные флаги из числа проверяемых должны быть сброшены)
[!] –syn | -y (пакеты с установленным флагом SYN, эквивалент записи “–tcp-flags SYN,RST,ACK SYN”; отрицание обеспечивает соответствие пакетов, не имеющих флагов SYN и ACK одновременно)
[!] –tcp-option номер-опции
Параметры модуля расширения udp
–source-port [!] [port[:port]]
–destination-port [!] [port[:port]]
Параметры модуля расширения icmp
–icmp-type [!] тип-сообщения[/код]
(можно использовать номера или имена типов и кодов: 8, 8/0, network-redirect;
чтобы получить список допустимых имён, выполните команду: iptables -p icmp –help)
Параметры модуля расширения mac
–mac-source [!] MAC-адрес (только в цепочках PREROUTING, FORWARD
и INPUT)
Параметры модуля расширения mark
–mark [!] число (маркер пакета (число без знака) устанавливается действием MARK, только в пределах данного хоста)
Параметры модуля расширения limit (защита от DoS атак или ограничение записей в журнал; используется модель дырявого ведра: задаётся объём ведра и скорость его самоопустошения, шаблону соответствуют пакеты, помещающиеся в ведро):
[!] –limit штук/единица-времени (задаёт скорость самоопустошения ведра; допустимы следующие единицы времени: second, minute, hour, day)
–limit-burst штук (задаёт ёмкость ведра)
Параметры модуля расширения iprange (задание интервалов IP-адресов)
[!] –src-range начальныйIPадрес-конечныйIPадрес
[!] –dst-range начальныйIPадрес-конечныйIPадрес
Параметры модуля расширения multiport (список портов, до 15 портов)
–source-port список,портов,через,запятую
–destination-port список,портов,через,запятую
–port список,портов,через,запятую (из порта в порт с тем же номером)
Параметры модуля расширения length (длина пакета)
[!] –length от:до
Параметры модуля расширения owner (только в цепочке OUTPUT, не всегда срабатывает)
–uid-owneruid
–gid-ownergid
–pid-ownerpid
–sid-ownersession-id
Параметры модуля расширения pkttype
–pkt-type [!] {unicast | broadcast | multicast}
Параметры модуля расширения recent (динамическая генерация правил по событию;
ведётся несколько именованных списков событий, для каждого события записывается время, исходящий адрес, исходящий порт, число пакетов, TTL)
–nameимя (какой список использовать)
[!] –set (добавить событие в список)
[!] –rcheck (проверить, что исходящий адрес данного пакета имеется в списке
событий)
[!] –update (проверить, что исходящий адрес данного пакета имеется в списке
событий и обновить время)
[!] –remove (проверить, что исходящий адрес данного пакета имеется в списке
событий и удалить)
–secondsсекунд (только в сочетании с –rcheck или –update; какой интервал
времени допустим)
[!] –hitcountштук (только в сочетании с –rcheck или –update;
можно в сочетании с –seconds; соответствие после указанного числа пакетов)
[!] –rttl (дополнительно проверить, что TTL такой же)
–rdest (сохранить в списке адрес и порт назначения)
Параметры модуля расширения state (состояние соединения согласно conntrack):
Параметры модуля расширения tos (также имеются модуля dscp, ecn)
–tos [!] тип-сервиса (Normal-Service, Minimize-Cost,
Maximize-Reliability, Maximize-Throughput, Minimize-Delay; это только названия!)
Параметры модуля расширения tcpmss (Maximum Segment Size in TCP, только для
пакетов с SYN или SYN/ACK)
–mss [!] от:до
Параметры модуля расширения ttl
–ttlчисло
Модуль расширения unclean не имеет параметров. Позволяет отлавливать “неправильные” пакеты.
Параметры модуля расширения ah (IPSec, необходимо также указать номер протокола 51)
–ahspi Security-Parameter-Index
Параметры модуля расширения esp (IPSec, необходимо также указать номер протокола 50)
–espspi Security-Parameter-Index
<Утилиты iptables-save и iptables-restore
Тщательно составленные и отлаженные цепочки необходимо сохранять с помощью утилиты iptables-save, выводит на stdout, параметры:
-c (выводить счётчики)
-t имя-таблицы (выводить только указанную таблицу)
Вывод утилиты имеет простой текстовый формат, допускающий редактирование.
Комментарии начинаются с символа ‘#’. Таблицы выводятся по очереди, перед каждой таблицей в отдельной строке выводится имя таблицы после символа ‘*’, затем перечисляются имеющиеся в таблице цепочки, каждое имя цепочки выводится в отдельной строке после символа ‘:’, после имени выводится политика цепочки и счётчики, затем выводятся все правила таблицы, каждое правило выводится отдельной строкой, в конце таблицы выводится ключевое слово “COMMIT”.
Правила выводятся в формате утилиты iptables, только не указывается имя таблицы.
Сохранённые ранее цепочки можно загрузить в ядро с помощью утилиты iptables-restore (читает с stdin, по умолчанию восстанавливаемые таблицы сбрасываются, параметры):
-c (восстанавливать счётчики)
-n (не сбрасывать восстанавливаемые таблицы)
Сервис в Red Hat Linux
В дистрибутивах Red Hat Linux имеется сервис iptables (управляемый обычными chkconfig и service) в /etc/rc.d/init.d с функциями:
start (настройки берутся из /etc/sysconfig/iptables — делаются
либо с помощью функции save, либо iptables-save)
stop
restart
status
save (сохранить текущие настройки в /etc/sysconfig/iptables)
panic (полная блокировка, использовать в случае атаки)
Примеры и советы
При настройке правил на удалённом хосте рекомендуется оставлять себе пути
отступления, например, перед внесением изменений добавить в crontab строку, возвращающую настройки обратно, если что-то пойдёт не так (/sbin/service iptables stop).
Часто используемые правила должны быть в начале цепочки. Для дальнейшей оптимизации цепочка разбивается на подцепочки (например, по типу протокола).
Пример настройки рабочей станции или небольшого внутреннего сервера:
*filter:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0] :icmp_packets — [0:0]
# ICMP (other types covered by RELATED)
-A icmp_packets -p icmp –icmp-type 8 -j ACCEPT
-A icmp_packets -p icmp –icmp-type 11 -j ACCEPT
# replies
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
#
-A INPUT -p icmp -j icmp_packets
-A INPUT -i lo -j ACCEPT
# CUPS server
#-A INPUT -i eth0 -p udp -m udp –dport 631 -j ACCEPT
# SSH server
-A INPUT -i eth0 -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
# to prevent mass logging
A INPUT -i eth0 -p udp -d широковещательный-адрес –sport 137:139 –dport 137:139 -j DROP
-A INPUT -i eth0 -p udp -d 255.255.255.255 –dport 445 -j DROP
-A INPUT -j LOG
#
-A OUTPUT -p ALL -s 127.0.0.1 -j ACCEPT
-A OUTPUT -p ALL -s свой-адрес -j ACCEPT
-A OUTPUT -j LOG
COMMIT Ссылки
Пропишите этот скрипт в автозагрузку отредактировав файл /etc/rc.local
Должно получится следующее:
Код:
#!/bin/sh -e
/home/vpn-firewall.sh
exit 0
Запустите скрипт фаервола, он должен написать «vpn firewall loaded OK.»
Код: /home/vpn-firewall.sh
На этом настройка закончена, можете настраивать windows клиенты, никаких особенных параметров не требуется, просто создаете подключение vpn с адресом вашего сервера, на вкладке «Безопасность» нужно снять галочку с пункта «Требуется шифрование данных (иначе отключаться)», а так же логином и паролем которые вы вписали в конфигурационный файл.