Журнал LinuxFormat - перейти на главную

LXF151:Строим свой брандмауэр

Материал из Linuxformat
(перенаправлено с «LXF151:tut8»)
Перейти к: навигация, поиск
Систему можно защитить любым старым брандмауэром, но гораздо смешнее создать собственный на базе Linux. Джеймс Литтон покажет, как это сделать.
59955.png
(thumbnail)
jsvnstat — интерактивный и впечатляющий клиент на JavaScript для vnstat.

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

Те, кому нужен больший контроль, часто обращаются к дистрибутивам, подобным Smoothwall или pfSense, которые устанавливают ОС, а также устанавливают пакеты, требуемые для запуска брандмауэра. В этих системах также есть удобные web-интерфейсы для настройки и установки дополнительных модулей.

pfSense – прекрасный выбор для брандмауэра, так как он не только прост в установке, но и удобен в настройке. Однако здесь нам нужен брандмауэр на базе Linux, а не система на основе BSD. Мы могли бы выбрать спецдистрибутив; но создав собственный сервер, который даст нам полный контроль, мы гораздо больше узнаем и гораздо больше повеселимся. Основные требования, которым должен удовлетворять машрутизатор, таковы:

1) Фильтрация пакетов с запоминанием состояния и без.

2) NAT и маскирование для совместного доступа в Интернет.

3) NAT для прозрачного прокси.

4) Шейпинг сетевого трафика (в данной статье не рассматривается).

Содержание

Развернем ОС

Прежде чем устанавливать пакеты, обзаведемся сервером и операционной системой. В качестве сервера нужно нечто с малой площадью нижней поверхности корпуса, например, в корпусе Shuttle. Из компонентов нам понадобятся материнская плата со встроенным адаптером Ethernet; в один из ее PCI-слотов также нужно вставить вторую сетевую карту. В качестве ОС выберем Ubuntu 10.04 LTS.

В установке Ubuntu Server особых сложностей нет, однако несколько моментов стоит отметить:

  • Автоматическая установка обновлений может быть полезной, но нравится не всем. Мы предполагаем, что вы скорее предпочтете сами управлять всеми установками на своем сервере, поэтому давайте отключим автоматические обновления.
  • Процесс установки Ubuntu дает массу возможностей установить всякие полезные сервисы. Но нам понадобится один – сервер OpenSSH, позволяющий получить доступ к серверу, хотя компьютер будет работать автономно.
  • В процессе установки должен настроиться DHCP для eth0, и это то, что нам нужно, так как большинство провайдеров не предоставляют пользователям статические адреса. Настройки второго интерфейса нужно добавить в файл /etc/network/interfaces:

auto eth1

iface eth1 inet static

address 192.168.3.254

netmask 255.255.255.0

broadcast 192.168.3.255

network 192.168.3.0

DNS – пожалуй, самый востребованный сервис в Интернете. Без предварительного преобразования понятного для человека имени, такого как www.linuxformat.com, в понятный маршрутизатору IP-адрес (80.244.178.150), используемый компьютерами для связи друг с другом, невозможно почти ничего.

Вместо передачи запросов всех своих внутренних клиентов на DNS-серверы провайдера, мы можем несколько повысить производительность, настроив собственный DNS-сервер с кэшированием на своем маршрутизаторе. На практике все клиенты будут обращаться с запросами DNS к нашему маршрутизатору. Когда клиенту понадобится разрешить имя, наш сервер будет искать его в своем кэше. Найдя его, он сразу вернет его на компьютер пользователя; в противном случае маршрутизатор перенаправит запрос провайдеру, а результат будет сохранен в кэше нашего сервера до следующего раза, когда потребуется. Воспользуемся легковесным dnsmasq. Для его установки выполните команду

sudo apt-get install dnsmasq

Когда запрос придет на наш DNS-сервер, dnsmasq перенаправит запросы на неизвестные имена на сервер имен, указанный в /etc/resolv.conf. Этот сервер имен предоставляется провайдером в процессе настройки DHCP.

Динамическая настройка клиента

Если вы не планируете настраивать все свои клиентские устройства вручную, вам понадобится DHCP-сервер. Прелесть dnsmasq для нашего кэширующего DNS-сервера в том, что он также выступает как DHCP-сервер. Для настройки DHCP добавьте следующие строки в файл /etc/dnsmasq.conf:

interface=eth1

domain=yourdomain.com

dhcp-range=192.168.3.80,192.168.3.90,12h

dhcp-authoritative

С этой конфигурацией dnsmasq будет отвечать на все DHCP-запросы в локальной сети и предоставлять адрес от 192.168.3.80 до 192.168.3.90, домен нашей сети, а также адрес маршрутизатора в качестве адресов DNS-сервиса и шлюза.

При создании правил брандмауэра вы, скорее всего, захотите различать устройства, чтобы предоставить различные классы обслуживания. Для этой цели мы резервируем IP-адреса командой dnsmasq, добавив следующие строки в /etc/dnsmasq.conf:

no-hosts

dhcp-host=xx:xx:xx:xx:xx:xx,tablet,192.168.3.80

dhcp-host=xx:xx:xx:xx:xx:xx,netbook,192.168.3.81

dhcp-host=xx:xx:xx:xx:xx:xx,laptop,192.168.3.82

Есть и другие способы обработки запросов имен для этих клиентов, но так как сеть у нас маленькая, давайте также добавим их в /etc/hosts:

192.168.3.80 tablet

192.168.3.81 netbook

192.168.3.82 laptop

Если вы хотите, чтобы сам сервер использовал локальный экземпляр dnsmasq для разрешения имен DNS, измените настройки DHCP-клиента сервера, открыв файл /etc/dhcp3/clinet.conf и раскомментировав строку

prepend domain-name-servers 127.0.0.1;

Хотя это выходит за рамки данной статьи, вам может понадобиться создать правила брандмауэра, использующие время как параметр. Они могут использоваться, например, для задания времени дня, когда вашему ребенку позволено выходить в Интернет. Чтобы это эффективно работало, позаботимся, чтобы часы на сервере работали с максимальной точностью. Лучший способ это сделать – установить NTP командой:

sudo apt-get install ntp

Параметры по умолчанию нам подходят, и дальнейшая настройка не требуется.


Перед тем, как наш сервер будет пересылать пакеты между своими интерфейсами, нужно включить перенаправление пакетов. Для этого откройте файл /etc/sysctl.conf и раскомментируйте строку

net.ipv4.ip_forward=1

Она велит нашему серверу перенаправлять пакеты IPv4, позволяющие нашим клиентским устройствам взаимодействовать с устройствами в Интернете. Если вы захотите побаловаться с IPv6, проделайте дополнительные изменения, которые можно найти простым поиском в Google.

Теперь пора перейти к настройке правил брандмауэра. Перед этим перезапустим сервер командой

sudo shutdown -r now

и убедимся, что при загрузке системы не появляется сообщений об ошибках.

Правила, правила, правила

Брандмауэры основаны на правилах, и их эффективность зависит только от набора правил! В Linux мы пользуемся Iptables, чтобы передать наши правила модулям netfilter, являющимся частью ядра Linux. На основе правил ядро принимает решение о том, как обрабатывать каждый пакет, проходящий через наш сервер.

В этой статье мы не сможем раскрыть все подробности работы Iptables, но важно по меньшей мере понимать, что по умолчанию в Iptables используются три встроенных цепочки, к которым можно «присоединять» правила:

  • INPUT CHAIN [входная цепочка] управляет пакетами, предназначенными для сервисов, которые выполняются на самом маршрутизаторе (например, web-сервер, SSH и т. д.).
  • OUTPUT CHAIN [выходная цепочка] управляет пакетами, формируемыми на самом сервере.
  • FORWARD CHAIN [цепочка перенаправления] управляет пакетами, проходящими через сервер.

Iptables гораздо сложнее, чем три этих цепочки, и мы советуем вам прочесть книгу «Брандмауэры Linux [Linux Firewalls]» Майкла Раша [Michael Rash], чтобы узнать больше; но их вполне достаточно, чтобы мы могли двигаться дальше.

Для целей данного урока начнем с создания очень «вольного» набора правил, чтобы в дальнейшем можно было убедиться, что все работает должным образом. Начните с создания скрипта iptables.sh и сделайте его исполняемым:

cd ~

touch iptables.sh

chmod +x iptables.sh

Затем откройте iptables.sh в своем любимом текстовом редакторе и добавьте туда следующие строки:

#!/bin/sh

IPTABLES=/sbin/iptables

MODPROBE=/sbin/modprobe

IPSET=/usr/sbin/ipset

INT_NET=192.168.3.0/24

### flush existing rules and set chain policy settings to

ACCEPT

$IPTABLES -F

$IPTABLES -F -t nat

$IPTABLES -X

$IPSET --destroy

$IPTABLES -P INPUT ACCEPT

$IPTABLES -P OUTPUT ACCEPT

$IPTABLES -P FORWARD ACCEPT

### load connection-tracking modules

$MODPROBE ip_conntrack

$MODPROBE iptable_nat

### Set up forwarding

$IPTABLES -P FORWARD ACCEPT

$IPTABLES --table nat -A POSTROUTING -o eth0 -s $INT_NET -j MASQUERADE

Теперь запустите скрипт. Если интерфейсы Ethernet настроены правильно и eth0 подключен к провайдеру, а eth1 – к коммутатору или тестовому компьютеру, система должна загрузиться, получить свои сетевые настройки по DHCP и выйти в Интернет.

С этого момента можно добавлять правила для дальнейшего ограничения доступа. Предположим, например, что мы хотим заблокировать все подключения к нашему серверу из Того и Тонги. Для этого применим пользовательскую утилиту ipset, чтобы построить таблицу адресов, с которой будет сравниваться каждый пакет. Но прежде чем воспользоваться ipset, нужно выполнить несколько команд для ее установки:

sudo apt-get install ipset ipset-source

sudo apt-get install module-assistant

sudo m-a a-i ipset


(thumbnail)
iftop — мощная утилита командной строки; она показывает, как ширина канала используется клиентом.

Теперь напишем простой скрипт для построения нашей таблицы:

#!/bin/sh

IPSET=/usr/sbin/ipset

IPSETSAVE1=/home/yourname/ipset-countries1.save

$IPSET -N countries nethash

for IP in $(wget -O - http://www.ipdeny.com/ipblocks/data/

countries/{tg,to}.zone)

do

$IPSET -A countries $IP

done

$IPSET --save countries >$IPSETSAVE1

Мы создали файл, содержащий все подсети, которые мы хотим заблокировать, и мы можем легко загрузить его с помощью нашего скрипта брандмауэра. Скрипт countries нужно запускать только для добавления новых стран или иного обновления нашей таблицы подсетей. Однако создаваемый им файл нужно загрузить скриптом нашего брандмауэра, поэтому внесем некоторые изменения в iptables.sh.

Для начала добавим пару переменных:

OUTSIDE=”eth0”

IPSETDB1=/home/yourname/ipset-countries1.save

А потом опишем сами правила:

$IPSET --restore <$IPSETDB1

$IPTABLES -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A INPUT -i $OUTSIDE -m set –match-set countries src -j DROP

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

Дайте волю воображению

Это лишь стартовая точка, и, как вы видите, применение Iptables для построения брандмауэра на базе Linux дает нам огромную гибкость. Дайте волю своему воображению, и вы сможете создать правила, соответствующие любым потребностям.

Когда правила будут готовы, потребуется настроить сервер, чтобы правила брандмауэра загружались во время загрузки системы. Для этого откройте файл /etc/rc.local и добавьте строку

/home/yourname/iptables.sh

прямо над строкой

exit

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

Другой возможный подход – установить сервис, требующий определенной аутентификации для доступа к внутренним ресурсам сети извне. Один из простейших примеров подобного сервиса – PPTP [Point-to-Point Tunneling Protocol – протокол типа точка-точка, устанавливающий защищенное соединение компьютера с сервером за счет создания туннеля в стандартной, незащищенной сети, – прим. пер.]. Об этом протоколе написана куча книг, и некоторые настаивают, что это небезопасный вариант. Однако он вполне годится для наших целей. Он не только прост в настройке, но и более чем безопасен для обычной домашней сети.

Для его установки скомандуйте

sudo apt-get install pptpd

А для его настройки откройте файл /etc/pptpd.conf, найдите записи localip и remoteip, раскомментируйте их и измените вот так:

localip 192.168.3.254

remoteip 192.168.3.234-238

Теперь откройте файл /etc/ppp/options, найдите запись для ms-dns, раскомментируйте и измените следующим образом:

ms-dns 192.168.3.254

Последнее, но не по значимости – настройка учетной записи пользователя. Напомним, что лучшая защита при использовании PPTP – длинный пароль пользователя, поэтому задайте подходящий пароль. Для настройки учетной записи откройте файл /etc/ppp/chap-secrets и добавьте в него строку

James159 pptpd ThisIsMyReallyReallyLongPassword *

Теперь получить доступ к домашней сети, находясь в дороге, не сложнее, чем настроить VPN-доступ на вашем любимом устройстве.

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

Многие пользуются OpenDNS для фильтрации доступа в Интернет для детей, и так как OpenDNS для применения настроек требуется ваш IP-адрес, возможно, вы захотите взглянуть на сервис DNS-O-Matic. DNS-O-Matic удобен и тем, что он также передает обновления вашего адреса DynDNS, и вам нужно обновить всего один сервис вместо двух.

Способов получения текущего IP-адреса множество, но на нашем LXFDVD вы найдете скрипт, который должен работать во всех случаях. Скопируйте его в свой домашний каталог под именем dns.sh и создайте задание Cron, которое будет запускать его каждый час. Если с предыдущего часа адрес не изменился, то DynDNS не обновляется. Если адрес изменился, то DynDNS будет снабжен новым адресом. Чтобы гарантировать то, что учетная запись не станет неактуальной, настройте принудительное обновление каждый день в 23:00, даже если адрес не изменился.

Борьба с пожирателями канала

Если ваш дом похож на наш, то жизнь в нем кипит. У нас дома шесть компьютеров, три смартфона, два планшета и несколько серверов. С таким количеством устройств и с тем, что люди приходят и уходят, интернет-соединение неизбежно будет замедляться, когда кто-то загружает большой файл или смотрит фильм через Интернет.


Чтобы засечь «пожирателя» канала, нужна утилита; прекрасным выбором является iftop. Установим ее командой

sudo apt-get install iftop

Iftop делает для сетевых ресурсов то же, что top – для ресурсов процессора. Она слушает сетевой трафик на интерфейсе и отображает информацию об использовании текущей полосы частот парами хостов. Просто наберите

sudo iftop --i eth1

и увидите, кто сожрал ценные ресурсы канала. Так как мы добавили имена хостов в файл, вместо IP-адресов вы должны увидеть удобный список имен хостов, с которым проще отправиться прямо к виновнику и пресечь безобразие.

В порядке излишества, интересно взглянуть, как потребление канала меняется во времени. Для этого прекрасно подходит утилита vnstat, которая сообщает статистику по заданному интерфейсу. Для ее установки и использования скомандуйте

sudo apt-get install vnstat

sudo vnstat -u -i eth0

sudo vnstat -u -i eth1

По завершении установки нужно дать vnstat некоторое время на сбор данных, чтобы сформировать отчет. Простейший отчет можно получить командой

vnstat

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

Один из моих любимых отчетов – данные за предыдущие 24 часа; для его получения нужно ввести команду

vnstat –h

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

Другой полезный отчет – определение 10 самых активных пользователей:

vnstat –t

С его помощью удобно назначить предел использования ширины канала.

Если вам нужен приятный графический клиент для данных vnstat, установите jsvnstat. Эта утилита использует JavaScript, и в ней легко переключать отчеты, не перезагружая всю страницу. График к тому же интерактивный, и для получения данных достаточно подвести курсор мыши к нужной точке. Для его установки введите команды:

apt-get install apache2 php5 unzip

cd /var/www

wget http://www.rakudave.ch/userfiles/javascript/jsvnstat/jsvnstat.zip

unzip jsvnstat.zip

Страница со статистикой будет доступна на http://192.168.3.254/jsvnstat/index.php.

В нашей простой статье мы лишь коснулись основ, но, как видите, Linux – прекрасная платформа для создания простого, мощного и удобного в управлении брандмауэра.

Потратьте немного времени на дальнейшее изучение Iptables и добавьте новые правила в свой набор, чтобы сделать его более надежным и конкретным. Мы также советуем изучить шейпинг трафика в Linux, чтобы вы смогли задавать приоритеты использования трафика и управлять своим интернет-соединением более эффективно.

Персональные инструменты
купить
подписаться
Яндекс.Метрика