Большинство из нас привыкло к стандартным решениям, которые не пересматриваются годами. Так защиту винды мы доверяем одному и тому же комплекту программ — файрвол, антивирус, антишпионская программа… Подобный набор есть у каждого, отличаются лишь производители. Мы же попробуем другой путь — использовать в качестве блокпоста *nix систему, запущенную в виртуальной машине. А насколько этот подход окажется эффективным в каждом конкретном случае, решать уже тебе.

Суть идеи

Встроенные виндовые средства — Windows Firewall и Internet Connection Sharing (Общий доступ к интернету) достаточно неудобны, малофункциональны и не обеспечивают должного уровня защиты. Поэтому, чтобы раздать интернет на несколько компов, с возможностью полноценного контроля всего процесса, требуется либо хардварный роутер, либо одно из софтовых решений, вроде UserGate Proxy & Firewall, NetworkShield Firewall или Kerio WinRoute Firewall. Роутер понятен в настройках, даже самые простые железки имеют минимальные функции фильтра пакетов, маршрутизации, защиты от атак и так далее. Но часто его возможности не дают развернуться на полную, и руки связаны тем, что заложено в него производителем. Более функциональные решения стоят соответст венно, но и их возможностей может не хватать (например, шейпинга, учета трафика, мониторинга загрузки канала). Аналогичная ситуация и с софтовыми решениями. За хороший файрвол со всеми наворотами придется заплатить. Не стоит забывать о том, что защита работает, пока пользователь остается в домашней локальной сети, но стоит подключиться к инету через одну из многочисленных точек доступа за пределами дома, как мы оставляем компьютер с Windows Firewall, то есть практически беззащитным.

Мощности современных настольных систем вполне достаточно, чтобы установить виртуальную машину, которую и использовать в качестве файра для защиты локальной системы или шлюза для подключения других компьютеров домашней сети. Кроме того, на нем можно развернуть прокси, кэширующий DNS и прочие необходимые сервисы (например, IDS, VPN или IP-PBX). Естественно, в целях экономии ресурсов в виртуальной машине не стоит запускать десктопную ОС, вполне можно обойтись серверным дистрибутивом Linux в минимальной инсталляции, или взять одну из BSD систем. Например, OpenBSD в дефолтовой установке прекрасно работает, если ей выделить всего 32-64 Мб ОЗУ и 300 Мб места на харде, что, согласись, совсем немного, особенно учитывая возможности этой операционки.

В дальнейшем мы рассмотрим настройки PF в OpenBSD и iptables в Linux. В качестве виртуальной машины будем использовать бесплатный VirtualBox (virtualbox.org), который достаточно прост в настройках и не жаден до оперативки. Хотя при желании его можно заменить QEMU, Virtual PC или другим решением. Еще вариант: создать образ в VMware Server (ключ выдается бесплатно), который затем задействовать в VMware Player.
Виндовые разборки

Чтобы исключить выход хостовой ОС в интернет, в настройках реального сетевого адаптера снимаем все флажки, за исключением VirtualBox Bridged Networking Driver. В том числе нужно убрать поддержку «Протокол Интернета (TCP/IP)» и «Клиент для сетей Microsoft». В настройках виртуального сетевого интерфейса, появившегося после установки VirtualBox, в качестве шлюза по умолчанию и DNS-сервера указываем IP-адрес «внутреннего» (LAN) интерфейса гостевой ОС, запущенной в виртуальной машине (vic1 в случае OpenBSD или eth1 в Linux). Здесь также выключаем «Клиент для сетей Microsoft». При создании виртуальной машины указываем два сетевых адаптера. В одном указываем тип подключения «Сетевой мост» и выбираем в списке «Имя» реальный сетевой адаптер (например, Wi-Fi), подключенный к интернет. Тип второго указываем как «Виртуальный адаптер хоста», через него и будем подключаться к глобальной сети.
Считаем, что гостевая система уже установлена, и переходим непосредственно к настройкам.
Настройки Packet Filter

Первым делом нужно включить форвардинг пакетов между двумя сетевыми интерфейсами:

Чтобы изменение вступало в силу после каждой перезагрузки, снимаем комментарий с соответствующей строки файла /etc/sysctl.conf.
Далее создадим простейшее правило для выхода в интернет через NAT, пишем в pf.conf:

Здесь активирована трансляция адресов для сети, подключенной к интерфейсу vic1, с которого разрешен весь трафик. Все порты прикрыты. Проверяем файл на наличие ошибок и применяем правила:

В выводе консоли получим все активные правила PF, причем вместо названий интерфейсов будут указаны IP-адреса. Чтобы проверить состояние NAT, набираем:

Теперь входим в интернет с локальной системы и сканируем внешний IP (выданный провайдером) при помощи сканера вроде nmap на наличие открытых портов. Далее развиваем созданные правила, разрешив, например, выход в интернет только по определенным портам:

Вместо названий сервисов из /etc/services в правиле можно указать номера портов, здесь кому как удобнее. Просмотреть статистику при помощи pfctl достаточно просто:

Для более наглядного мониторинга можно использовать утилиты вроде ntop или pftop. Для этого через переменную окружения PKG_PATH указываем FTP-зеркало (wwwopenbsd.org/ftp.html), с которого будем ставить прекомпилированные пакеты:

И выполняем установку:

Дополняем схему

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

Открываем конфигурационный файл /etc/squid/ squid.conf и разрешаем подключения:

Создаем каталог для кэша и запускаем кэширующий проксик:

Теперь можно проверить, слушается ли нужный порт:

Перестраиваем браузеры на подключение через порт 3128 интерфейса vnec1 и пробуем обратиться к внешнему веб-сайту. Как вариант, можно настроить прозрачное проксирование, чтобы пользователи, пытающиеся подключиться к 80 и 8080 портам внешних web-серверов, автоматически перенаправлялись на локальный порт, на котором работает Squid:

Когда все настроено, обеспечиваем автозагрузку Squid при старте системы:

При желании Squid можно дополнить другими модулями. В портах есть squidGuard (wwwsquidguard.org) и HAVP (HTTP Anti Virus Proxy, wwwserver-side.de). Первый поможет в борьбе с баннерами, блокировкой файлов и определенных ресурсов, второй умеет проверять трафик несколькими антивирусами.

Настройка squidGuard и HAVP подробно описана в статье «Вооруженный бронекальмар», опубликованной в июньском номере ][ за 2008 год, поэтому здесь не останавливаемся.

Кстати, подобная схема с виртуальным файрволом может быть интересна тем, кто хочет максимально обезопасить свое пребывание в интернет. Не секрет, что браузер на сайте оставляет своеобразный отпечаток, который может поведать многое о твоей системе. Применение прокси-сервера позволяет скрыть большую часть информации путем модификации заголовков. Для тех, кто не хочет возиться со Squid, могу порекомендовать Privoxy (Privacy Enhancing Proxy, privoxy.org) — некэширующий прокси с возможностями фильтрации контента для повышения приватности и безопасности веб-серфинга.

Установка Privoxy сводится к выполнению команды:

Теперь настраиваем браузер, чтобы он выходил в интернет через порт 8118, и набираем в адресной строке http://config.privoxy.org/ (краткая форма: --). В результате получаем возможность редактирования параметров прокси-сервера. Дефолтные правила обеспечивают блокировку Cookies, pop-up, некоторых типов баннеров. По умолчанию Privoxy слушает только локальный интерфейс, для доступа к нему с хостовой машины или из LAN следует изменить инструкцию listen-address в config.txt, указав IP сетевого интерфейса vic1:

Возможностей, как и настроек, в Privoxy очень много, подробно он рассматривался в статье «Маленькое окно в большую сеть», опубликованной в ][ 03.2007. При необходимости можно заставить его работать в тандеме с кальмаром, для чего в squid.conf достаточно добавить всего одну строку:

В качестве еще одного бонуса к нашему интеллектуальному файрволу можно порекомендовать легкий кэширующий DNS (а также TFTP и DHCP) сервер Dnsmasq (thekelleys.org.uk/dnsmasq). Ставится он просто:

После этого в конфигурационном файле dnsmasq.conf указываем сетевой интерфейс, на котором он будет принимать запросы:

Теперь все повторные DNS-запросы будут выдаваться из кэша и выполняться быстрее.
Настройка IPSEC в OPENBSD

Теперь научим виртуальный файр подключаться по VPN. Разберем соединение по протоколу IPsec при помощи утилиты ipsecctl, входящей в стандартную поставку. Итак, наша внутренняя сеть 192.168.1.0/24, внешний WAN интерфейс получает IP-адрес 1.2.3.4, соответственно в удаленном офисе LAN - 192.168.2.0/24 и WAN — 5.6.7.8. Открываем в редакторе конфиг /etc/ipsec.conf и указываем настройки сетей:

На удаленном хосте файл /etc/ipsec.conf будет аналогичным, только заменяем IP и в описании подключения добавляем ключ passive, означающий, что данный узел будет ожидать подключение (соединение инициализирует удаленная система):

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

Теперь с VPN-сервера копируем публичный ключ и сохраняем его в /etc/isakmpd/pubkeys/ipv4/5.6.7.8, а свой ключ /etc/isakmpd/ private/local.pub передаем на 5.6.7.8. Набираем на обоих хостах:

Если все проходит нормально, обеспечиваем автозапуск при загрузке системы (если в этом есть необходимость). Для чего добавляем в /etc/rc.conf.local одну строку:

C OpenBSD, надеюсь, все понятно. Перейдем к Linux, многие вопросы, за исключением настройки правил пакетного фильтра и установки программ, будут аналогичны.
Организация NAT в LINUX

В Linux пакетный фильтр Netfilter управляется при помощи консольной утилиты iptables. Настройки отличаются по написанию, но, по сути, остаются теми же. Для начала разрешаем форвардинг пакетов:

Или как вариант:

Чтобы форвардинг активировался при загрузке системы, используем /etc/sysctl.conf:

Обрати внимание, переменная механизма sysctl несколько отличается от аналогичного параметра в OpenBSD. В различных дистрибутивах могут быть свои особенности. Так в CentOS/Fedora достаточно ввести одну команду:

Проверяем:

В качестве альтернативы в этих дистрибутивах можно использовать chkconfig. Смотрим статус запуска iptables:

И активируем при необходимости:

Пусть внутренний сетевой интерфейс (к которому подключается локальная система) будет eth1, а внешний — eth0. Чтобы включить NAT в Linux и разрешить все соединения, достаточно прописать три правила:

Для большей защиты можно разрешить доступ только к определенным сервисам:

Чтобы NAT работал и после перезагрузки, в Ubuntu сохраняем все настройки iptables в файл при помощи утилиты iptables-save:

И заносим эту строку в один из скриптов, выполняющихся при остановке системы (например, скрипты из каталога /etc/network/if-postdown. d). Чтобы правила при загрузке загружались автоматически, добавляем в конец файла / etc/networks/interfaces следующую запись:

### Загружаем правила при поднятии интерфейса

В CentOS правила сохраняются командой:

После этого все рулесеты можно найти в /etc/ sysconfig/iptables. Для автоматической их загрузки при старте системы достаточно разрешить два параметра в файле /etc/sysconfig/ iptables-config:

Просмотреть список правил iptables можно командой:

Все, с файром разобрались. Теперь можно наращивать функционал. Squid есть в репозитариях пакетов и ставится очень просто. В Debian/ Ubuntu:

Или в CentOS:

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

При желании Squid можно дополнить другими модулями — Adzapper (adzapper.sf.net), squidGuard и HAVP.
Заключение

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

Список полезных параметров PFCTL
pfctl -f /etc/pf.conf — загрузить файл pf.conf
pfctl -nf /etc/pf.conf — проверить синтаксис конфига
pfctl -Nf /etc/pf.conf — загрузить только правила NAT
pfctl -Rf /etc/pf.conf — загрузить только правила фильтрации
pfctl -sn — показать активные правила NAT
pfctl -sr — показать активные правила фильтрации
pfctl -ss — вывести таблицу состояний
pfctl -si — показать счетчики и статистику фильтрации
pfctl -sa — показать все

Links
Сайт VirtualBox — wwwvirtualbox.org
Список FTP зеркал OpenBSD — wwwopenbsd.org/ftp.html
Сайт Dnsmasq — thekelleys.org.uk/dnsmasq