Маршрутизация


Макаров Тихон

маршрутизация в компьютерных сетяхСначала небольшой разбор полетов: хочу извиниться перед моими читателями на whatis.ru за эту статью. Она частично состоит из статей, которые я писал раньше, так как была предназначена для лекции в одном заведении, а переделать ее времени нет, да и не хочется. Так что некоторые/многие вещи Вам покажутся знакомыми, если Вы читали мои предыдущие статьи.

Скучная теория

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

Маршрутизация делится на две части: поиск маршрута и пересылка пакета.

Т.к. пересылка пакета сама по себе проста, остановимся поподробнее на поиске маршрутов. В упрощенном виде можно сказать, что задача маршрутизации - в каждой точке своего пути определять только следующий узел, на котором уже найти следующий и т.д. Существует, правда, тип маршрутизации "от источника", который вычисляет сразу весь путь пакета перед его отправкой, но о нем бы мы говорили в 1999 году.

Рассмотрим протоколы маршрутизации:

А) Дистанционно-векторные прерывания. В их основе лежит такой принцип: компьютер из таблицы маршрутизации нашего компьютера находится на один узел ближе к нужному нам компьютеру, чем наш компьютер. Он посылает запрос каждому компьютеру, после чего выбирает маршрут наименьшей длины из полученных ответов (маршрут только до соседнего компьютера) и записывает его в таблицу.

Б) Топологические протоколы действуют немного по другому: они "просматривают" всю сеть и для каждого компьютера записывают другие компьютеры, к которым он подключен, составляя таблицу маршрутизации (очень похоже на граф). Если произойдет сбой, то этот протокол сможет быстрее изменить свою таблицу, нежели дистанционно-векторный, в котором может произойти бесконечный цикл пересылки данных.

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

Поговорим лучше о демоне gated, который позволяет использовать сразу несколько различных протоколов: запускается он вместе с ядром, а все свои конфигурационные записи берет из /etc/gated.conf, в котором настройки делятся на 4 части: опции, конфигурация протоколов, маршруты, импорт/экспорт.
* Я опишу только главную часть, опуская многие вещи. Для более подробной информации следует общаться к документации.

1) Опции имеют вид options argument, где аргументом может быть: nosend - запрет посылки пакетов, noresolv - запрет использования DNS, syslog [level] - уровень информации, заносящейся в журналы.

2) Сетевые интерфейсы определяются таким видом:

interfaces {
interface List /* задает параметры интерфейса такие как: */
preference Number /* приоритет, который указывает, какой маршрут выбрать, если
возникает конфликт (дело в том, что если на двух компьютерах используются
разные "метрики стоимости", подсчитывающие время перехода пакета (например
на одном все измеряется временем перехода пакета, а на другом - кол-вом
переходов)), выбирая в виде маршрута тот, приоритет которого меньший */
passive /* если указан этот параметр - через интерфейс не будут передаваться данные */
simplex /* запрещает получать компьютеру его же собственные широковещательные запросы
(нужен для избежания зацикливания) */
}
martians {
IP mask Number_of_mask allow/ничего exact/refines }
/* Указывает, условие для адреса IP сети с указанной маской - allow -
разрешить передачу пакета, а если allow не указано, то пакет запрещается,
exact/refines - указывает на способ проверки адреса */

3) Трассировка. Демон gated поддерживает такую удобную функцию, как ведение журналирования. Задается она следующей конструкцией (запускается командой gdc toggletrace):

Traceoptions LogFile [size Number [k/m] /* size указывает на max размер файла в
килобайтах/мегабайтах */
Files Number]] options
[except options]

4) Далее в нем указываются настройки для протоколов, которые он использует, но поскольку их достаточно много, а статья имеет вполне ограниченный размер, я опущу их описание, отослав читателей к документации протоколов RIP и OSDF (наиболее "разумные" на мой взгляд протоколы).

Практика и интересная теория

Итак, разберем пример небольшой сети:

1) Два компьютера соединены по проводу (167.15.89.0 (1))
2) От них обоих отходит по проводу к маршрутизатору (167.15.89.2)
3) От маршрутизатора отходит еще провод к 3-ему компьютеру (167.15.89.3)
4) От 3-его компьютера провод отходит к пограничному маршрутизатору (167.15.89.4)

Команда netstat -rn позволяет узнать таблицу маршрутизации на компьютере 1(2):

makarov@green# netstat -rn
Kernel IP routing table
Destiation Gateway Genmask : Interface
167.15.89.1 0.0.0.0 255.255.0.0 eth0 // эти две записи определяют
127.0.0.1 0.0.0.0 255.255.0.0 lo // интерфейсы того компьютера
/ причем eth0 указывает на Ethernet карту, а lo - это интерфейс обратной связи, которые
/ позволяют показать, что не надо направлять пакеты через маршрутизатор (в данном /случае)
/ или другим спец. образом (вообще) для компьютера 2 (он подключен напрямую).
0.0.0.0 167.15.89.2 0.0.0.0 eth0 // отправить пакет в
/ маршрутизатор через Ethernet-плату. Этот маршрут будет "стандартным"

Теперь если мы пошлем пакет с компьютера 1 на 2, то он отправится напрямую, а если на компьютер 3, то компьютер 1 пройдется по всем записям и не найдя его IP, отправит пакет по стандартному маршруту. То есть на 167.15.89.2. Я думаю, что рассматривать таблицы других компьютеров сети бесполезно, т.к. они очень схожи. Поговорим лучше о безопасности маршрутизации!

1) Вспомним маршрутизацию от источника. Помимо своих неудобств в скорости, она еще может и привести к компрометации компьютера! По умолчанию она хоть и не используется, но и не запрещена, поэтому если в /proc/sys/net/ipv4/conf/eth0/accept_source_route лежит значение - 1 (включена), то можно провести следующую "фичу": telnet @10.0.0.1@10.0.0.3@@10.0.0.4:ftp

Если администратор 10.0.0.4 доверяет владельцу компьютера 10.0.0.3 (и поставил, что с этого IP можно подключаться не вводя пароль, что делают очень часто), то злоумышленник может отправить вышеприведенной командой на 10.0.0.4 запрос на подключение по ftp. Пакет пройдет через 10.0.0.3 и 10.0.0.4 решит, что запрос подал именно 10.0.0.3! Все, у злоумышленника (10.0.0.1 полный доступ по ftp).

Запретить возможность такого взлома можно запретив маршрутизацию от источника (echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route), но лучше всего сразу во всех маршрутизаторах ее запретить (листинг ниже приведен для маршрутизаторов Cisco):

root@green# en
Password:
root@green# conf root@green
root@green# no ip source-route
root@green# ^Z
root@green# wr mem

2) Злоумышленник, находясь в локальной сети, может добавить/изменить существующий маршрут. Ведь компьютер ищет самый короткий путь по ответам ему поступившим, то злоумышленник может подменить ответ своего компьютера, чтобы маршрутизатор передал пакет через него. Тогда любой пакет сможет быть перехвачен злоумышленником. Я видел много советов типа: "Отключите свой демон, чтобы не попасть в такую ловушку" во многих известных книгах, но лично я с ними не совсем согласен. Мое решение см. для следующего пункта.

3) Снифферы - программы, собирающие с сети весь трафик, который через них проходит. Как они устроены? У каждого пакета существует свой MAC-адрес получателя. При получении пакета компьютером он проверяет, принадлежит ли данный пакет ему по данному адресу. И если принадлежит, то анализирует, а если нет - отправляет дальше. Всем этим занимается сетевой адаптер. Он может быть переведен в режим "полного анализа" (неразборчивый режим). В данном режиме он анализирует все данные, передающиеся через него. К сожалению (а для кого-то к счастью), многие службы передают информацию в незашифрованном виде. Это относится к таким известным и часто используемым вещам, как telnet, http и ftp.

Для решения этой проблемы разберем, чем отличаются коммутатор и концентратор. Они используются для подсоединения компьютера к сети. Но концентратор передает каждому компьютеру этот пакет, чтобы тот сам разобрался с ним, в то время как коммутатор сам справляется с этой проблемой. Но поскольку на маршрутизатор сниффер установить нельзя, пакеты остаются защищенными. {Попробуйте в локальной сети поставить на один компьютер сниффер, а на другой зайти в telnet и попытаться подсоединиться к удаленному компьютеру. На том компьютере, где был установлен сниффер, вы потом легко сможете увидеть свой пароль... }

4) Улучшенные снифферы. К ним относится программа Hunt. Чем она примечательна? Она перехватывает не пакеты, а сам сеанс. Дело в том, что адаптеры Ethernet отправляют широковещательные ARP-запросы (ARP - протокол преобразования MAC-адресов в IP-адреса и обратно), запрашивая, какой у тех MAC, чтобы потом передать данные. Когда он найдет нужный ему компьютер, то занесет запись о нем в свою таблицу ARP, чтобы при последующих запросах все происходило быстрее. Вот здесь-то hunt и изменяет на компьютерах эту таблицу!

Пусть есть 2 компьютера, передающие друг другу конфиденциальные данные. Тогда рассмотрим листинг работы этой программы на 3-ем компьютере:

-arps> a // a - make new record
----> comp1
host1 fake mac [88:88:88:88] >
----> comp2
host2 fake mac [77:77:77:77] >
arps> 1 // 1 - list of records
0) on 111.111.111.0 is 111.111.111.1 as 88:88:88:88 refresh 0s
1) on 111.111.111.1 is 111.111.111.0 as 77:77:77:77 refresh 0s
-arps> s // stat ARP daemon
daemon started

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

А вот решением этой проблемы может стать только переход на полностью защищенные криптографически протоколы. От telnet и ftp лучше, например, перейти к SSH.