Компьютер с Linux как альтернатива маршрутизаторам
Восстановление работоспособности
Прогресс не стоит на месте, и компьютеры, казавшиеся в прошлом или позапрошлом году одними из самых мощных, по своей производительности уже не дотягивают до компьютеров сегмента low-end нынешнего поколения.
Ротация компьютерного «железа» с каждым годом все возрастает, в связи с этим становится актуальной проблема, как поступить с компьютером пятилетней давности, который выбросить жалко, а что с ним делать — непонятно. В то же время системы связи не отстают от компьютерной техники, и на рынке появляется все больше сетевых устройств, которые раньше были ориентированы на установку в организациях, а теперь предназначаются для домашних пользователей, которых с каждым годом становится все больше. При этом стоимость таких устройств не снижается, поскольку в них внедряются новые, более производительные технологии. Кроме того, в больших городах нередки ситуации, когда на один дом приходится несколько локальных сетей и пользователи переходят с одной на другую (в зависимости от привлекательности тарифов), но при этом не желают расставаться с локальными ресурсами уже подключенной сети.
Для решения этих проблем при условии, что компьютер дома выключается редко (что у активных пользователей Интернета бывает в 80% случаев), можно из старого «железа» создать простой маршрутизатор на основе Linux, который позволит пользоваться несколькими сетями сразу и одновременно повысит уровень компьютерной грамотности пользователя. Сетевые устройства для конечных пользователей в основном рассчитаны на одного провайдера Интернета (имеется один WAN-порт для подключения к сети провайдера), а что делать, если их несколько? Эту проблему тоже решает компьютер-маршрутизатор!
В данной статье мы рассмотрим компьютер с установленной операционной системой семейства Linux, который будет выполнять функцию маршрутизатора и межсетевого экрана между несколькими сетями. Операционная система на базе Linux выбрана исходя из того, что системы этого семейства поддерживают основную часть нового и старого аппаратного обеспечения и в большей степени ориентированы на конечного пользователя, чем, например, операционные системы семейства BSD (OpenBSD, FreeBSD). Поскольку читатели уже должны иметь представление о системах семейства Linux, мы опустим подробное описание установки и отладки этой системы, а рассмотрим превращение ее в маршрутизатор. При этом будет применяться статическая маршрутизация, при которой все IP-адреса и другие параметры сети с течением времени остаются неизменными.
Основным пакетом, одновременно являющимся межсетевым экраном и позволяющим перенаправлять сетевой трафик и обрабатывать пакеты, служит iptables, входящий в большинство дистрибутивов Linux с ядром 2.4.х и выше. Другое название этого пакета — netfilter; сайт его разработчика находится по адресу www.netfilter.org. В более ранних версиях операционных систем Linux этот пакет назывался ipchains или ipfwadm. Для операционных систем семейства BSD альтернативой ему является программа ipfw.
Рассмотрим следующий пример конфигурации сети на предполагаемом компьютере-маршрутизаторе:
- сеть с диапазоном IP-адресов 192.168.192.0-192.168.192.255 (сокращенная запись — 192.168.192.0/24 или 192.168.192.0/255.255.255.0) является локальной сетью в квартире. Туда входит несколько компьютеров, их адреса назначаются вручную. Компьютер, который служит маршрутизатором (в дальнейшем — просто сервер), имеет в этой сети IP-адрес 192.168.192.1;
- сеть с диапазоном IP-адресов 10.0.0.0-10.255.255.255 (10.0.0.0/8 или 10.0.0.0/255.0.0.0) является локальной сетью одного из домовых провайдеров. Сервер имеет в этой сети IP-адрес 10.156.10.100, а шлюзом, выводящим сервер в локальную сеть, служит компьютер с IP-адресом 10.156.0.17. DNS-серверы доступны всегда и имеют IP-адреса 10.0.0.1 и 10.0.0.2;
- сеть с диапазоном IP-адресов 192.168.0.0-192.168.255.255 (192.168.0.0/16 или 192.168.0.0/255.255.0.0) является локальной сетью другого провайдера. Сервер в этой сети имеет IP-адрес 192.168.11.188, шлюзом является компьютер с IP-адресом 192.168.11.1. DNS-сервер этой сети — 192.168.1.1.
Каждый из провайдеров выдает «серый» IP-адрес для клиентов в Интернете, то есть пользователи находятся за NAT.
Задача заключается в том, чтобы компьютеры домашней сети (первая сеть в списке) имели круглосуточный доступ в Интернет, а также в локальные сети обоих провайдеров. Допускается, что некоторые пользователи локальных сетей провайдеров будут иметь доступ к другой сети через компьютер-сервер. Желательна полная защита компьютера-сервера от вторжений из внешних сетей. Минимальная конфигурация сервера в этом случае должна быть такой:
- процессор не менее Pentium II с частотой 400 МГц;
- оперативная память не менее 128 Мбайт (оптимально 256 или 512 Мбайт);
- жесткий диск 10 Гбайт;
- три сетевые карты (это более оптимальное по производительности решение, чем одна на все три сети).
Настройка маршрутизации
Для того чтобы настроить локальные сети на сервере, необходимо каждой из сетевых карт прописать соответствующие настройки, для чего в Linux предусмотрена команда управления сетевыми интерфейсами ifconfig. По умолчанию каждому сетевому интерфейсу, работающему в сети Ethernet, назначается одно из виртуальных наименований вида ethX, где X — порядковый номер интерфейса в системе. Подкорректировать конфигурацию каждого из сетевых интерфейсов можно, выполнив следующие команды:
Ifconfig eth0 192.168.192.1 255.255.255.0
Ifconfig eth1 10.156.10.100 255.0.0.0
Ifconfig eth2 192.168.11.188 255.255.0.0
Проверить работоспособность интерфейсов можно посредством команды ping, обращенной к шлюзам локальных сетей:
ping 10.156.0.17
ping 192.168.11.1
Если пакеты успешно доходят и возвращаются от адресата, значит IP-адреса и первоначальная таблица маршрутизации настроены правильно. В случае ошибки необходимо проверить правильность подключения сетевых кабелей к сетевым картам — возможно, кабели необходимо поменять местами, поскольку не всегда сетевые интерфейсы расположены в той же последовательности, в которой сетевые карты размещены в разъемах PCI в компьютере.
Как и в среде Windows, в операционной системе Linux существует команда route, которая позволяет управлять и просматривать таблицу маршрутизации на компьютере, но, поскольку системы различны, синтаксис этих команд несколько различается. В системах семейства Linux для просмотра таблицы маршрутизации необходимо выполнить команду route -n, при этом ключ «-n» выводит только IP-адреса, без возможности провести соответствие с DNS-сервером. Пример вывода этой команды приведен на рисунке.
Вывод команды route -n
Для того чтобы четко задать маршруты к определенным адресам, необходимо воспользоваться следующей командой:
route add –host ip gw ipgw dev ethX,
где ip — IP-адрес компьютера, к которому прокладывается маршрут; ipgw — IP-адрес шлюза локальной сети, через которую прокладывается маршрут; X — номер сетевого интерфейса, соответствующий локальной сети провайдера, через которого прокладывается маршрут.
Поскольку в примере приведены IP-адреса DNS-серверов, необходимо четко указать к ним маршруты:
route add –host 192.168.1.1 gw 192.168.11.1 dev eth2
route add –host 10.0.0.1 gw 10.156.0.17 dev eth1
route add –host 10.0.0.2 gw 10.156.0.17 dev eth1
Затем следует прописать DNS-серверы на сервере, хотя это и необязательно, ведь он будет выполнять лишь роль маршрутизатора. Для этого в файле /etc/resolv.conf необходимо по порядку прописать DNS-провайдеров (в самом файле приведен пример записи DNS-серверов).
После ввода этих нехитрых команд можно перейти непосредственно к организации маршрутизации на компьютере-сервере. По умолчанию маршрутизация пакетов отключена. Для ее включения необходимо набрать в командной строке следующую команду:
echo «1» > /proc/sys/net/ipv4/ip_forward
Чтобы при следующей перезагрузке этот параметр сохранился, необходимо отредактировать файл /etc/sysctl.conf и поменять в нем ноль на единицу в этом же параметре (net.ipv4.ip_forward). Тогда при следующей перезагрузке системы маршрутизация пакетов будет включена автоматически.
Теперь рассмотрим сам межсетевой экран iptables. Он представляет собой последовательность цепочек, заключенных в таблицы, по которым в определенной последовательности проходит пакет данных. Для таблицы netfilter, правила которой можно получить по команде iptables -L, первоначально пакет входит в цепочку INPUT, затем переходит в цепочку FORWARD, а потом уходит через цепочку OUTPUT, если, конечно, правила в цепочке этому не препятствуют. Данное объяснение довольно примитивно, однако оно дает четкое представление о принципе работы iptables.
Для осуществления маршрутизации пакетов необходимо в таблицу nat (она отвечает за маршрутизацию пакетов) добавить правила, которые бы регулировали прохождение пакетов с того или иного интерфейса. Поскольку в задачу сервера входит работа по обеспечению доступа в Интернет и сети провайдеров, сети с IP-адресами из локальной сети 192.168.192.0/24, необходимо в командной строке прописать:
iptables -t nat –A POSTROUTING –s 192.168.192.0/255.255.255.0 –j MASQUERADE,
где -t — ключ, который указывает на используемую таблицу (в данном случае это таблица маршрутизации — nat); -A — ключ, который указывает на добавление правила к цепочке POSTROUTING. В таблице nat присутствуют три цепочки: PREROUTING, POSTROUTING и OUTPUT, по смыслу очень схожие с цепочками из основной таблицы netfilter; -s — ключ, определяющий исходящие адреса компьютеров, на которые будет действовать правило (в данном случае диапазон локальной сети); -j — ключ, указывающий на действие, которое будет происходить с пакетом, определенным ранее указанными параметрами. Действие MASQUERADE обозначает не что иное, как подмену исходящего адреса пакетов с IP-адресов локальной сети на IP-адрес сервера, то есть так называемый SNAT. Существует и отдельное правило SNAT, но в нем необходимо указывать точный IP-адрес сервера через дополнительный параметр --to-source, а поскольку точно не известно, на какой из интерфейсов пойдет запрос (для eth1 необходимо назначить параметру IP-адрес 10.156.10.100, а для eth2 192.168.11.188), правило MASQUERADE в данном случае подходит лучше всего. Отметим, что политика MASQUERADE часто «забывает» о завершении соединения, а это при большой активности может отражаться на производительности системы. Также стоит обратить внимание на регистр прописываемых команд: они должны точно соответствовать описанному ранее, в противном случае iptables выдаст ошибку, так как в системе Linux регистр является критичным параметром при вводе любых команд.
Дать одному из пользователей локальной сети доступ в другую сеть, что иногда необходимо, можно, прописав подобную команду, только для ключа -s надо указать IP-адрес этого пользователя и добавить ключ -d, чтобы пользователь имел доступ только к конкретной сети или адресу, например:
iptables –t nat –A POSTROUTING –s 192.168.11.33 –d 10.156.15.150 –j MASQUERADE
Также необходимо учитывать, что этот пользователь должен находиться с сервером в одной подсети; если это не так, пользователь не сможет прописать на своем компьютере в таблицу маршрутизации маршрут, проходящий через сервер. Чтобы добавить в таблицу маршрутизации дополнительный маршрут, необходимо выполнить следующие действия (команды описываются для клиентов систем Windows):
route add ip mask x.x.x.x gw –p,
где ip — IP-адрес или диапазон адресов, к которому прописывается маршрут; x.x.x.x — маска подсети для указанного IP; gw — IP-адрес сервера, через который будет проходить маршрут; -p — ключ, добавляющий маршрут к постоянному списку маршрутов.
Применительно к приведенному примеру, где локальному пользователю с IP-адресом 192.168.11.33 позволяется обращаться к ресурсу с IP-адресом 10.156.15.150 другой сети, команда выглядит следующим образом:
route add 10.156.15.150 mask 255.255.255.255 192.168.11.188 –p
После установки этих настроек пользователи локальной сети 192.168.192.0/24 получают доступ в локальные сети. Для проверки работоспособности каждому из клиентов этой сети необходимо прописать в качестве шлюза IP-адрес сервера — 192.168.192.1 и добавить DNS-серверы обоих провайдеров.
Поскольку каждый из провайдеров предоставляет услугу доступа в Интернет с «серым» IP-адресом, для работы с Интернетом необходимо указать на сервере шлюз одного из провайдеров, который будет использоваться системой по умолчанию, например 10.156.0.17. Для этого в командной строке нужно прописать следующую команду:
route add default gw 10.156.0.17 dev eth1
Защита маршрутизатора
Поскольку маршрутизатор не выполняет никаких функций, кроме перенаправления пакетов, можно заблокировать доступ к большинству служб, оставив только доступ к администрированию. Чтобы маршрутизация работала, при блокировке входящих соединений необходимо в таблицу netfilter и ее цепочку FORWARD прописать правило, которое разрешает доступ клиентов к локальной маршрутизации. Сделать это можно так:
iptables –A FORWARD –s 192.168.192.0/255.255.255.0 –j ACCEPT,
где -A FORWARD — указание на используемую цепочку; -s — указание на диапазон IP-адресов, к которым применяется правило; -j ACCEPT — правило разрешения доступа.
Для организации доступа к администрированию сервера по протоколу ssh (используется практически во всех Linux-системах) необходимо также добавить следующее правило:
iptables –A INPUT –s 192.168.192.0/255.255.255.0 –j ACCEPT
То есть клиенты локальной сети 192.168.192.0/24 могут соединяться с сервером по протоколу ssh. Теперь необходимо заблокировать доступ всем остальным адресам к серверу следующей командой:
iptables –P INPUT DROP,
где ключ -P указывает на применение политики DROP ко всей цепочке INPUT. Таким правилом блокируется доступ к серверу любых пакетов, не входящих в правило с политикой ACCEPT. Это одно из грубых решений, однако оно наиболее эффективно для борьбы с хакерами, которые часто обитают внутри локальных сетей (поскольку скорость соединения в локальной сети значительно выше, чем в Интернете, хакеры гораздо более настойчивы и атака типа DDoS может оказаться очень эффективной).
В качестве последнего штриха необходимо сохранить правила в файле /etc/sysconfig/iptables при помощи команды:
iptables-save > /etc/sysconfig/iptables
чтобы при следующей перезагрузке система автоматически подгрузила правила цепочек.
Если в дальнейшем планируется дополнительное изменение цепочек iptables, чтобы каждый раз не применять команду iptables-save, можно в файле /etc/sysconfig/iptables-config изменить значение IPTABLES_SAVE_ON_RESTART с «no» на «yes», поскольку в некоторых версиях Linux сохранение цепочек отключено по умолчанию.
Восстановление работоспособности
В локальных сетях нередко случаются неполадки, и сеть бывает недоступна в течение нескольких часов, а то и дней. Причиной этого может служить гроза, снегопад или злой умысел. В рассматриваемом случае имеются сети двух провайдеров, и задача заключается в том, чтобы обеспечить пользователей непрерывным доступом в Интернет. Для этого можно написать небольшой скрипт на языке bash, который будет исполняться демоном crond (этот демон служит аналогом планировщика задач) в определенное время.
Создадим файл в папке /root с названием checker и внесем в него следующие строки:
#!/bin/bash
date >> /tmp/chk.log
ethernet2=`route | awk ‘/default/ {print $2}’`
if [ $ethernet2 = 192.168.11.1 ]
then
route add –host ya.ru gw 10.156.0.17 dev eth1
ethernet3=`ping -c 7 ya.ru | awk ‘/received/ {print $4}’`
else
ethernet3=0
fi
if [ $ethernet3 > 3 ]
then
route del default
route add default gw 192.168.11.1 dev eth1
fi
ethernet=`ping -c 7 ya.ru | awk ‘/received/ {print $4}’`
if [ $ethernet > 3 ]
then
echo «First ISP working fine» >> /tmp/chk.log
else
echo «First ISP: connection lost» >> /tmp/chk.log
route del default
route add default gw 192.168.11.1 dev eth2
echo «Second ISP connected» >> /tmp/chk.log
fi
Этот небольшой скрипт, как только его исполняет crond, посылает семь пакетов к сайту ya.ru на предмет его доступности. Если получено более трех пакетов от запрашиваемого узла (то есть чуть меньше половины), скрипт добавляет в файл chk.log информацию о том, что канал в Интернет функционирует и прекращает свою работу. В противном случае скрипт удаляет шлюз, который установлен по умолчанию, заменяет его на шлюз вторичного провайдера и отчитывается об этом в log-файле. При следующем старте, если шлюзом по умолчанию является IP-адрес вторичного провайдера, скрипт проверяет возможность работы Интернета через первичного провайдера (также отправляя пакеты к ya.ru) и, если команда ping выполнена успешно, меняет шлюз на IP-адрес первичного провайдера.
Для того чтобы добавить выполнение этого скрипта в планировщик заданий crond, необходимо в файле /var/spool/cron/root добавить строку вида:
*/5 * * * * /home/root/checker,
где число 5 обозначает, через сколько минут запускать скрипт проверки работоспособности интернет-канала.
Затем необходимо перезапустить crond командой:
service crond reload
Теперь маршрутизатор полностью готов к работе. Если все сделано правильно, можно поставить этот сервер в темный уголок, обеспечить его источником бесперебойного питания и забыть о нем на продолжительное время. Отметим, что в данной статье описывается только статическая маршрутизация — для динамической маршрутизации, когда провайдер выдает IP-адреса через DHCP-сервер, настройки будут несколько иные, однако тут нужно понимать, что практически любой провайдер дает одну или несколько подсетей, которые не обслуживаются DHCP-сервером, поэтому можно смело присваивать себе постоянный внутренний IP-адрес.