Курсовая работа студента группы 13-401 Артемьева Олега Константиновича Настройка разделенного доступа к интернет и firewall на основе OS Линукс. Big Brother is not government. Big Brother = Big Business. (c) Firewall-HOWTO ****** Сожержание 0. Введение 1. Список необходимого програмного обеспечения и требования к аппаратому обеспечению. 2. Firewall,proxy.Настройка ядра.Сети,протоколы, пакеты и стандарты. Общее понятие о firewall и принципах работы. Настройка ядра для поддержки firewall. Общее понятие о протоколах и стандартах интернет. Пакеты сетей и их структура. Типы proxy серверов. Алгоритм обработки трафика ядром OS Linux. ..Как пакеты проходят через фильтры. ..Понятие IP forwarding, IP masquerading и demasquerading. 3. Разбор опций ipfwadm. 4. Разбор конфигурации действующего firewall. 5. Некоторые типичные ошибки и частные случаи. 6. Использованное оборудование и литература. 7. Заключение,спасибо. 8. Лицензия,копирайты,публикация. 0. Введение. В этой курсовой работе описывается один из многочисленных вариантов настройки firewall cервера работающего на OS Linux обеспечивающего доступ в интернет (или , абстрактно, в любую другую внешнюю сеть) для других машин локальной сети и пользователей подключающихся по комутируемому соединению (модем либо сети X.25). Для разделения доступа можно использовать большнство современных операционных систем. Единственная, пожалуй, операционная система не имеющая средств для разделения доступа к ресурсам - DOS, хотя и для DOS написан стэк протоколов TCP/IP. При выборе операционной системы для сервера можно сразу же отбросить MS windows 95/98 - пакеты программ для разделения доступа в этих операционных системах разрабатывались в доолнение к возможностям самой операционной ситемы третьими фирмами и их производительность и устойчивость ограничиваются возможностями операционной системы , которая изначально разрабатывалась как клиентская и без жестких требований к устойчивости и безопасности. Ошибки этого класса операционных систем давно стали притчей во-языцах. Не выдерживает критики и другое произведение фирмы Microsot - MS Windows NT Server - прежде всего оно стоит достаточно много денег и, во вторых, несмотря на то , что функции разделения сетевых ресурсов встроены в ядро системы, устоичивость Windows NT весьма относительна - ее достаточно для работы в изолирванных сетях, однако в тех случаях когда система подвергается атаке устойчивость ее сомнительна. Кроме того firewall системы для unix показывают наибольшую производительность, по сравнению с аналогичными для NT. Таким боразом из достойных операционных систем остаются только UNIX-подобные. Автор выбрал Linux , во первых, потому что знаком с этой операционной системой , во вторых потому, что по сравнению с, скажем, free-bsd (и вообще *bsd) эта операционная система более динамично развивается. Кроме того эта операционная система бесплатна (*) и многоплатформенна: Linux был впервые разработан для 386/486-based PCs. В наши дни он работает также на DEC Alphas, SUN Sparcs, M68000 машинах (как Atari и Amiga), MIPS и PowerPC. В ОС Linux с ядрами до 2.0.38 включительно (**) для настройки firewall используется утилита ipfwadm, в версиях от 2.2.0 - ipchains. В данной курсовой работе рассматривается настройка firewall на ipfwadm. Примечание: (*) и Linux и ipfwadm и все упоминаемые здесь утилиты распространяются на основе Gnu Public License (GNU), которая дает пользователю право бесплатно пользоваться и изменять програмное обеспечение в рамках данной лицензии. (**) здесь не учитываются версии ядер для разработчиков. Общий список возможностей и плюсов ipfwadm: - Изменение правил по умолчанию для всех категорий правил файрвола. - Автоматическое добавление необходимых дополнительных правил, когда хосты (*) заданные символически имеют более 1 IP адреса. - Поддержка задания адреса и/или имени интерфейса. - Отображение и сброс счетяиков пакетов/байтов "автоматически" для установки надежной схемы учета. - Просмотр имеющихся правил в различных форматах. - Поддержка дополнительных правил: вунаправленные правила сортировки по флагам TCP: ACK и SYN замена IP TOS-поля. учет только входящего или только исходящего траффика. - Поддержка переадресации (для прозрачного прокси). - Поддержка маскарадинга, включая вывод активных соединений и установки значений веременной задержки. - Подробная man страница. Примечание: компьютер подключенный к сети часто называют хостом (от английского host) 1. Список необходимого програмного обеспечения OS Linux поддерживающая администрирование правил работы firewall при помощи утилиты ipfwadm (*) ядро Linux версии 2.0.0 или новее. пакет ipfwadm - для установки правил обработки сетевых протоколов интернет семейства IP (конфигуратор firewall системы) пакет net-tools - для конфигурации сетевых интерфейсов и тестирования установленной кофиурации. (**) пакеты NetKit-B bind-utils - для тестирования установленной кофиурации firewall.(***) Требования к аппаратному обеспечению, по современным меркам, весьма малы - теоретически возможно организовать сервер на PC-compatible машине c процессором i386 и объемом памяти от 4 Мб и без жесткого диска, однако это будет отнюдь не лучшим вариантом - это минимальные требования для ядра 2.0.32 (****). На практике я использую PC с процессором Cyrix 686-200Mhz с объемом памяти в 48 Mb и жестким диском в 3 Гб, которая одновременно является моей рабочей станцией системного администратора, и операционную ситему Linux Red Hat 5.2 с kernel 2.0.38 . Firewall-HOWTO поставляемое с Linux Red Hat 6.1 (kernel 2.2.12-20) указывает на следующее минимально необходимое оборудование: 1. a 486-DX66 with 16 meg of memory 2. a 200m hard disk (500 recommended) 3. network connections (LAN Cards, Serial Ports, Wireless?) 4. monitor and keyboard В случае использования "serial port console" после конфигурации можно обойтись и без монитора и клавиатуры. Однако если необходимо построить proxy server , который будет обрабатвать большое количество содеинений необходимо использовать устройства как можно большей производительности. Для установки фильтрующего firewall нет необходимости в специальном програмном обемпечении , но если необходим полноценный proxy server понадобятся пакеты: 1. Squid 2. The TIS Firewall Toolkit (FWTK) 3. SOCKS Примечание: (*) современные версии OS Linux (с ядрами 2.2.*) используют ipchains, однако, в основном из лени, автор пока так и не воспользовался upgrade'ом операционной системы - подобные усовершенствования всегда требуют времни и усилий, но редко заканчиваются премиальными. ;-) (**) В случае сильной стесненности в дисковом пространстве (например при настройке router'a/firewall'а с использованием одной дискеты 1.44-2 Mb) возможно использование меньшего числа утлит. Минимально необходимые исполняемые файлы: ipfwadm,route,ifconfig - исходный код упоямнутых утилит и пактов можно свободно получить в сети internet. (***) Под тестированием установенной конфигурации firewall понимается запуск соответствующих сервисов и проверка их работоспособности. Минимально-необходимую проверку можно реализвать с помощью самой утилиты ipfwadm (опция -c), однако в связи с большей наглядностью автор предпочитает пользоваться , как минимум, telnet , а лучше полным набором сетевых утилит. (****) Это показательный уровень требований - желающие _точно_ знать эти цифры могут скачать кернел этих версий в интернет. Кажется, старые версии кернел еще доступны на sunsite.unc.edu .. =) 2. Firewall.Настройка ядра.Сети,протоколы, пакеты и стандарты. Общее понятие о firewall и принципах работы. firewall - установившееся название для систем обеспечивающих (применительно к компьтерной технологии) защиту данных в локальных компьютерных сетях от доступа к ним извне, а также, в случае необходимости, обеспечивающих ограничения в использовании услуг и данных доступных через внешнюю сеть и управление потоками данных. Помимо того правильно настроеный firewall уберет бесполезный и ошибочный трафик от некорректно настроенных клиентов между сегментами сети. Есть два типа firewall'ов: *) Фильтрующие - могут останавливать выбранный тип сетевых пакетов. *) Proxy сервера, которые иногда называют "firewall" - те что делают сетевые соединения за вас. В современных компьютерных сетях большие объемы передаваемой и обрабатываемой информации, а следовательно высокие требования к скорости ее обработки . Наилучшие показатели обеспечивают аппаратные реализации маршрутизаторов и firewall, однако такие системы имеют очень большую стоимость. Гораздо более дешевым решением является програмная реализация этих функций. Современные операционные системы, исполняющиеся на intel архитектуре имеют типичное разделение на несколько уровней по приоритету исполнения , что связано с реализацией защщищенного режима в intel процессорах. Наибольший приоритет имеет "ядро" операционной системы, поэтому функции управления сетевым трафиком встраиваются в ядро операционной системы - это позволяет добится большей производительности. Настройка ядра для поддержки firewall. Для того чтобы ядро Linux поддерживало функции firewall необходимо включить в нем следующие опции (для 2.0.37 (*)): Networking support (CONFIG_NET) [Y/n/?] Network firewalls (CONFIG_FIREWALL) [Y/n/?] TCP/IP networking (CONFIG_INET) [Y/n/?] IP: forwarding/gatewaying (CONFIG_IP_FORWARD) [Y/n/?] IP: firewalling (CONFIG_IP_FIREWALL) [Y/n/?] IP: masquerading (CONFIG_IP_MASQUERADE) [Y/n/?] необязательная, но удобная для клиентов опция обеспечивающая работу утилиты ping: IP: ICMP masquerading (CONFIG_IP_MASQUERADE_ICMP) [Y/n/?] в случае если необходимо установить систему оплаты по траффику, либо просто иметь представление о использовании ресурсов клиентами необходимо включить опцию учета: IP: accounting (CONFIG_IP_ACCT) [Y/n/?] Если вы настраиваете firewall для машины, которая будет сервером (**) следует включить: IP: optimize as router not host (CONFIG_IP_ROUTER) [N/y/?] Если необходимо иметь возможность анализировать пропущенный через сервер сетевой траффик (кроме того это просто наглядно) следует включить опцию: IP: firewall packet logging (CONFIG_IP_FIREWALL_VERBOSE) [Y/n/?] Если объемы памяти более 16Mb имеет смысл включить IP: Allow large windows (not recommended if <16Mb of memory) (CONFIG_SKB_LARGE) [N/y/?] Для увеличения уровня устойчивости и безопасности следует включить: IP: syn cookies (CONFIG_SYN_COOKIES) [Y/n/?] Несмотря на то что не рекомендуется включать CONFIG_IP_ALWAYS_DEFRAG, при небольших количествах памяти, автор не заметил ухудшения работы в сети из 4х компьютеров включив эту опцию на PC i486sx33 с 8Mb ОЗУ и 15Mb swap-space (***) , на которой, правда, из демонов были запущены только talkd, ntalkd и inetd, так что рекомендации поставляемые с kernel весьма относительны. IP: always defragment (CONFIG_IP_ALWAYS_DEFRAG) [Y/n/?] IP: Drop source routed frames (CONFIG_IP_NOSR) [Y/n/?] Кроме того следует включить поддержку протоколов используемого соедиения с internet и удаленными клиентами (в данном примере - PPP и SLIP) и поддержку устройств работы с локальной сетью (здесь - Ethernet 10Mbit): PPP (point-to-point) support (CONFIG_PPP) [M/n/y/?] SLIP (serial line) support (CONFIG_SLIP) [M/n/y/?] CSLIP compressed headers (CONFIG_SLIP_COMPRESSED) [Y/n/?] Keepalive and linefill (CONFIG_SLIP_SMART) [Y/n/?] Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?] Подробнее об инсталяции и конфигурации ядра можно узнать из KERNEL-HOWTO (поставляется с OS Linux, также доступно на www.redhat.org). Кроме того следует выставить значение переменной в файле /etc/sysconfig/network : FORWARD_IPV4=true Примечание: (*) заглавными буквами в квадратных скобках указан выбор при предыдущей сборке ядра. (**) firewall иногда имеет смысл настраивать не только для серверов, но и для рабочих станций unix. Различия в ипользуемых ресурсах не так уж и велики (размер ядра с включенными функциями firewall'а на десяток-другой Kb больше) - безопасность обычно стоит дороже. ;-) (***) Как и, практически, любая не real-time OS Linux имеет возможность использовать дисковое пространство для расширения ОЗУ - swap. Для наглядности излагаемого материала стоит заострить внимание на принципах работы firewall и алгоритмах обработки сетевого трафика ядром операционной системы (здесь и далее под ядром понимается ядро OS Linux). Общее понятие о протоколах и стандартах интернет. Сетевой трафик в любых современных сетях поддерживается на основе различных сетевых протоколов. Протокол это , в общем случае, набор правил взаимодествия. Применительно к сети это набор правил взаимодействия сетевых программ исполняющихся на компьютерах , в общем случае, различной архитектуры (intel,sparc,alpha и т.д.) с различными периферийными устройствами, который, очевидно, определят форму передачи данных. Пока человечество не придумало ничего принципиально отличного от почты - обмен данными по любому протоколу очень похож на обмен письмами, хотя и имеет множество мелких различий , в зависимости от протокола. В общем случае любой сетевой протокол определяет некую структуру (пакет) имеющую поле адреса,обратного адреса и поле данных (сожержимое "письма"). В интернет используется множество протоколов, стандарты на которые описаны в доступных всем rfc ( request for comments: документы или комплекты документов определяющие стандарты internet работающие de-facto) - интернет использует протоколы открытого типа - семейство TCP/IP. Под TCP/IP принято понимать не один и не два (TCP и IP) протокола, а именно семейство протоколов, часть из которых упоминается ниже. Адреса в интернет встречаются в двух видах - цифровом и символьном. Цифровой адрес интернет для протоколов IPv4 (в данный момент разрабатывается и внедряется следующая версия семейства интернет протоколов - IPv6, которая имеет другой формат пакетов и, в частности, адресов) это 32 бита, которые для удобства людей записывают в десятичном виде, разделяя запятой каждые три цифры (байт), то есть нечто вида "nnn.mmm.kkk.lll" , например 192.100.339.100 или 122.43.2.1 . При настройке firewall на основе ipfwadm чаще всего приходится встречаться с протоколам udp/tcp/icmp - ipfwadm не позволяет специфицировать другие типы протоколов, однако, поскольку большинство протоколов интернет основано на ip и udp - этого достаточно. Конечно существуют коммерческие версии firewall , однако их цена непомерно высока, несмотря на их относительно бОльшие возможности - больше распознаваемых протоколов, возможность контроля макро-протоколов (таких как ftp на уровне команд), встроенные прокси для различных макропротоколов (например smtp). Большинство, если не все,функций коммерческих протоколов можно реализовать на современном бесплатном ПО (здесь и далее: ПО - програмное обеспечение) , хотя это и не по принципу "все в одном". Сравнивать различные firewall проще используя семиуровневую модель OSI (Open System Interconnections Reference Model - модель взаимодействия открытых систем),а лучше ее переложение на 4х уровненвую структуру TCP/IP, которое последнее время приобретает все большую популярность: модель OSI модель TCP/IP протоколы ........................................................................ | 7 Прикладной уровень | 4 Прикладной уровень | telnet,ftp, | | | X,SMTP,RPC, | 6 Уровень представления данных | | Kerberos, | | | RPC,TFTP, | | | ASN,DNS,NFS | 5 Сеансовый уровень | | другое ПО ........................................................................ | | | | 4 Транспортный уровень | 3 Транспортный | TCP , UDP | | уровень | ........................................................................ | | | | 3 Сетевой уровень | 2 Сетевой уровень | IP, ICMP | 2 Канальный уровень | ( межсетевого | | | заимодействия ) | ........................................................................ | | | | 1 Физический уровень | 1 Уровень доступа | ARP, | | к сети | драйверы | | | устройств ........................................................................ Некоммерческие firewall системы в большинстве случаев реализуют управление до транспортного уровня TCP/IP включительно, коммерческие же предлагают дополнительные модули для программ и серверов работающих на работающих на прикладном уровне TCP/IP. Кроме того стоит отметить, что ipfwadm не затрагивает физического уровня TCP/IP. Для этого существует утилита arp , основное применение которой (в аспекте обеспечения безопасности) состоит в задании статической таблицы MAC адресов. Более подробную информацию об arp можно получить набрав на консоли `man -a arp`. Полезно знать зависимости протоколов между собой, а так-же расшифровку названия наиболее часто встречающихся протоклов. Далее приводится список и зависимости некоторых из них: telnet - утилита и протокол удаленного доступа ftp - file transfer protocol (протокол передачи файлов) SMTP - Simple Mail Transfer Protocol (протокол передачи электронной почты) X - протокол используемый системой X Window Kerberos - система безопасности DNS - Domain Name Service (служба именования доменов) ASN - Abstract Syntax Notation (язык абстрактного описания синтаксиса) SNMP - Simple Network Managment Protocol (протокол управления сетями) NFS - Netwok File System (сетевая файловая система) RPC - Remote Procedure Call (вызов удаленных процедур) tftp - tiny ftp - упрощенный ftp IP - Internet Protocol (межсетевой протокол) ICMP - Internet Control Message Protocol (межсетевой протокол управления сообщениями) UDP - User Datagramm Protocol (протокол пользователских дейтаграмм) TCP - Transmission Control Protocol (протокол управления передачей данных) Некоторые из протоколов прикладного уровня используют и TCP и UDP , как например DNS, однако большинтво - только один из этих транспортных протоколов. Так telnet,ftp,SMTP,X,Kerberos основаны на TCP, а NFS, RPC, TFTP - на UDP. для большинства указанных утилит и протоколов существуют отдельные man страницы. Важно, что для работы udp,в отличие от IP соединение не требуется, в то же время udp не дает гарантий доставки данных , как TCP. Пакеты сетей и их структура. В общем случае структура сетевого пакета интернет выглядит следующим образом: /--------------------HEADER_BEGIN---------------------- | адрес источника |------ | порт источника (отсутствует в icmp) |------ | адрес получателя |------ | порт получателя (отсутствует в icmp) |------ | флаг (для ipfwadm важно: ACK,SYN) |------ | поле приоритета |------ | прочие части заголовка |____________________HEADER_END_________________________ |--------------------BODY_BEGIN------------------------- . . Данные. . |____________________BODY_END___________________________ Примечание к рисунку: Разумеется это лишь схматичный набросок, который не претендует даже на совпадение последовательности указанных полей. За полным описанием структуры пакета конкретного протокола следует обратится в описание соответствующего стандарта. Начало пакета называется заголовком (хедером,header), остальная часть пакета обычно назвается телом (body). Некоторые протоколы, как TCP, которые используются для web, mail и прочего,используют понятие "соединения" - перед тем, как любой пакет с данными будет послан получателю, проходят некоторые установочные пакеты (со специальными заголовками) с сообщениями типа "я хочу установить соединение","хорошо","спасибо,устанавливаю".И только потом пойдут нормальные пакеты с информацией. Фильтр пакетов - это часть программного обеспечения, которое смотрит на заголовки пакетов и либо пропускает пакет дальше, либо запрещает его дальнейшее движение. Firewall системами используются различные типы запрета пакетов: "запрет" (deny) и "отказ" (reject). "Запрет" - это когда пакет от отправителя отвергается системой так, что отправитель думает, что пакет не дошел до получателя, а "Отказ" - это когда отправитель пакета извещается о том, что его пакет был отвергнут получателем (Для этого отсылаетс ответный пакет типа ICMP: ICMP host unreachable). Фильтрация пакетов встроена в ядро Linux. Фильтрующий firewall работает на сетевом и транспортном уровнях. eогут покинуть систему через на основании типа, адреса и порта источникe, адреса и порта получателя. Большинство сетевых роутеров имеют возможность исполнять некоторые функции firewall. Фильтрующие firewall системы могут быть, в какой-то мере, названы роутерами и для их настройки необходимо хотя-бы минимальное понимание структуры пакетов протоколов icmp,tcp и udp . Поскольку ядро реализует проверку только заголовков и соответствия поля данных этим заголовкам, но не самих данных обработка занимает гораздо меньше времени, чем в firewall работающих с протоколами прикладного уровня. Фильтрующий firewall не дает возможности контроля доступа на основе пароля - это уже приладной уровень TCP/IP. Фильтрующий firewall наиболее прозрачен для пользователя сети - нет необходимости специально настраивать какие либо приложения. В большинстве proxy систем это не так. Типы proxy серверов. Firewall утилиты можно использовать также для организации proxy сервера. В данной работе реализация таких возможностей не рассматривается, однако теоретическая выкладка будет полезна для общего кругозора. Proxy бывают двух видов: Application proxy server - прокси сервер приложений. Лучший пример - человек открывает telnet соединение с другим компьютером и из этой telnet сессии открывает еще одно telnet соединение с компьютером во внешнем мире - с Application proxy server этот процесс становится автоматическим - вы открываете соединение с сервером во внешнем мире, но ваше приложение сперва соединяет вас с прокси,который затем подключается к запрощенному вами с серверу во внешнем мире и возвращает данные вам. Как видим эти прокси работают на верхнем уровне модели TCP/IP и, поскольку все данные идут через proxy server на нем возможна фильтрация и отслеживание всех соединений, с ведением учетных записей (здесь и далее - лог-файлов или "логов"), а также запрет работы с определенными серверами, выполнения опредеденных команд протокола и проверка получаемых данных, напрример на наличие вирусов. Такой сервис позволяют использовать большинство коммерческих пакетов firewall. Application proxy может предоставлять доступ к ресурсам по паролю. SOCKS Proxy SOCKS proxy server во многом похож на переключательную плату. Он просто подключает ваше соединение через систему к внешнему соединению. Большинство SOCKS серверов работают только с TCP соединениями. Как и фильтрующие сервера они не дают возможности пользоваться аутентикацией по паролю, однако могут писать логи всех соединений. Алгоритм обработки трафика ядром OS Linux. Как пакеты проходят через фильтры Ядро 2.0.3* имеет 4 категории (цепочки) обработки пакетов: Accounting - для подсчета исходящих пакетов. Input - для управления входящими пакетами Output - для управления исходящими пакетами Forward - для управления пакетами подлежащими пересылке на другие хосты. Когда пакет приходит, например, через сетевую карту, ядро использует входную цепочку для определения того, может ли пакет двигаться дальше. Если пакет проходит эту проверку, то он двигается дальше, согласно таблицам маршрутизации для сетвевых пакетов, заданным программой route. (Более подробно о route можно узнать из `man -a route`). Если же пакет предназначендругой машине, ядро смотрит на цепочку пересылки (forward). В конце, перед тем, как пакет уйдет наружу, ядро смотрит на выходную цепочку правил. Цепочка (категория) - это список правил.Каждое правило, на русском языке, выглядит так: "если заголовок пакета содержит то и то, то делай с пакетом то". Если правило не подходит к заголовку пакета, ядро смотрит на следующее правило в цепочке. В конце, если пакет прошел всю цепочку правил, и ни одно правило не сработало, ядро смотрит на правила цепочки. В грамотно настроенных системах пакет обычно отвергается. Графически это можно представить так: .-------------------------------------------------. .-------------------. | _________.---------to_loopback------. | | Not lo ifnterface | | |loopback | __________ | | |(i.e. eth0 & so on)| | |routing | | lo | | | `-------------------' | |decission|<----|(loopback | V | | ,------------' `---------` |interface)| .-. .^. | | __ .---------. |__________| |O| |A| V V |I |--ACCEPT--->|other | __________ |u| |c| .-. .-. |n | _ |Routing .|--------->|Forwarding|-->|t|->|c|-> |C|-->|S|-->|p | R |D| |decision`|<-----. | rules | |p| |o| |h| |a| |u | E |e| |_________| | |__________| |u| |u| |e| |n| |t |-D->|m| | | | |t| |n| |c| |i| | | I |a| V | | | | |t| |k| |t| |r | R |s| .----------. | V |R| |i| |s| |y| |u | E |q| | local | | DENY,REJECT |u| |n| |u| |_| |l | C |e| | process |----' |l| |g| |m| | |e | T |r| | (program)| |e| `-' |_| | |s | |a| `----------' |s| | | `--' |d| | | | | | |e|---------------------------------------->|_| | | V `-' V V DENY,REJECT DENY DENY Пошаговое описание каждой стадии Проверка контрольной суммы (Checksum) - ядро проверяет пакет на предмет целостности и коректности заголовков. Если пакет не удовлетворяет этим условиям,он отвергается. Назначение (Sanity) - ядро проверяет, кому предназначен пакет, зачем и куда. Множество лишних пакетов отсеиваются именно на этой стадии, но приоритет "входной" (input) цепочки выше. Входная цепочка (input rules) - это первая цепочка, с помощью которой фильтр отсеивает пакеты. Если решение этой цепочки не "отвергнуть" (REJECT) или "запретить" (DENY), то пакет продолжает свое движение дальше. Демаскарад (Demasquaerade) - если пакет - это ответ на предыдущий маскарадный пакет, он демаскарадируется, и сразу пропускатеся на выходную цепочку. Если вы не использете маскарадинг, вы можете мысленно стереть это место из рисунка. Роутинг (routing decision) - поле "получатель" пакета анализируется частью кода,которая ответственна за то, куда пакет пойдет дальше - на локальную обработку или будет перенаправлен на другую машину (смотрите на цепочку "пересылка" (forward)). Таблица роутинга одна, однако для наглядности разделен для loopback и остальных интерфейсов. Локальная обработка (local process) - задача, запущенная на локальной машине, может получить пакет только после того, как он пройдет роутинг, и может посылать пакеты в ответ (которые после определиения маршрута пройдут через выходную цепочку,затем через входную цепочку интерфейса "lo", если пакет предназначен для процесса на этой-же машине, или уйдет через выходную цепочку). Если пакет не создан задачай на локальной машине, проверяется цепочка "пересылка" (forward), в другом случае пакет идет сразу на "выходную" (output) цепочку. Цепочка "пересылка" (forward) - эту цепочку проходят все пакеты,которые предназначены для транзитного прохода через систему. "Выходная" (output) цепочка - через эту цепочку проходят все пакеты, которые отправляются этой машиной. Понятие IP forwarding, IP masquerading и demasquerading. Под IP forwarding понимается обычно переброска IP пакетов с одного интерфейса на другой (*). По сути это перенаправление пакетов предназначенных для некоторого IP адреса на другой IP адрес. (**) Чаще всего IP forwarding применяется вкупе с IP masquerading. IP masquerading является по сути дополнительной функцией IP forwarding - помимо того,что пакеты перебрасываются на другое устройство, они еще и изменяются: заголовок пакета переписывается таким образом, что о выглядит как если-бы был изначально создан на машине через которую пакет проходит, при этом помимо адреса заменяется и порт с которого идет пакет - на произвольный номер порта,временно выделяемый ядром. Поскольку ответ приходит на временно выделенный порт,то ядро автоматически реализует демскарадинг (обратную замену: адрес и порт получателя ответа изменяется на тот с которого получен оригинальный пакет.) При маскарадинге адреса внутренней сети не видны вовне, используется только адрес внешнего iface. Примечание: (*) Здесь и везде в курсовой работе под словом интерфейс понимается сетевой интерфейс, то есть имя устройства (например сетевой карты) для работы с сетью. (**) Следует заметить, что понятия forwarding и masquerading распространяется не только на IP протокол , но и на UDP, а также применимы к другим протколам, например icmp (Однако, для коректной работы icmp forwarding нужно включить в kernel опцию CONFIG_IP_MASQUERADE_ICMP.) 3. Разбор опций ipfwadm. Теперь, после того как краткое введение в интернет и сети TCP/IP закончено обратимся к утилите администратору правил firewall для ядер версии 2.0.* Эта часть работы не ставит перед собой задачу полного описания ipfwadm - всего лишь краткий обзор возможностей - перевод текста подсказки ipfwadm с коментариями автора. ipfwadm 2.3.0, 1996/07/30 Использоавние: ipfwadm -A [direction] command [options] (accounting) ipfwadm -F команда [опции] (правило обработки форвардинга) ipfwadm -I команда [опции] (правило обработки входящих пакетов) ipfwadm -O команда [опции] (правило обработки исходящих пакетов) ipfwadm -M [-s | -l] [опции] (правило маскарадинга) ipfwadm -h (Выдать на STDOUT краткую справку по опциям) Команды: -i [тип_действия] вставить запись в начало цепочки (тип действия для "-A" не указывается - он один - подсчет) -a [тип_действия] добавить запись в конец цепочки (нет смысла для "-A") (тип действия для "-A" не указывается - он один - подсчет) -d [тип_действия] удалить правило (тип действия для "-A" не указывается - он один - подсчет) -l показать все существующие правила для данной категории. -z сбросить значения счетчиков для всех правил в данной категории. -f удалить все правила для данной категории -p policy изменить текущие правила по умолчанию для категории (accept/deny/reject) -s tcp tcpfin udp установить задержки для маскарадинга -c проверка того что сделает с пакетом firewall (с текущими установками) Типы действия: accept - разрешить deny - отказать без уведомления reject - отказать с уведомлением Категории(цепочки): -A подсчет пакетов -F форвардинг -I правила для входящих пакетов -O правила для выходящих пакетов -M "тонкая" настройка маскарадинга (в данной курсовой не рассматривается) Options: -P указывает тип протокола (либо tcp, udp, icmp, или all) -S адрес[/маска] [порт ...] специфицирует адрес источника (порт может быть уазан как один, так и, через пробел, несколько, либо может быть указан диапазон портов через двоеточие) -D адрес[/маска] [порт ...] специфицирует адрес получателя (порт может быть уазан как один, так и, через пробел, несколько, либо может быть указан диапазон портов через двоеточие) -V address IP адрес сетевого интерфейса через который идет пакет -W name имя сетевого интерфейса через который идет пакет -b правило будет действовать в обоих направлениях -e режим вывода дополнительной информации. -k правило будет использоваться только если флаг TCP пакета установлен -m указывает маскарадить пакеты (см. выше) -n числовой вывод хостов и портов -o включить запись логов проходящих пакетов ядром -r [port] перенаправить пакет на локальный порт (для proxy) -t and xor указывает маски and и xor для полей TOS(Type Of Service) проходящего пакета -v подробный отчет в момент установки правил о том как они будут выглядеть. -x выдавать отчет о счетчиках в минимально используемых единимцах (например в байтах вместо килобайтов) -y будет примененно , если флаги TCP ACK и SYN имеют значения установлен и не установлен соответственно. 4. Разбор конфигурации действующего firewall. Начнем с самого примитивного и , в то же время рабочего примера - примера для сетевой рабочей станции linux. Основной смысл запуска firewall на рабочей станции - большая устойчивость системы, плюс защита от соединения с работающим на внешнем интерфейсе сервером, который должен использоваться только локально - такой случай может быть интересен, например, для разработчиков клиент-серверного ПО или когда требуется произвести какие-либо проверки сетевых программ. За IP адрес сетевой карты принят 192.168.3.5. Вот пример такого скрипта, который автор использует на своем домашнем PC подключенном к локальной сети в пределах здания: --------- Cut ----------- #!/bin/bash # 0 # 1 # Flush all rules. # 2 ipfwadm -I -f -v # 3 ipfwadm -O -f -v # 4 ipfwadm -F -f -v # 5 ipfwadm -A -z -v # 6 ipfwadm -A -f -v # 7 # 8 # Add defaults. # 9 ipfwadm -O -p accept -n -v #10 ipfwadm -I -p accept -n -v #11 ipfwadm -F -p deny -n -v #12 #13 # Specify exact rules: #14 ipfwadm -I -P all -W eth0 -S 127.0.0.1 -i deny -v -n -o #15 ipfwadm -I -P all -W eth0 -S 192.168.3.5/32 -D 192.168.3.5/32 \ #16 -i deny -v -n -o #17 ipfwadm -I -y -P tcp -D 192.168.3.5/32 113 -a accept -v -n #18 # talkd doesn't need tcp connect flag - it's udp based. #19 ipfwadm -I -y -P tcp -D 192.168.3.5/32 1025:65035 -a accept -v -n -o #20 ipfwadm -I -y -P tcp -W eth0 -D 192.168.3.5/32 -a deny -v -n -o #21 --------- Cut ----------- Для удобства строки пронумерованы справа, однако если скопировать текст с 0 по 21 строки в файл и запустить его - ошибок не будет. Дело в том , что утилита ipfwadm предназначена для работы из командной строки, а при обработке командной строки в любом известном мне командном интерпретаторе (shell) unix все символы стоящие за симолом решетки (`#') игнорируются как комментарии(*). Здесь стоит отметить, что работа с правилами firewall с правом на их изменение доступна только пользователю root. (**) Итак - комментарий: Cтрока 0 определяет shell в котором будет исполнятся данный скрипт (командный файл) - в данном случае это bash, хотя может быть любой другой, например sh или ksh. Cтроки 1,8,13 будут проигнорированы, как пустые, - также как и строки состоящие только из коментариев: 2,9,14,19. Строки 3-7 очищают все цепочки правил firewall.(строка 6 сбрасывает счетчики пакетов) Строки 10 и 11 задают правила входящей и исходящей цепочек по умолчанию ( разрешить). Cтрока 12 задает запретное правило по умолчанию для цепочки forwarding/masqerading, а поскольку далее нет дополнительных команд -IP forwarding и, следовательно masqerading оказываются вообще запрещены. Строка 15 задает запрет для всех известных ipfwadm типов пакетов пытающихся войти в систему с сетевой карты с адресом принадлежащим интерфейсу loopback (***), тем самым сводя на нет возможную атаку при которой на внешний сетевой интерфейс посылают пакеты якобы произведенные внутренним, в общем случае не соотносящимся с каким либо физическим устройством (интерфейс lo может работать и без сетевой карты). Строки 16 и 17 являются одной строкой (****), которая обеспечивает защиту от аналогичных ,так называемых, spooffing атак, когда на () интерфейс извне присылаются пакеты от его же имени. Аналогичные строки необходимо иметь для всех сетевых интерфейсов. Строка 18 разрешает соединения к демону identd (необходимо для многих серверов,например для irc). Строка 20 необходима потому , что множество приложений работающих по протоколу tcp требуют ответа при коннекте к ним и для этого исполььзуются "не привелигированные порты" начиная с 1025. Строка 21 запрещает установку соединения по протоколу tcp к любому порту на сетевой карте с IP 192.168.3.5, однако поскольку ядро просматривает правила по порядку их задания - запрещены будут только те порты, которые не разрешены раньше. Это типичный конфигурационный файл для рабочей станции. Запрет по флагам tcp коннекта нужен чаще всего когда требуется отключить возможность пользоваться сервисами данной машины с удаленной стороны, но при этом сохранить возожность самим инициировать соединение (опция -y). Опция -v == verbose желательна с любой командой - при добавлении правила ipfwadm будет выдавать наглядное его отображение. Опция -n полезна , когда у вас в сети нет named (сервера имен), в любом случае вывод адресов в цифровом виде, а не в символическом сокращает время работы скрипта, да и иногда нагляднее. Опция -o (писать лог) крайне полезна вместе с правилами deny и выводом лог-сообщений `kern.*' на отдельную консоль (man syslogd) - если у вас не работает какой-то cервис , то в случае включения этой опции (и включения в ядре CONFIG_IP_FIREWALL_VERBOSE) вы немедленно увидите причину в логах. Кроме того опция -o крайне полезна при отладке firewall. Примечание: (*) Первая строка любого исполняемого файла интерпретируется кернел особым образом (см. man execve) и, поэтому, не является комментарием. (**) Вернее пользователю с uid и gid равными 0 , по умолчанию такими значениями идентификатора пользователя и групы обладает пользователь с именем root. (***) Подобные строки можно писать также для любого интерфейса ассоциированного с каким либо реальным устройством. (****) Знак косой черты "\" в Unix клонах обрабатывается как продолжение следующей строки, лишние пробелы игнорируются. Рассмотрим теперь более сложный пример: Есть сеть из нескольких (здесь 4х) компьютеров с сервером на OS Linux и клиентами Windows и Linux. К серверу подкллючена линия доступа к интернет(ppp соединение). Требуется обеспечить доступ к интернет для остальных компьютеров, с учетом того, что у вас есть всего один интернет адрес - 195.218.173.129 (*), одна сетевая карта и один модем. Коментарии будут теперь идти по ходу управляющих команд, за знаком коментария `#'. --------- Cut ----------- #!/bin/sh # /etc/rc.d/rc.firewall, define the firewall configuration, invoked from # rc.local. # Ссылка на этот файл конфигурации firewall помещена в файл загрузки # системы rc.local . Часть функций firewall реализована ввиде модулей, # поэтому сначала мы загружаем все необходимые нам модули. /sbin/depmod -a /sbin/modprobe ip_masq_ftp /sbin/modprobe ip_masq_raudio /sbin/modprobe ip_masq_irc /sbin/modprobe ip_masq_cuseeme /sbin/modprobe ip_masq_vdolive # Сброс правил подсчета траффика. ipfwadm -A -f # Этот абзац задает правила по умолчанию (запрет) для всех цепочек. # Flush and set default policy of deny. ipfwadm -I -f ipfwadm -I -p deny ipfwadm -O -f ipfwadm -O -p deny # Следует иметь ввиду, что пока не указано обратного, по умолчанию, # правила forwarding'а используются. ipfwadm -F -f ipfwadm -F -p deny # В сети частенько встречаются люди которые любят похулиганить - эта # строчка как раз для таких людей имеющих постояный IP адрес - запрет # любого траффика с этого хоста. Нет необходиости записывать аналогичное # правило для выходящих пакетов - они, обычно, идут в ответ на пакеты # "атакующего", так что через небольшое время будет не на что отвечать. ipfwadm -I -P all -i deny -S 195.46.168.168/32 -D 195.218.173.129 # в следующем абзаце дается разрешение на проход пакетов с адресов # внутренней сети, включая dialup адреса (sl* , ppp*). Опция -V введена # для того , чтобы отсечь другие интерфейсы, к которым клиенты # подключены быть не могут. # Введен также параметр с названием интерфейса-шлюза - eth0. Это может # иметь смысл с той точки зрения, что различные устройства могут иметь # одинаковый IP адрес,а маршрутизация может идти при этом, например, по # оценке "стоимости" отсылки пакета на iface. # Важно отметить еще один аспект - я предпочитаю задавать имя машин в # цифровом виде, поскольку иначе работа firewall будет зависеть от # корректной работы сервера имен. #IP addr. of eth0,lo & ppp0 eth0=192.168.0.3 ppp0=195.218.173.129 lo=127.0.0.1 # mashine addresses kbg=192.168.0.5 klay=192.168.0.2 vproxy=192.168.0.4 guest=192.168.0.8 acer=192.168.0.10 alex=192.168.0.25 # Для мобильного пользователя подключающегося через локальную сеть. notebook=192.168.3.5 # Наличие такого количества dialup адресов объясняется тем, что по модему могут # звонить разные клиенты с разными настройками. # dialups w/ almost same options: dialup0=192.168.4.120 dialup1=192.168.4.121 dialup2=192.168.4.122 # restricted dialup: dialup3=192.168.4.123 # dialup allowed to connect the LAN (**): dialup4=192.168.4.124 # address of anywhere. :) any=0.0.0.0/0 # Все что угодно приходящее для нас через внешний iface на адрес этого # iface пропускается, если нет запрета (добавляем в конец правил) ipfwadm -I -a accept -V $ppp0 -S $any -D $ppp0/32 # C loopback принимаем пакеты в любое место (ниже - ограничения) ipfwadm -I -a accept -V $lo -S $any -D $any # ethernet ipfwadm -I -a accept -V $eth0 -W eth0 -S $kbg/32 -D $any -v -n ipfwadm -I -a accept -V $eth0 -W eth0 -S $klay/32 -D $any -v -n ipfwadm -I -a accept -V $eth0 -W eth0 -S $vproxy/32 -D $any -v -n ipfwadm -I -a accept -V $eth0 -W eth0 -S $guest/32 -D $any -v -n ipfwadm -I -a accept -V $eth0 -W eth0 -S $acer/32 -D $any -v -n ipfwadm -I -a accept -V $eth0 -W eth0 -S $alex/32 -D $any -v -n ipfwadm -I -a accept -V $eth0 -W eth0 -S $notebook/32 -D $any -v -n # dialup ipfwadm -I -a accept -V $dialup0 -W ppp1 -S $dialup0/32 -D $any -v -n ipfwadm -I -a accept -V $dialup0 -W sl0 -S $dialup0/32 -D $any -v -n ipfwadm -I -a accept -V $dialup1 -W ppp1 -S $dialup1/32 -D $any -v -n ipfwadm -I -a accept -V $dialup1 -W sl0 -S $dialup1/32 -D $any -v -n ipfwadm -I -a accept -V $dialup2 -W ppp1 -S $dialup2/32 -D $any -v -n ipfwadm -I -a accept -V $dialup2 -W sl0 -S $dialup2/32 -D $any -v -n # для ограничения доступа не далее шлюзового компьютера(server'a) # надо задавать в destination address (-D) адрес одного из interface'ов # вместо маски включающей все адреса: ipfwadm -I -a accept -V $dialup3 -W ppp1 -S $dialup3/32 -D $eth0 -v -n ipfwadm -I -a accept -V $dialup3 -W sl0 -S $dialup3/32 -D $eth0 -v -n # Для того, чтобы пользователи dialup соединения могли работать # с сетью ethernet нужно задать еще правило accept для адреса eth0 # Однако в данном примере такой адрсе уже входит в спецификацию $any. ipfwadm -I -a accept -V $dialup4 -W ppp1 -S $dialup4/32 -D $any -v -n ipfwadm -I -a accept -V $dialup4 -W sl0 -S $dialup4/32 -D $any -v -n # для остальных имеющихся iface'ов имеет смысл задать точные запрещающие # правила, несмотря на default policy of deny это может предохранить от # возможных ошибок.. Нижеследующий абзац направлен против подстановки # неверных адресов источника пакетов. Обратите внимание, что запрещаются # пакеты не для хоста, а для сети и запрет вставляется в начало цепочки. # Одно из очень хороших нововведений ipchains - расширенный синтаксис - # возможность производить логические операции с указанным IP параметром, # например отрицание (не), впрочем ipchains здесь не рассматривается.. ipfwadm -I -i deny -V $ppp0 -S $dialup0/32 -D $any -o -v -n ipfwadm -I -i deny -V $ppp0 -S $dialup1/32 -D $any -o -v -n ipfwadm -I -i deny -V $ppp0 -S $dialup2/32 -D $any -o -v -n ipfwadm -I -i deny -V $ppp0 -S $dialup3/32 -D $any -o -v -n ipfwadm -I -i deny -V $ppp0 -S $dialup4/32 -D $any -o -v -n ipfwadm -I -i deny -V $ppp0 -S $eth0/32 -D $any -o -v -n ipfwadm -I -i deny -V $ppp0 -S $notebook/24 -D $any -o -v -n ipfwadm -I -i deny -V $eth0 -S $dialup0/24 -D $any -o -v -n ipfwadm -I -i deny -V $eth0 -S $dialup1/24 -D $any -o -v -n ipfwadm -I -i deny -V $eth0 -S $dialup2/24 -D $any -o -v -n ipfwadm -I -i deny -V $eth0 -S $dialup3/24 -D $any -o -v -n ipfwadm -I -i deny -V $eth0 -S $dialup4/24 -D $any -o -v -n ipfwadm -I -i deny -V $lo -S $dialup0/24 -D $any -o -v -n ipfwadm -I -i deny -V $lo -S $dialup1/24 -D $any -o -v -n ipfwadm -I -i deny -V $lo -S $dialup2/24 -D $any -o -v -n ipfwadm -I -i deny -V $lo -S $dialup3/24 -D $any -o -v -n ipfwadm -I -i deny -V $lo -S $dialup4/24 -D $any -o -v -n ipfwadm -I -i deny -V $lo -S $eth0/24 -D $any -o -v -n ipfwadm -I -i deny -V $lo -S $notebook/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup0 -S $eth0/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup0 -S $notebook/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup0 -S $lo/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup0 -S $ppp0/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup1 -S $ppp0/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup1 -S $eth0/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup1 -S $notebook/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup1 -S $lo/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup2 -S $ppp0/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup2 -S $eth0/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup2 -S $notebook/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup2 -S $lo/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup3 -S $ppp0/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup3 -S $eth0/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup3 -S $notebook/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup3 -S $lo/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup4 -S $eth0/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup4 -S $lo/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup4 -S $notebook/24 -D $any -o -v -n ipfwadm -I -i deny -V $dialup4 -S $ppp0/24 -D $any -o -v -n # Следующие строки запрещают некоторые развлекательные сервисы интернет: ####Deny all Real Audio to all: ipfwadm -I -P tcp -i deny -S $any 7070 -D $any -o -v -n ipfwadm -O -P tcp -i deny -S $any -D $any 7070 -o -v -n ipfwadm -I -P udp -i deny -S $any 7070 -D $any -o -v -n ipfwadm -O -P udp -i deny -S $any -D $any 7070 -o -v -n #### ####Deny all mp3 Audio to all: ipfwadm -I -P tcp -i deny -S $any 8000 -D $any -o -v -n ipfwadm -O -P tcp -i deny -S $any -D $any 7070 -o -v -n ipfwadm -I -P udp -i deny -S $any 8000 -D $any -o -v -n ipfwadm -O -P udp -i deny -S $any -D $any 7070 -o -v -n #### ####Deny all Real Video to all: ipfwadm -I -P tcp -i deny -S $any 554 -D $any -o -v -n ipfwadm -O -P tcp -i deny -S $any -D $any 7070 -o -v -n ipfwadm -I -P udp -i deny -S $any 554 -D $any -o -v -n ipfwadm -O -P udp -i deny -S $any -D $any 7070 -o -v -n #### ####Deny irc for vproxy ipfwadm -I -P tcp -i deny -S $vproxy/24 -D $any 6667 -o -v -n ipfwadm -I -P udp -i deny -S $vproxy/24 -D $any 6667 -o -v -n #### # Cдесь стоит отметить, что правила запрещающие по принципу "один из # всех" на мой взгляд лучше писать в начало цепочки - немного ускорит # обработку - запрещенные пакеты будут отсеиваться раньше,да и вообще # схема в которой пакеты сначала отвергаются, и только оставшиеся # разрешаются, причем как можно более четкими правилами, является # наиболее жффективным продолжением политики задаваемой опцией '-p deny'. # Ну и наконец правило, запрещающее проход любых не разрешенных пакетов, # которые мы забыли запретить отдельной записью: ipfwadm -I -a deny -S $any -D $any -o -v -n # Теперь определим ограничения для входящего траффика # Локальный interface, любой выходящий от нас пакет следует разрешить, оговорив # исключения отдельно, поскольку иначе могут возникунуть проблемы при # добавлении записей в таблицу маршрутизации. ipfwadm -O -a accept -V $eth0 -S $any -D $eth0/24 -v -n ipfwadm -O -a accept -V $eth0 -S $any -D $notebook/24 -v -n # Поскольку выбранные нами локальные адреса не дожны ходить через # internet , то можно запретить проход вовне всех пакетов на адреса, # находящиеся внутри, а заодно и вовсе на весь список адресов , которые # зарезервированы для локальных сетей. ipfwadm -O -i deny -V $ppp0 -S $any -D $eth0/24 -o -v -n ipfwadm -O -i deny -V $ppp0 -S $any -D $notebook/24 -o -v -n # Запрет выхода заспуффенных пактов из локальной сети (в HOWTO также # называетсяng stuffed routing) вовне ipfwadm -O -i deny -V $ppp0 -S $eth0/24 -D $any -o -v -n ipfwadm -O -i deny -V $ppp0 -S $notebook/24 -D $any -o -v -n # То-же для dialup: ipfwadm -O -i deny -V $ppp0 -S $dialup0/24 -D $any -o -v -n ipfwadm -O -i deny -V $ppp0 -S $dialup1/24 -D $any -o -v -n ipfwadm -O -i deny -V $ppp0 -S $dialup2/24 -D $any -o -v -n ipfwadm -O -i deny -V $ppp0 -S $dialup3/24 -D $any -o -v -n ipfwadm -O -i deny -V $ppp0 -S $dialup4/24 -D $any -o -v -n # То-же для loopback: ipfwadm -O -i deny -V $ppp0 -S $lo/24 -D $any -o -v -n # Следует отметить, что когда $dialup* в одной подсети достаточно одной записи. # Запрет выхода заспуффенных пакетов через внешний iface в локальную # сеть ( в HOWTO также называетсяng stuffed masqerading) ipfwadm -O -i deny -V $ppp0 -S $any -D $eth0/24 -o -v -n ipfwadm -O -i deny -V $ppp0 -S $any -D $notebook/24 -o -v -n # То-же для dialup: ipfwadm -O -i deny -V $ppp0 -S $any -D $dialup0/24 -o -v -n ipfwadm -O -i deny -V $ppp0 -S $any -D $dialup1/24 -o -v -n ipfwadm -O -i deny -V $ppp0 -S $any -D $dialup2/24 -o -v -n ipfwadm -O -i deny -V $ppp0 -S $any -D $dialup3/24 -o -v -n ipfwadm -O -i deny -V $ppp0 -S $any -D $dialup4/24 -o -v -n # То-же для loopback: ipfwadm -O -i deny -V $ppp0 -S $any -D $lo -o -v -n # Все остальное выходящее с внешнешнего iface разрешено. ipfwadm -O -a accept -V $ppp0 -S $ppp0/32 -D $any # Пакеты с loopback пропускаем куда угодно (кроме указанных выше ограничений) ipfwadm -O -a accept -V $lo -S $any -D $any # Как и для цепочки правил выходящих сообщений имеет смысл указать правило # запрещающее все что мы, возможно, забыли запретить. :) ipfwadm -O -a deny -S $any -D $any -o # Forwarding (то чего не было в предыдущем примере). # Masquerade from local net on local interface to anywhere. # Описание правил для конкретных хостов: ipfwadm -F -m -a accept -W ppp0 -V $ppp0 -S $klay/32 -D $any -o -v -n # Для этого узла введен аккаунтинг: ipfwadm -A out -i -W ppp0 -V $ppp0 -S $vproxy/32 -D $any -v -n # ipfwadm -F -m -a accept -W ppp0 -V $ppp0 -S $vproxy/32 -D $any -o -v -n ipfwadm -F -m -a accept -W ppp0 -V $ppp0 -S $kbg/32 -D $any -o -v -n ipfwadm -F -m -a accept -W ppp0 -V $ppp0 -S $guest/32 -D $any -o -v -n ipfwadm -F -m -a accept -W ppp0 -V $ppp0 -S $acer/32 -D $any -o -v -n ipfwadm -F -m -a accept -W ppp0 -V $ppp0 -S $alex/32 -D $any -o -v -n ipfwadm -F -m -a accept -W ppp0 -V $ppp0 -S $notebook/32 -D $any -o -v -n # тоже для dialup клиенетов: ipfwadm -F -m -a accept -W ppp1 -V $dialup0 -S $dialup0/32 -D $any -o -v -n ipfwadm -F -m -a accept -W sl0 -V $dialup0 -S $dialup0/32 -D $any -o -v -n ipfwadm -F -m -a accept -W ppp1 -V $dialup1 -S $dialup1/32 -D $any -o -v -n ipfwadm -F -m -a accept -W sl0 -V $dialup1 -S $dialup1/32 -D $any -o -v -n ipfwadm -F -m -a accept -W ppp1 -V $dialup2 -S $dialup2/32 -D $any -o -v -n ipfwadm -F -m -a accept -W sl0 -V $dialup2 -S $dialup2/32 -D $any -o -v -n ipfwadm -F -m -a accept -W ppp1 -V $dialup3 -S $dialup3/32 -D $eth0 -o -v -n ipfwadm -F -m -a accept -W sl0 -V $dialup3 -S $dialup3/32 -D $eth0 -o -v -n ipfwadm -F -m -a accept -W ppp1 -V $dialup4 -S $dialup4/32 -D $any -o -v -n ipfwadm -F -m -a accept -W sl0 -V $dialup4 -S $dialup4/32 -D $any -o -v -n # В используемой автором версии ipfwadm в man не было документировано, что # запись `-F -m -a` accept эквивалентна `-F -a masquerade`, однако несмотря # на то, что такая возможность существует, я предпочел воспользоваться немного # более краткой и документированной записью. # И, уже не раз упомянутый, принцип запретить все, что не разрешали: # catch all rule, all other forwarding is denied and logged. ipfwadm -F -a deny -S $any -D $any -o -v -n # Без этой строки роутинг для этой сети будет по умолчанию на другой # (обычно внешний) iface. route add -net 192.168.3.0 eth0 --------- Cut ----------- Примечание: (*) Подробнее о классах сетей можно прочесть , например, в том-же NET-*-HOWTO,IP-Subnetworking и многих других источниках, поэтому ограничимся только напоминанием, что для внутренних сетей без выхода в интернет зарезервирован специальный диапазон адресов, в частности для сетей класса С (классы делят сети по размеру (максимально возможному количеству машин в сети) и характеризуются в т.ч. различными значениями broadcast и netmask) выделены адреса сетей 192.168.*.* . В данном случае под интернет адресом понимается адрес не входящий в зарезервированные для внутренних сетей диапазон. (**) Для корректной натсройки доступа к локальной сети (LAN) необходимо воспользваться специальной опцией pppd (см. man pppd). 5. Некоторые типичные ошибки и частные случаи. При указании хоста следует указывать маску /32 или не указвать маску вовсе, если же указать маску /24 это автоматически будет считаться указанием сети, например: ipfwadm -I -P tcp -y -D 192.168.3.5/24 -a deny -v -n -o даст: deny tcp opt --yo tos 0xFF 0x00 via * 0.0.0.0 0.0.0.0/0 -> 192.168.3.0/24 * -> * Как видим ipfwadm отбросил здесь .5 и соединение не удастся установить со всей сетью. 6. Использованное оборудование и литература. *. Литература: a) man 8 ipfwadm ---cut--- AUTHOR Jos Vos X/OS Experts in Open Systems BV, Amsterdam, The Netherlands July 30, 1996 ---cut--- b) man 4 ipfw, man 2 setsockopt, man 2 socket , man --------- источник: Linux Programmer's Manual --------- c) IPCHAINS-HOWTO-RUS 1.01 (практически полный перевод оригинального английского HOWTO, сделан для публикации на linux.irk.ru Вячеславом Калошиным) d) ipfwadm README . e) Linux Firewall-HOWTO . --------- Firewall and Proxy Server HOWTO Mark Grennan, mark@grenna.com v0.65, 6 September 1999 --------- f) "UNIX , руководство системного администратора." Эви Немет, Гарт Снайдер, Скотт Сибасс, Трент Р. Хейн. Второе издание. BHV 1997, перевод С.М. Тимачева, под ред. М.В. Колымцева g) "TCP/IP освой самостоятельно." Тимоти Паркер. Второе издание , перевод под ред. А. Тихонова. Москва, БИНОМ. 1997 h) *. Оборудование: a) IBMish notebook PC: cpu : 486 model : 486 SX vendor_id : GenuineIntel flags : vme bogomips : 16.64 MemTotal : 8 MB /dev/hda : 190 MB SwapTotal : 15 MB b) OS Linux Red Hat версии 4.2 с ядром версии 2.0.37: [root@sunrise /]# uname -a Linux sunrise.digger.org.ru 2.0.37 #4 Thu Dec 9 06:04:32 MSK 1999 i486 c) утилиты: [root@sunrise /]# rpm -q ipfwadm vim net-tools NetKit-B bind-utils ipfwadm-2.3.0-2 vim-4.5-2 net-tools-1.32.alpha-2 NetKit-B-0.09-6 bind-utils-4.9.5p1-2 [root@sunrise /]# rpm -q traceroute rpm traceroute-1.0.4.4bsd-2 rpm-2.3.11-1 7. Заключение. Несмотря на то, что данная курcовая работа рассматривает идеологически устаревший (с появлением ipchains и ядер 2.2.*) вариант настройки firewall, она тем не менее может быть полезна для начинающих системных администраторов Linux при изучении работы firewall систем, как один из немногих русскоязычных ресурсов по данной тематике. Тем более, что принципиальных изменений в алгоритмах работы firewall с проявлением ipchains не произошло - основные, на мой взгляд изменения - расширился синтаксис, а цепочек по прежнему 4. :-) Feedback: Ваши замечания приветствуются. Как и всякий человек, я не застрахован от ошибок. Мои электронные адреса: olli@unix.kg olli@rosmol.ru olli@f1354.n5020.z2.fidonet.org 2:5020/1354@fidonet.org olli@grex.cyberspace.org Спасибо: Прежде всего преподавателю МАИ по каф. 304 - Чугаеву Борису Николаевичу - за тему курсового проекта - для меня гораздо более интересную, чем, например, минимизация булевой функции восьми переменных. :) Во вторых тем кто писал документы из списка литературы. Ну и наконец всем кто отвечал на мои вопросы - как никак они иногда возникали несмотря на обилие документации.Ж:-) 8. Лицензия. Вы можете использовать или не использовать этот текст на свое усмотрение и на свой страх и риск - нет никаких гарантий от возможного ущерба при использовании или не использовании материалова данной курсовой работы. Допускается свободная перепечатка и вставка материалов данной курсовой работы в любом некоммерческом проекте, с обязательной ссылкой на автора и список использованной им литературы. Копирайты. Все упоминающиеся в данной курсовой работе названия OS являются собственностью соответствующих организаций и фирм для(на) которых они зарегистрированы. Публикация. После сдачи этой курсовой работы я выставлю ее на всеобщее обозрение на http://vgsn.glasnet.ru/olli/ , а после того как наш совместный с Петром Черниковм (peter@romol.ru, 2:5020/1354.332) проект сервера digger.org.ru будет завершен, этот текст будет доступен по ссылкам с http://digger.org.ru (пока проект в зачаточном состоянии - всего навсего зарегистрирован домен). PS: Ну прям как у больших дядей из Free Software Foundation.;-))