007 Системный Администратор 06 2003

Page 31

администрирование с трафиком, определяет только оно: трафик будет беспрепятственно проходить, если правило по умолчанию accept (ядро собрано с опцией IPFIREWALL_DEFAULT_TO_ACCEPT), и уничтожаться в противном случае. Когда по умолчанию трафик запрещен, если вы начали настраивать фильтр пакетов удаленно, то на этом настройка, скорее всего, и закончится. Очистив фильтр, вы тем самым удалили правило, которое позволяло поддерживать вам удаленную сессию доступа. Для того чтобы этого не произошло, нужно было добавить команду, разрешающую трафик: # ipfw -q flush && ↵ ipfw add 65000 allow ip from any to any

Теперь компьютер открыт всему миру, и в данном случае открытость – не самое лучшее его качество. Нужно закрыть все лишнее. Пусть: Трафик с адресами 127.0.0.0/8 разрешен только через интерфейс обратной петли; Запрещается весь трафик, приходящий через внешний интерфейс (назовем его ${external}), если у него адрес отправителя или получателя относится к диапазону зарезервированных для внутреннего использования адресов; Разрешаются только входящие TCP-соединения на 22, 25 и 80 порты, то есть мы принимаем соединения из Интернета, адресованные только нашему SSH, почтовому и веб-серверам; Разрешены любые исходящие TCP-соединения, то есть мы можем соединяться с любым компьютером в Интернете, когда сами этого захотим; Разрешается UDP-трафик на 53 и с 53 порта, то есть трафик, необходимый для работы DNS; Разрешается прохождение исходящих эхо-запросов и входящих эхо-ответов, то есть мы можем пинговать внешние компьютеры, а они нас нет; Весь остальной трафик должен быть заблокирован. Запрет локального трафика не через локальный интерфейс выполняется правилами, которые уже стали традиционными при настройке фильтра пакетов: # ipfw add 100 allow ip from any to any via lo0 # ipfw add 200 deny ip from any to 127.0.0.0/8 # ipfw add 300 deny ip from 127.0.0.0/8 to any

Первое правило разрешает любой трафик через интерфейс петли обратной связи lo0. Следующие два запрещают весь трафик, который приходит с зарезервированных адресов из сети 127.0.0.0/8. Правила 200 и 300 сработают только в том случае, если пакет прошел не через интерфейс lo0. Трафик с адресами внутренних сетей (RFC 1918) не должен приходить через внешний интерфейс. # ipfw add deny from any to 10.0.0.0/8 via ${external} # ipfw add deny from any to 172.16.0.0/12 via ${external} # ipfw add deny from any to 192.168.0.0/16 via ${external}

Такой же трафик не должен и уходить, хотя, в сущности, для нас это менее важно:

№6(7), июнь 2003

# ipfw add deny from 10.0.0.0/8 to any via ${external} # ipfw add deny from 172.16.0.0/12 to any via ${external} # ipfw add deny from 192.168.0.0/16 to any via ${external}

Ключевая часть фильтрации: мы хотим, чтобы из внешней сети были доступны только те сервисы, которые нужно, и не более того. Нужно, чтобы наш компьютер можно было удаленно администрировать с помщью SSH (22); он должен принимать почту по протоколу SMTP (25) и поддерживать веб-сервер (80): # ipfw add 2000 allow tcp from any to ${external} 22,25,80 setup # ipfw add 2100 allow tcp from any to any established

Первое правило разрешает устанавливать соединения из любой точки сети на внешний интерфейс нашего хоста ${external} по портам 22, 25 и 80. Ключевое слово setup в конце строки говорит о том, что правило относится только к пакетам, инициирующим соединение (то есть тем, которые имеют установленный флаг SYN и сброшенные ACK и RST). Второе правило относится к другим пакетам: тем, которые передаются в рамках уже установленного соединения. Такие пакеты разрешаются все. Логика правила очень простая: «Если соединение уже каким-то образом удалось установить, то значит все нормально, данные могут проходить. Если же соединение не установлено, а пакет просто делает вид, что относится к какому-то соединенеию, ну что ж, это его проблемы, он все равно никому не нужен.» Правило рассуждает так, но здесь оно немного ошибается. В определенных случаях подобный пакет, если его умело составить, может нанести вред компьютерам за брандмауэром. Для того чтобы справиться с такими пакетами, нужно использовать фильтр с поддержкой состояний (stateful), но об этом в другой раз. Если соединение хотим установить мы, то препятствий быть не должно: # ipfw add 3000 allow tcp from ${external} to any setup

Обратите внимание на то, что мы разрешаем соединение только с одного IP-адреса. Если же нас интересует несколько IP-адресов, то мы должны указать их либо в виде адреса сети, либо создать несколько правил – по одному для каждого из адресов. Следующее правило относится к UDP-трафику. Этот трафик справедливо заслужил репутацию не самого безопасного: из-за отсутствия внутренних механизмов контроля соединения отследить его действительный источник практически невозможно, что делает подмену адресов легким делом. Проблема осложняется тем, что этот трафик используют такие потенциально небезопасные службы, как, например, NFS. Внутри сети UDP ведет себя хорошо: неперегруженный лишними механизмами обеспечения надежной доставки и контроля соединения, он легок и экономичен, и в сети это, определенно, является благом, но за ее пределами все обстоит совершенно иначе. В результате правило работы с UDP звучит так: если от UDP нельзя избавиться совсем, его должно быть как можно меньше. # ipfw add 4000 allow udp from ${external} to any 53 # ipfw add 4100 allow udp from any 53 to ${external}

29


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.