Новые книги

Эта книга для тех, кто давно связан с разработкой программного обеспечения. Или для тех, кто еще думает выбрать программирование своей профессией. Или для тех, кто просто привык думать и размышлять о происходящем в мире информационных технологий.

Не секрет, что основная масса софтостроения сосредоточена в секторе так называемой корпоративной разработки: от комплексных информационных систем предприятия до отдельных приложений. Поэтому немалая часть сюжетов касается именно Enterprise Programming.

Из текста вы вряд ли узнаете, как правильно склеивать многоэтажные постройки из готовых компонентов в гетерогенной среде, проектировать интерфейсы, синхронизировать процессы или писать эффективные запросы к базам данных. Подобные темы будут лишь фоном для рассказа о софтостроительной «кухне». При определенной доле любопытства вы сможете убедиться, что новое – это хорошо забытое старое, узнать, как устроены некоторые сложные системы, когда следует применять разные технологии, почему специалистам в информатике надо особенно тщательно фильтровать поступающую из множества источников информацию, и многое другое, что вы, возможно, еще не знали или уже знаете, но с другой стороны.

В книге мне хотелось показать наш софтостроительный мир разработки корпоративных информационных систем не с парадного фасада описаний программных сред, подходов и технологий, а изнутри. Насколько это получилось – судить читателю.
Сегодня рекламе не доверяют 60 % населения, при этом эмоциональным советам друзей доверяют почти все. В эпоху, когда свадебный ролик на YouTube за несколько минут могут посмотреть 50 000 человек, а остроумную фразу в Twitter перепостить миллионы, пора по-новому отнестись к социальным сетям, интерактивным онлайн-сервисам и популярным сайтам.

Авторы «Эффекта стрекозы» выбрали самые громкие интернет-кейсы, изучив нашумевшие промо-кампании (здесь есть истории о Бараке Обаме, спасенных жизнях, волшебных купонах и чудесных стартапах, которые мгновенно стали легендарными), и на их основе разработали специальный подход к созданию маркетинговой стратегии в виртуальном мире. Если вы хотите продвинуть продукт, услугу или некоммерческий проект через Интернет и сделать это высококлассно, то… приглашаем в полет!

IP Firewall Chains (2.2 Kernels)

IP Firewall Chains (ядра 2.2)

Большинство аспектов Linux развиваются, чтобы удовлетворить увеличивающиеся запросы пользователей. IP firewall не исключение. Традиционная версия IP firewall прекрасна для большинства прикладных программ, но может быть неэффективен, чтобы конфигурировать сложные среды. Чтобы решить эту проблему, был разработан новый метод конфигурирования IP firewall и связанных свойств. Этот новый метод был назван "IP Firewall Chains" и впервые был выпущен для общего использования в ядре Linux 2.2.0.

IP Firewall Chains разработан Paul Russell и Michael Neuling. Paul описал IP Firewall Chains в IPCHAINS-HOWTO.

IP Firewall Chains позволяет Вам разрабатывать классы правил firewall, к которым Вы можете затем добавлять и удалять компьютеры или сети. Такой подход может улучшать эффективность firewall в конфигурациях, в которых имеется большое количество правил.

IP Firewall Chains поддерживается серией ядер 2.2 и доступен как патч для серии 2.0.* ядер. HOWTO описывает, где получить патч и дает большое количество полезных советов относительно того, как использовать утилиту конфигурации ipchains.

Использование ipchains

Имеются два пути, которыми Вы можете использовать ipchains. Первый путь состоит в том, чтобы использовать скрипт ipfwadm-wrapper, который является заменой ipfwadm, управляющий программой ipchains в фоновом режиме. Если Вы хотите сделать именно это, то не читайте дальнейшее описание, а вернитесь к описанию ipfwadm, и подставьте везде ipfwadm-wrapper. Это будет работать, но нет никакой гарантии, что скрипт будет поддерживаться, и Вы не будете пользоваться каким-либо из продвинутых свойств, которые может предложить IP Firewall Chains.

Второй способ использовать ipchains состоит в том, чтобы узнать новый синтаксис и изменить любые существующие конфигурации. Вы должны использовать новый синтаксис вместо старого. При ближайшем изучении выяснится, что при переписывании конфигурации, ее можно оптимизировать. Синтаксис в ipchains проще, чем был у ipfwadm, так что это хорошая идея.

ipfwadm управлял тремя наборами (цепочками) правил с целью конфигурирования firewall. В IP Firewall Chains Вы можете создавать произвольные наборы (цепочки), связанные друг с другом, но имеется три предопределенных набора. Это прямые эквиваленты тех, которые использовались в ipfwadm, за исключением того, что они имеют имена: input, forward и output.

Давайте сначала рассматривать общий синтаксис команды ipchains, затем рассмотрим, как использовать ipchains вместо ipfwadm без проблем с каким-либо из продвинутых свойств формирования цепочки. Будем делать это, повторно рассматривая предыдущие примеры.

Синтаксис команды ipchains

Синтаксис команды ipchains прост. В общем виде он выглядит так:

ipchains command rule-specification options

Команды

С помощью команд можно управлять правилами и наборами правил для ipchains. Рассмотрим их подробно:

-A chain

Добавляет одно или большее количество правил к концу назначенной цепочки. Если имя машины задано для источника или адресата, и оно соответствует нескольким IP-адресам, правило будет добавлен для каждого адреса.

-I chain rulenum

Добавляет одно или большее количество правил в начало назначенной цепочки. Если имя машины задано для источника или адресата, и оно соответствует нескольким IP-адресам, правило будет добавлено для каждого адреса.

-D chain

Удаляет одно или несколько правил из определенной цепочки, которая соответствует заданной спецификации правил.

-D chain rulenum

Удаляет правило, находящееся в позиции rulenum определенной цепочки. Первое правило в цепочке занимает первую позицию (не нулевую!).

-R chain rulenum

Заменяет правило, находящееся в позиции rulenum определенной цепочки.

-C chain

Проверяет пакет спецификацией правила по заданной цепочке. Эта команда возвратит сообщение, описывающее, как пакет обработан цепочкой. Это очень удобно для тестирования Вашей конфигурации firewall, и мы рассмотрим это подробно чуть позже.

-L [chain]

Перечисляет правила определенной цепочки или всех цепочек, если никакая конкретная цепочка не задана.

-F [chain]

Удаляет правила определенной цепочки или всех цепочек, если никакая конкретная цепочка не задана.

-Z [chain]

Обнуляет пакеты и счетчики для определенной цепочки или всех цепочек, если никакая конкретная цепочка не задана.

-N chain

Создает новую цепочку с заданным именем. Таким способом создаются задаваемые пользователем цепочки.

-X [chain]

Удаляет определенную пользовательскую цепочку или все цепочки, если никакая конкретная цепочка не задана. На удаляемую цепочку не должно быть ссылок из других цепочек, иначе она не будет удалена.

-P chain policy

Задает стратегию по умолчанию для указанной цепочки. Допустимые стратегии: ACCEPT, DENY, REJECT, REDIR или RETURN. ACCEPT, DENY и REJECT имеют те же самые значения, как для традиционной реализации IP firewall. REDIR определяет, что пакет должен быть переназначен к порту на машине с firewall. RETURN заставляет IP firewall вернуться к цепочке, правило которой вызвало эту ситуацию, и предписывает продолжить ее обработку со следующего правила.

Параметры определения правил

Параметры ipchains создают правила, определяя, какие типы пакетов соответствуют критериям. Если любой из этих параметров опущен из спецификации правила, он предполагается по умолчанию.

-p [!]protocol

Указывает протокол, соответствующий правилу. Допустимы имена протоколов tcp, udp, icmp или all. Можно задать номер протокола для протоколов, которые здесь не определены. Например, 4 для протокола ipip. Если задан префикс !, правило превращается в отрицательное, и принимаются все пакеты, не соответствующие этому протоколу. Значение по умолчанию: all.

-s [!]address[/mask] [!] [port]

Указывает исходный адрес и порт, с которого пришел пакет. Адрес может задавать имя машины, имя сети или IP-адрес. Опция mask задает сетевую маску. Она может быть задана в обычной форме (например, /255.255.255.0) или в новой (например, /24). Опция port задает порт TCP или UDP, или тип пакетов ICMP. Вы можете задать спецификацию порта только, если задали параметр -p с одним из протоколов tcp, udp или icmp. Порты могут быть определены как диапазон, определяя верхние и нижние границы с двоеточием в качестве разделителя. Например, 20:25 определяет порты с 20 по 25 включительно. Символ ! превращает правило в полную его противоположность.

-d [!]address[/mask] [!] [port]

Задает адрес и порт назначения. Во всем остальном аналогичен параметру -s.

-j target

Указывает, что делать при срабатывании правила. Допустимые действия: ACCEPT, DENY, REJECT, REDIR и RETURN. Ранее я уже описал значение каждого действия. Вы можете также задать имя определяемой пользователем цепочки, в которой продолжится обработка. Если этот параметр опущен, будут только изменены данные пакетов и счетчиков, но ничего с этим пакетом сделано не будет.

-i [!]interface-name

Задает интерфейс, с которого пришел пакет, или через который пакет будет передан. Символ ! переворачивает результат сравнения. Если имя интерфейса кончается на +, ему будут соответствовать все интерфейсы, имена которых начинаются на заданную строку. Например, -i ppp+ совпадает со всеми PPP-интерфейсами, а -i ! eth+ соответствует всем интерфейсам, кроме Ethernet.

[!] -f

Указывает, что это правило применяется к первому фрагменту фрагментированного пакета.

Опции

Опции ipchains имеют более широкое значение. Они предоставляют доступ к тайным свойствам этой программы.

-b

Генерирует сразу два правила. Первое точно соответствует заданным параметрам, второе делает то же самое, но прямо противоположными параметрами.

-v

Предписывает ipchains выдавать подробную информацию.

-n

Предписывает ipchains использовать IP-адреса и порты, не пытаясь преобразовать их в имена.

-l

Включает протокол ядра о соответствии пакетов. Любой пакет, который соответствует правилу, будет запротоколирован ядром, используя его функцию printk(), которая обрабатывается программой sysklogd. Это удобно для выявления необычных пакетов.

-o[maxsize]

Заставляет IP chains копировать все подходящие правилам пакеты в устройство “netlink”. Параметр maxsize ограничивает число байтов из каждого пакета, которые будут переданы на устройство netlink. Эта опция имеет большое значение для разработчиков, но может эксплуатироваться пакетами пользовательских программ в будущем.

-m markvalue

Все пакеты, удовлетворяющие правилам, должны быть помечены. Метка является 32-битным чмслом без знака. Пока эта опция ничего не делает, но в будущем она может определять, как пакет будет обработан другим программным обеспечением типа кода маршрутизации. Если метка начинается с + или -, ее значение буедт добавлено или вычтено из существующего.

-t andmask xormask

Разрешает управление битами TOS (“type of service”) в заголовке IP любого пакета, удовлетворяющего правилам. Биты типа сервиса используются интеллектуальными маршрутизаторами для расположения пакетов перед отправкой в соответствии с их приоритетом. andmask и xormask задают разрядные маски, которые будут использованы в логических операциях AND и OR с битами типа сервиса. Это продвинутое свойство, которое более подробно описано в IPCHAINS-HOWTO.

-x

Любые числа в выводе ipchains будут точными (округление не используется).

-y

Задает правило, которое будет соответствовать любому пакету TCP с установленным битом SYN и неустановленными битами ACK и FIN. Это используется, чтобы фильтровать TCP-запросы.

Вернемся к нашему примеру

Снова предположим, что мы имеем сеть в нашей организации, и используем Linux firewall для предоставления доступа к нашим серверам WWW из Internet, но при этом хотим блокировать любой другой трафик.

Если наша сеть имеет 24-битную маску подсети (класс C) и имеет сетевой адрес 172.16.1.0, следует использовать такое правило ipchains:

# ipchains -F forward
# ipchains -P forward DENY
# ipchains -A forward -s 0/0 80 -d 172.16.1.0/24 -p tcp -y -j DENY
# ipchains -A forward -s 172.16.1.0/24 -d 0/0 80 -p tcp -b -j ACCEPT

Первая команда удаляет все правила из набора forward , вторая устнавливает действие по умолчанию для forward в DENY. Третья и четвертая команды делают специфическую фильтрацию, которую мы хотим. Четвертая команда разрешает доступ к web-серверам, а третья запрещает входящие TCP-подключения с порта 80.

Если мы теперь хотим добавить правила, которые предоставят только пассивный режим доступа к FTP-серверу снаружи сети, мы добавим правила:

# ipchains -A forward -s 0/0 20 -d 172.16.1.0/24 -p tcp -y -j DENY
# ipchains -A forward -s 172.16.1.0/24 -d 0/0 20 -p tcp -b -j ACCEPT
# ipchains -A forward -s 0/0 21 -d 172.16.1.0/24 -p tcp -y -j DENY
# ipchains -A forward -s 172.16.1.0/24 -d 0/0 21 -p tcp -b -j ACCEPT

Просмотр наших правил в ipchains

Чтобы перечислить наши правила в команде ipchains, используется параметр -L argument. Точно как с ipfwadm, там могут быть заданы аргументы, которые позволят детализировать вывод. В простейшем случае ipchains выведет нечто вроде:

# ipchains -L -n
Chain input (policy ACCEPT):
Chain forward (policy DENY):
target   prot opt     source          destination     ports
DENY     tcp  -y----  0.0.0.0/0       172.16.1.0/24   80 ->   *
ACCEPT   tcp  ------  172.16.1.0/24   0.0.0.0/0       * ->   80
ACCEPT   tcp  ------  0.0.0.0/0       172.16.1.0/24   80 ->   *
ACCEPT   tcp  ------  172.16.1.0/24   0.0.0.0/0       * ->   20
ACCEPT   tcp  ------  0.0.0.0/0       172.16.1.0/24   20 ->   *
ACCEPT   tcp  ------  172.16.1.0/24   0.0.0.0/0       * ->   21
ACCEPT   tcp  ------  0.0.0.0/0       172.16.1.0/24   21 ->   *

Chain output (policy ACCEPT):

Если Вы не указали имя цепочки, ipchains выведет все правила из всех цепочек. В нашем примере параметр -n сообщает ipchains, чтобы тот не преобразовал любой адрес или порт в имя.

Подробная форма, вызываемая опцией -u, обеспечивает намного больше деталей. Вывод добавляет поля для пакетов и счетчиков байтов, Type of Service AND и XOR масок, имени интерфейса и значения меток.

Все правила, созданные ipchains имеют пакеты и счетчики байтов, связанные с ними. Это важно для IP Accounting и будет подробно рассмотрено в главе 10. По умолчанию эти счетчики используются в округленной форме, использующей суффиксы K и M для представления тысячи и миллиона соответственно. Если задан аргумент -x , счетчики работают без округления.

Правильное использование цепочек

Вы уже знаете, что команда ipchains заменяет ipfwadm с более простым синтаксисом командной строки и некоторыми интересными расширениями, но Вы пока не знаете зачем нужны определяемые пользователем цепочки. Вы также должны знать, как использовать скрипты поддержки, которые сопровождают ipchains. Давайте разбираться.

Определяемые пользователем цепочки

Три набора правил традиционного IP firewall обеспечивают механизм формирования конфигураций firewall, которые были довольно просты в понимании и пригодны для маленьких сетей с простыми требованиями к firewall. Однако, в больших сетях неизбежно возникают большие проблемы и требовавния. Наборы правил растут как снежный ком, управлять ими становится очень сложно. Хуже всего то, что с ростом числа правил падает эффективность IP firewall: ведь программе приходится сравнивать каждый пакет со все большим числом правил. Кроме того, нельзя безопасно отключать наборы правил целиком. Вместо этого, Вы вынуждены выключить некий набор, а пока Вы его перестраиваете, доступ в сеть оказывается открыт всем желающим!

Создание своих цепочек IP Firewall позволит решить почти все эти проблемы. Каждая такая цепочка может использоваться наравне со встроенными. Вы можете использовать параметр -N команды ipchains, чтобы создать новую цепочку с именем не более 8 символов. Ограничение имени символами только нижнего регистра, может быть, неплохая мысль. Опция -j позволяет задать реакцию на соответствие пакета данному правилу. Она может определять, что если пакет подходит под правило, дальше он должен тестироваться по заданному пользователем набору правил. Рассмотрим команды ipchains :

ipchains -P input DENY
ipchains -N tcpin
ipchains -A tcpin -s ! 172.16.0.0/16
ipchains -A tcpin -p tcp -d 172.16.0.0/16 ssh -j ACCEPT
ipchains -A tcpin -p tcp -d 172.16.0.0/16 www -j ACCEPT
ipchains -A input -p tcp -j tcpin
ipchains -A input -p all

Мы задали реакцию по умолчанию deny для набора правил input. Вторая команда создает определенную пользователем цепочку tcpin, которая соответствует любому пакету, пришедшему снаружи нашей локальной сети. Третья команда добавляет в нее правило, которое пока не выполняет никаких действий. Это правило нужно для учета и подробно рассмотрено в главе 10. Следующие два правила соответствуют любому пакету, который предназначен для нашей локальной сети и любого из портов ssh или www , такие пакеты будут приняты. Следующее правило как раз то, когда реально начинается волшебство ipchains. Оно вызывает firewall для проверки всех пакетов протокола TCP по набору правил, заданному пользователем. Наконец, мы добавляем правило к нашему набору input, которое соответствует любому пакету. Это еще одно правило учета.

Наши наборы правил input и tcpin заполняются нашими правилами. Процесс обработки пакета всегда начинается в одной из встроенных цепочек. Наша собственная цепочка вступает в дело по команде из одной из встроенных цепочек. Сначала, давайте рассмотрим, что происходит, когда для одного из наших компьютеров получен пакет UDP.

Пакет на приеме попадает в цепочку input. Первые два правила его игнорируют, поскольку они соответствуют ICMP и TCP. Пакет соответствует третьему правилу в input, но оно не определяет адресата, так как просто модифицирует счетчики байтов и пакетов, и не выполняет никакого действия непосредственно с пакетом. Он достигает конца input, встречается с заданной по умолчанию стратегией для input и отклоняется.

Чтобы увидеть нашу определяемую пользователем цепочку в действии, давайте теперь рассматривать что случается, когда мы получаем TCP-пакет предназначенный для порта ssh одного из наших компьютеров.

На это раз второе правило в цепочке input подходит и определяет адресата tcpin, нашу определяемую пользователем цепочку. Задание определяемой пользователем цепочки как адресата приведет к тому, что пакет будет проверен по правилам в ней, так что следующее проверяемое правило, это первое правило в tcpin. Первое правило соответствует любому пакету, который имеет исходный адрес вне нашей локальной сети и не определяет никакого адресата, так что это тоже ччетное правило, и тестирование переходит к следующему правилу. Второе правило в нашей цепочке tcpin соответствует этому пакету и определяет адресата ACCEPT. Итак, пакет принят.

В заключение, давайте рассмотрим то, что случается, когда мы достигаем конца определяемой пользователем цепочки. Для этого нам понадобится входящий пакет, который не соответствует заданным нами правилам. Пусть это будет запрос для telnet.

У определяемых пользователем цепочек нет заданной по умолчанию реакции на внешние раздражители. Когда все правила в определяемой пользователем цепочке будут проверены, и ни одно не соответствует ситуации, firewall действует, как если бы правило было задано правило RETURN. В нашем примере проверка вернется к набору input. В конечном счете мы достигаем конца цепочки input, которая имеет заданную по умолчанию стратегию, и пакет будет отклонен.

Этот пример очень прост, но иллюстрирует основную логику работы. Немного более сложный пример:

# Set default forwarding policy to REJECT
ipchains -P forward REJECT
#
# create our user-defined chains
ipchains -N sshin
ipchains -N sshout
ipchains -N wwwin
ipchains -N wwwout
#
# Ensure we reject connections coming the wrong way
ipchains -A wwwin -p tcp -s 172.16.0.0/16 -y -j REJECT
ipchains -A wwwout -p tcp -d 172.16.0.0/16 -y -j REJECT
ipchains -A sshin -p tcp -s 172.16.0.0/16 -y -j REJECT
ipchains -A sshout -p tcp -d 172.16.0.0/16 -y -j REJECT
#
# Ensure that anything reaching the end of a user-defined chain is rejected.
ipchains -A sshin -j REJECT
ipchains -A sshout -j REJECT
ipchains -A wwwin -j REJECT
ipchains -A wwwout -j REJECT
#
# divert www and ssh services to the relevant user-defined chain
ipchains -A forward -p tcp -d 172.16.0.0/16 ssh -b -j sshin
ipchains -A forward -p tcp -s 172.16.0.0/16 -d 0/0 ssh -b -j sshout
ipchains -A forward -p tcp -d 172.16.0.0/16 www -b -j wwwin
ipchains -A forward -p tcp -s 172.16.0.0/16 -d 0/0 www -b -j wwwout
#
# Insert our rules to match hosts at position two in our user-defined chains.
ipchains -I wwwin 2 -d 172.16.1.2 -b -j ACCEPT
ipchains -I wwwout 2 -s 172.16.1.0/24 -b -j ACCEPT
ipchains -I sshin 2 -d 172.16.1.4 -b -j ACCEPT
ipchains -I sshout 2 -s 172.16.1.4 -b -j ACCEPT
ipchains -I sshout 2 -s 172.16.1.6 -b -j ACCEPT

В этом примере, мы использовали выбор определяемых пользователем цепочек для того, чтобы упростить управление нашей конфигурацией firewall и улучшить эффективность нашего firewall по сравнению с решением, включающим только встроенные цепочки.

Наш пример создает определяемые пользователем цепочки для сервисов ssh и www в каждом направлении подключения. Есть цепочка wwwout, в ней мы помещаем правила для компьютеров, имеющих право создавать исходящие подключения World Wide Web, и цепочка sshin, хранящая правила для машин, которым можно приинимать входящие подключения ssh. Допустим, нам надо гибко задавать эти разрешения для каждого компьютера в нашей сети. Упрощение происходит, потому что определяемые пользователем цепочки позволяют нам аккуратно группировать правила для прав доступа входящих и исходящих пакетов с компьютеров. Рост эффективности происходит потому, что для любого пакета мы уменьшили среднее число тестов, требуемых для поиска адресата. Если бы мы не использовали определяемые пользователем цепочки, нам бы пришлось искать целый список правил, чтобы узнать какое действие выполнить с каждым пакетом. Даже при условии равномерности поступления пакетов в среднем мы просматривали бы половину списка. Определяемые пользователем цепочки позволяют нам избегать проверки большого числа правил, если проверяемый пакет не соответствует простому правилу во встроенной цепочке, которая вызывает наши цепочки.

Скрипты поддержки ipchains

Пакет ipchains имеет три скрипта поддержки. Первый из них мы уже кратко обсудили, другие два обеспечивает простые и удобные средства сохранения и восстановления Вашей конфигурации firewall.

Скрипт ipfwadm-wrapper эмулирует синтаксис командной строки команды ipfwadm, но на самом деле вызывает команду ipchains, чтобы формировать правила firewall. Это удобный способ переноса Вашей существующей конфигурации firewall на новое ядро или изучения синтаксиса ipchains . Скрипт ipfwadm-wrapper ведет себя не так, как команда ipfwadm в двух деталях. Во-первых, поскольку ipchains не поддерживает спецификацию интерфейса по адресу, ipfwadm-wrapper принимает параметр -V, но пытается преобразовать его в ipchains аналог -W поиском имени интерфейса с заданным адресом. Скрипт ipfwadm-wrapper будет всегда выдавать предупреждение, когда Вы используете опцию -V. Во-вторых, фрагменты правила учета не транслируются правильно.

Скрипты ipchains-save и ipchains-restore делают формирование и изменение конфигурации firewall много проще. Команда ipchains-save читает текущую конфигурацию firewall и пишет упрощенную форму в стандартный вывод. Команда ipchains-restore читает данные в выходном формате команды ipchains-save и задает конфигурацию IP firewall в соответствии с этими правилами. Преимущество использования этих скриптов в том, что можно динамически менять конфигурацию, а потом ее сохранить в файле.

Чтобы использовать скрипты, введите:


ipchains-save >/var/state/ipchains/firewall.state
для сохранения текущих настроек firewall. Во время загрузки можно их восстановить командой:

ipchains-restore </var/state/ipchains/firewall.state

Скрипт ipchains-restore проверяет существование всех определяемых пользователем цепочек. Если задан параметр -f, он автоматически удалит все правила из пользовательских наборов перед настройкой. По умолчанию, Вам будет задан вопрос, очищать ли эту цепочку.