Сисадминство

Законы превращения трафика в маршрутизаторах

Всем привет!
Анализируя комментарии к разным обзорам, я пришел к выводу, что не все читатели понимают принципы преобразования трафика, по которым работают все маршрутизаторы, будь то программные или аппаратные. Чтобы восполнить этот пробел я решил выделить описание этих вещей в этот отдельный обзор. Новичкам будет полезно почитать.

Сегодня мы разберем следующие понятия: маршрутизация (routing), трансляция адресов (NAT), проброс портов (port forwarding).

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

Начнем с маршрутизации (роутинга). Чтобы было проще понять текст, я нарисовал схему:

Такая схема не часто используется на практике, но для объяснения лучше не придумаешь. Предположим, у нас есть две локальных сети, которые выходят в интернет каждая через свой роутер. И есть еще один роутер, который служит для соединения двух сетей напрямую. Первый вопрос, который обычно задают новички — если мы соединяем сети напрямую, то зачем нам вообще нужен роутер №3 (см рисунок).
Ответ: в двух сетях разное адресное пространство, поэтому компьютеры не увидят друг друга, если сети соединить напрямую. Нужно что-то, что будет объяснять компам сети №1, какие адреса у компов в сети №2 и наоборот. Роль этого «объяснялки» как раз выполняет роутер №3.
Как это работает на практике:
Возьмем компьютеры из сети №1 и посмотрим их сетевые настройки. У них шлюз по умолчанию стоит роутер №1. Но как же тогда трафик будет уходить в сеть №2? Для этого на всех компьютерах сети №1 нужно прописать частный маршрут. В Windows это будет выглядеть вот так:
route add 192.168.2.0 mask 255.255.255.0 192.168.1.100
Здесь говорится следующее: маршрут добавить сеть 192.168.2.0 с маской 255.255.255.0 через шлюз 192.168.1.100
Для второй сети команда будет иметь вид:
route add 192.168.1.0 mask 255.255.255.0 192.168.2.100
Этот частный маршрут (еще его называют правилом маршрутизации) будет храниться в так называемой таблице маршрутизации компьютера. Когда комп собирается отправить данные в сеть, он смотрит эту таблицу и определяет куда нужно слать данные. При этом таблица маршрутизации перебирается в поисках наиболее подходящего маршрута. Сначала ищутся частные маршруты, если их нет или они не подходят, то тогда данные отправляются на шлюз по умолчанию. Однако, таблица маршрутизации будет удалена после перезагрузки компа. Если вы хотите оставить её на совсем, то между командами route и add надо вставить параметр -p, получится вот так: route -p add. Чтобы удалить ненужный маршрут вместо add пишем delete.
Тут есть один важный ньанс. Если мы пропишем частный маршрут только на компах сети №1 и попытаемся связаться с компьютерами из сети №2, то у нас ничего не получится, потому что компы второй сети не знаю куда отправлять ответ. Они будут слать его на шлюз по умолчанию, т.е. в интернет, потому что в их таблице маршрутизации отсутствует запись о сети №1. Таким образом, чтобы передача информации осуществлялась, нам нужно создать частное правило маршрутизации в сторону сети №1. Так же надо отметить, что на роутере №3 скорей всего есть фаервол, на котором надо разрешить прохождение трафика.
Однако, чаще всего используется другая схема сети, которая представлена на рисунке ниже:

Как видите, здесь две локальных сети, они объединены одним роутером, через который осуществляется доступ в интернет. В этом случае трафик между локальными сетями будет ходить без дополнительных частных правил маршрутизации, потому что шлюз по умолчанию является еще и шлюзом в соседнюю сеть. Если у вас подобная схема, но трафик между локальными сетями не передается, то вам нужно смотреть настройки фаервола на роутере — нужно добавить разрешающее правило. Кстати, очень часто новички думают, что трафик не передается потому, что надо настроить маршрутизацию и начинают ковырять настройки роутера совсем не в том направлении. Так вот, это не так. Все что может мешать прохождению трафика при такой схеме соединения — это фаервол.

Трансляция адресов (NAT)

Изначально нужно было решить всего одну проблему. Большинство локальных сетей работают в одинаковых адресных пространствах, я имею ввиду адреса вида 192.168.1.x и т.п. Вы можете в своей локальной сети назначать адреса какие вам заблагорассудится и никто вам слова не скажет. Все эти адреса называют «серыми», их много и из-за этого маршрутизировать их через интернет невозможно. Интернет имеет свое адресное пространство, где каждому узлу выделен отдельный IP-адрес. В интернете нет повторяющихся адресов, благодаря этому маршрутизация работает, сами адреса специально регистрируются провайдерами и они стоят денег. По совокупности всех этих факторов интернет-адреса называют «белыми». Так вот, чтобы решить проблему прохождения трафика из «серых» сетей с любыми адресами в интернет придумали механизм трансляции адресов. Суть его в том, что с помощью NAT можно целую сеть «спрятать» за узлом с «белым» адресом, где в качестве узла выступает ваш роутер.
Рассмотрим по этапам прохождение трафика. Например, я набираю в броузере адрес какого-нибудь сайта. Компьютер этот запрос отправляет на шлюз по умолчанию в локальной сети, т.е. на роутер. Получив запрос, роутер записывает у себя это как событие, где ваш комп обозначается инициатором соединения. Затем, ваш пакет с запросом выбрасывается и в это же самое время роутер формирует аналогичный запрос, только не от имени вашего компа, а от своего имени и затем со своего «белого» адреса отправляет запрос в интернет. Так запрос доходит до получателя, там обрабатывает и отправляется ответ. Ответ приходит на «белый» адрес роутера. Роутер смотрит все свои записанные события и пересылает полученный из интернета ответ на нужный комп локальной сети. Круг замкнулся. Сначала может показаться, что это такой не быстрый процесс, но на самом деле все это происходит очень быстро и часто.

Основной особенностью NAT является тот факт, что доступ возможен только в одну сторону — из локальной сети во вне, а обратно в локальную сеть проходит только тот трафик, который ждут, согласно записям в роутере. Если мы из интернета попробуем инициировать соединение с компьютером любой локальной сети, «спрятанной» за роутером, то у нас ничего не получится. Наш пакет дойдет до «белого» адреса роутера, но роутер не сможет переслать этот пакет в локальную сеть, т.к. у него нет события соответствующее этому пакету.

Проброс портов (port forwarding)

Как мы с вами поняли, трансляция адресов решила одну важную проблему, но вместе с этим породила одну дополнительную. Например, внутри моей локальной сети есть FTP сервер, к которому я хотел бы дать доступ из интернета, но сделать это не могу, потому что вся локальная сеть «спрятана» за NAT. Для таких случаев придумали механизм port forwarding. Специальным правилом на роутере мы говорим, что любое входящее соединение из интернета по протоколу FTP нужно пересылать на FTP-сервер в локальную сеть. Довольно простой механизм, а ньанс заключается только в том, что эта штука на роутере всегда настраивается вручную, т.е. создается само правило проброса плюс разрешающие правила на фаерволе.
На этом пока всё, если я что-то забыл рассмотреть, пишите в комменты, добавим!

Exit mobile version