|
|
Кто не спрятался, я не виноват!Фильтрация пакетов, 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-пакетов, а может анализировать и их содержимое, т.е. использовать данные протоколов более высокого уровня. Маскарадинг Прозрачное проксирование (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-адреса, не маршрутизирующиеся глобально).
(См. ).
Сконфигурированный для маскарадинга шлюз может менять заголовки IP-пакетов,
пришедших из вашей локальной сети и отправлять их получателю уже со своего
реального IP-адреса. В полученных снаружи ответных пакетах он меняет адрес
получателя обратно на fake-адрес и пересылает пакет по назначению.
Вы, конечно, можете назначить своим компьютерам и чужие реальные адреса,
но это чревато некоторыми неприятностями. При использовании
маскарадинга вы не сможете связаться с удаленными хостами, которым
эти адреса принадлежат по праву (поскольку ваш шлюз будет думать, что они
находятся в
вашей локальной сети). При отсутствии маскарадинга у вас просто не установится
ни одно соединение,
поскольку никто, кроме вашего шлюза, не будет маршрутизировать
пакеты для чужих адресов в вашу сеть.
Вот два примера для более четкого понимания, зачем и как можно настроить
локальную сеть для работы с интернетом:
У вас есть локальная сеть, единственный выход в интернет (например, 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. С точки зрения удаленного сервера соединение устанавливается с вашим
шлюзом. С точки зрения браузера соединение устанавливается с удаленным
сервером.
У вас есть локальная сеть с постоянным подключением к интернету. Все машины
в локальной сети имеют реальные IP-адреса из пула 1.2.3.x.
Шлюзовой компьютер имеет IP-адрес 1.2.3.4. Внутри сети установлен компьютер с
адресом 1.2.3.10, который вы хотите сделать доступным для всего интернета, но
только в качестве http-сервера.
В такой конфигурации фильтр пакетов может использоваться для ограничения
доступа, в частности, внутрь вашей сети из остального интернета.
Вариант 1 (редиректор): пересылка пакетов из интернета внутрь вашей сети и
обратно запрещена. На шлюзе на определенном порту ожидает входящих соединений
программа, называемая редиректором. При установке соединения извне она также
устанавливает соединение с сервером внутри вашей сети и производит прозрачную
пересылку данных в обе стороны. С точки зрения вашего сервера соединение
устанавливается с вашего же шлюза. С точки зрения удаленного клиента в
интернете соединение устанавливается со шлюзом. Преимущество в том, что
никакие другие соединения с вашим сервером из интернета не могут быть
установлены, что сильно повышает безопасность. Недостаток в том, что сервер не
может определить, с каким клиентом он реально работает.
Вариант 2 (требуется ядро 2.1.x или выше, либо патченное на предмет
ipportfw 2.0.x): идея примерно та же, что и при редиректе, но реализуется
другим способом.
Ядро меняет адрес получателя для определенных пакетов и пересылает их в
локальную сеть. С точки зрения сервера соединение устанавливается с удаленным
клиентом, с точки зрения клиента соединение устанавливается со шлюзом.
Недостаток предыдущего варианта устраняется: сервер видит реального клиента.
| ||||||||||||||||