Linux компьютер как роутер

Компьютер с 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 Гбайт;
  • три сетевые карты (это более оптимальное по производительности решение, чем одна на все три сети).
Читайте также:  Как открыть скрытый диск windows

Настройка маршрутизации

Для того чтобы настроить локальные сети на сервере, необходимо каждой из сетевых карт прописать соответствующие настройки, для чего в 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, необходимо в командной строке прописать:

Читайте также:  How to run windows applications on linux

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-системах) необходимо также добавить следующее правило:

Читайте также:  Создать восстановительную флешку windows 10 для другого компьютера

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/ ’`

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/ ’`

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/ ’`

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-адрес.

Источник

Оцените статью