Колонка редактора
Как это работает
Профессионал
Новости
Вопросы и ответы
Литература


Начальная страница
E-mail


Кто не спрятался, я не виноват!

Фильтрация пакетов, firewall и маскарадинг в Линуксе




О чем это вообще?

Это о пересылке (forwarding), маскарадинге (masquerading) и фильтрации IP-пакетов на Линуксе с ядрами 2.1.* и выше и, в частности, о программе ipchains. Ссылки на более подробные материалы смотри внизу. В этой статье не рассматриваются вопросы маршрутизации, подробности работы протоколов семейства TCP/IP и проксирования, а также подробности настройки и конфигурирования ядер, сетевых интерфейсов и комплексной защиты от хакеров ;-)

Как известно, все коммуникации, использующие протокол IP, передают данные в виде пакетов. В начале каждого пакета есть заголовок, в котором написано, от кого и кому этот пакет (в виде IP-адресов), к какому протоколу более высокого уровня он относится (ICMP, TCP, UDP и т.п.), в некоторых случаях (для протоколов UDP и TCP) - номера портов отправителя и получателя, а также другая специфическая информация.

На пути от отправителя к получателю пакет может проходить через промежуточные узлы. В зависимости от информации, которая содержится в заголовке IP-пакета, они могут этот пакет переслать на следующий узел (forward), передать локальной программе для обработки, уничтожить (deny), отвергнуть, т.е. уничтожить и отправить об этом уведомление отправителю (reject). Выбор и осуществление одного из этих действий и называется фильтрацией пакетов.

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

Firewall (или "по-русски" - брандмауэр, хотя у меня язык не поворачивается его так называть) - это программа или специализированная железка, которая, основываясь на некоторых правилах, разрешает или запрещает передачу информации, проходящей через нее, с целью ограждения некоторой подсети от внешнего доступа или наоборот, для недопущения выхода наружу. Firewall может определять правомерность передачи информации на основе только заголовков IP-пакетов, а может анализировать и их содержимое, т.е. использовать данные протоколов более высокого уровня.

Маскарадинг - это подмена некоторых параметров в заголовках IP-пакетов, позволяющая машинам, не имеющим реальных IP-адресов, практически полноценно работать в интернете.

Прозрачное проксирование (transparent proxying) - это переадресация пакетов на другой порт машины. Обычно используется для того, чтобы заставить пользователей из локальной сети пользоваться местным proxy-сервером без дополнительного конфигурирования их клиентских программ.

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



А зачем оно нужно?

Зачем нужен firewall - и так понятно. Вы же не хотите, чтобы ваш компьютер, или вся сеть, подключенная к интернету, были доступны всем желающим. Доступ должен разрешаться только туда, куда вы решите. А одним из простых вариантов firewall'а как раз и является фильтр пакетов.

Маскарадинг - вещь менее очевидная. Если у вас один компьютер с dial-up подключением, то он вам и не нужен. А как быть, если у вас в организации локальная сеть, и все хотят в интернет, а провайдер дал вам один-единственный IP-адрес? Или того хуже, вы организовали сеть дома с соседями, а dial-up у вас один, да еще с динамическим адресом? Ну или просто ваша жена скучает, когда вы бродите по интернету, и вы купили ей отдельный компьютер, и даже соединили его со своим, а телефонная линия у вас все равно одна и dial-up account тоже?

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

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

Замечу, что "локальная сеть" может состоять из двух или более компьютеров (или даже виртуальных компьютеров на одном физическом), и совершенно неважно, как именно они соединены между собой (Ethernet, последовательный, параллельный или инфракрасный порт, USB или еще как-нибудь). Не играет особой роли и протокол, по которому эти компьютеры общаются между собой, подойдет и SLIP, и PLIP, и PPP, и IP-туннель над другим протоколом.. Единственное, что действительно требуется - чтобы этот протокол поддерживал передачу IP-пакетов.

Как выбрать адреса для машин в локальной сети? Если ваш интернет-провайдер выделил вам пул адресов, то адреса надо брать из него. Если же вам выделяется только один адрес (в том числе, и динамический) то в локальной сети настоятельно рекомендуется выбирать адреса из специально выделенных диапазонов 192.168.0.*, 172.16.0.0 - 172.31.255.255 или 10.*.*.* (так называемые fake-адреса, не маршрутизирующиеся глобально). (См. RFC 1597). Сконфигурированный для маскарадинга шлюз может менять заголовки IP-пакетов, пришедших из вашей локальной сети и отправлять их получателю уже со своего реального IP-адреса. В полученных снаружи ответных пакетах он меняет адрес получателя обратно на fake-адрес и пересылает пакет по назначению.

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

Вот два примера для более четкого понимания, зачем и как можно настроить локальную сеть для работы с интернетом:

Пример 1: локальная сеть и единственный реальный IP-адрес

У вас есть локальная сеть, единственный выход в интернет (например, dial-up по ppp, хотя это не существенно) и шлюзовой компьютер с реальным выделенным IP-адресом (например, 1.2.3.4). На интерфейсе локальной сети этот компьютер имеет адрес 192.168.1.1. В локальной сети находится компьютер myhost с адресом 192.168.1.100, с которого вы хотите пользоваться интернет-браузером. Как это реализовать?

Вариант 1 (прозрачное проксирование): на компьютере firewall устанавливается proxy-сервер, все пакеты из локальной сети, адресованные на внешние http-серверы заворачиваются в этот proxy-сервер, который посылает запросы вовне со своего реального адреса 1.2.3.4, а полученные ответы пересылает обратно в локальную сеть. При этом браузер на машине myhost конфигурируется как для прямого соединения с интернетом, потому такое проксирование и называется прозрачным. С точки зрения удаленного http-сервера соединение устанавливается с вашего шлюза. С точки зрения браузера соединение устанавливается с удаленным сервером.

Вариант 2 (маскарадинг): у всех пакетов из локальной сети, адресованных вовне, адрес отправителя меняется на 1.2.3.4, а у приходящих в ответ пакетов адрес получателя заменяется на 192.168.1.100 и они пересылаются на машину myhost. С точки зрения удаленного сервера соединение устанавливается с вашим шлюзом. С точки зрения браузера соединение устанавливается с удаленным сервером.

Пример 2: локальная сеть с реальными IP-адресами

У вас есть локальная сеть с постоянным подключением к интернету. Все машины в локальной сети имеют реальные IP-адреса из пула 1.2.3.x. Шлюзовой компьютер имеет IP-адрес 1.2.3.4. Внутри сети установлен компьютер с адресом 1.2.3.10, который вы хотите сделать доступным для всего интернета, но только в качестве http-сервера.

В такой конфигурации фильтр пакетов может использоваться для ограничения доступа, в частности, внутрь вашей сети из остального интернета.

Вариант 1 (редиректор): пересылка пакетов из интернета внутрь вашей сети и обратно запрещена. На шлюзе на определенном порту ожидает входящих соединений программа, называемая редиректором. При установке соединения извне она также устанавливает соединение с сервером внутри вашей сети и производит прозрачную пересылку данных в обе стороны. С точки зрения вашего сервера соединение устанавливается с вашего же шлюза. С точки зрения удаленного клиента в интернете соединение устанавливается со шлюзом. Преимущество в том, что никакие другие соединения с вашим сервером из интернета не могут быть установлены, что сильно повышает безопасность. Недостаток в том, что сервер не может определить, с каким клиентом он реально работает.

Вариант 2 (требуется ядро 2.1.x или выше, либо патченное на предмет ipportfw 2.0.x): идея примерно та же, что и при редиректе, но реализуется другим способом. Ядро меняет адрес получателя для определенных пакетов и пересылает их в локальную сеть. С точки зрения сервера соединение устанавливается с удаленным клиентом, с точки зрения клиента соединение устанавливается со шлюзом. Недостаток предыдущего варианта устраняется: сервер видит реального клиента.

Страница 2 >>