[Перевод] Raspberry Pi в роли роутера с единственным сетевым интерфейсом
Сразу скажу, что эта статья предназначена для обычных пользователей и для тех, для кого сетевые технологии — это хобби.
Если вам нужен собственный домашний роутер — отличной аппаратной платформой для него может стать Raspberry Pi 4 Model B. Более старые модели Raspberry Pi отличаются значительными ограничениями в плане поддерживаемой ими скорости передачи данных по сети. Эти ограничения столь велики, что они не подойдут для создания интернет-роутеров в том случае, если скорость доступа к интернету превышает 100 Мбит/с.
Итак, одноплатный компьютер Raspberry Pi 4 Model B устроит нас по следующим причинам:
- Он относительно недорог.
- Он достаточно быстр.
- Он может хорошо нагрузить работой свой гигабитный сетевой интерфейс.
- Он энергоэффективен.
Главной его проблемой, похоже, является тот факт, что у него есть только один сетевой интерфейс. А если создают роутер, то таких интерфейсов нужно как минимум два:
- Первый интерфейс подключают к модему или роутеру, дающему доступ в интернет (идеально — в режиме моста).
- Второй интерфейс подключают к домашней сети (возможно — к коммутатору).
В результате, если роутер создают на базе Raspberry Pi, то, вероятнее всего, докупят к нему USB3-сетевую карту за примерно $20, после чего проект будет завершён.
Raspberry Pi в роли коммутатора с двумя сетевыми интерфейсами
А что если я скажу вам, что то же самое можно сделать, воспользовавшись единственным встроенным сетевым интерфейсом Raspberry Pi 4?
Как это возможно?
Знакомство с VLAN
Я, как видите, знакомлю читателей с технологией, которая существует с 1990-х годов. Она широко используется в корпоративной среде.
И, так как у меня есть такое ощущение, что эта технология не особенно широко известно в кругах людей, далёких от администрирования корпоративных сетей, я думаю, что тему VLAN вполне можно тут обсудить.
Что такое VLAN?
Технология VLAN (Virtual Local Area Network, виртуальная локальная компьютерная сеть) позволяет создавать различные, отделённые друг от друга сети, используя одну и ту же физическую линию связи и один и тот же коммутатор. Это помогает сильно сократить количество проводных соединений и количество физических коммутаторов, необходимых в том случае, если в одном и том же месте нужно развернуть несколько отделённых друг от друга сетей.
Если вы хотите пропустить трафик разных сетей по одному и тому же кабелю или через один и тот же коммутатор — как идентифицировать разные потоки трафика?
При использовании технологии VLAN сетевые «пакеты» помечают с использованием тегов. Так как эта технология работает на уровне Ethernet, правильнее будет говорить не о «пакетах», а об «Ethernet-кадрах». Но я полагаю, что детали терминологии не особенно важны для понимания сути рассматриваемой технологии.
Тут достаточно понимать, что имеются теги, находящиеся перед Ethernet-кадрами. Эти теги сообщают устройствам, поддерживающим VLAN, о том, к какой именно сети принадлежит кадр, и, в результате, пакет, передаваемый по сети.
При таком подходе потоки трафика разных сетей можно легко отличить друг от друга. А в вышеупомянутых тегах нет ничего особенно интересного. Они называются VLAN ID и представляют собой всего лишь числа в диапазоне от 1 до 4096. Отмечу, что большинство недорогих коммутаторов могут поддерживать, самое большее, что-то в районе 32–64 VLAN. Лишь более дорогое, корпоративное оборудование, может похвастаться одновременной поддержкой 4096 VLAN. Но в нашем случае это, вероятно, значения не имеет.
Управляемый коммутатор
Теперь, когда мы разобрались с тем, что такое VLAN, подумаем о том, как нам воспользоваться этой технологией.
Для начала нам понадобится управляемый сетевой коммутатор, который поддерживает VLAN.
Самый дешёвый коммутатор с поддержкой VLAN, который мне удалось найти — это TP-LINK TL-SG105E, который стоит что-то около $25. Это — 5-портовый коммутатор, но, например, его 8-портовая версия обычно лишь на несколько долларов дешевле этой.
Один из читателей отметил в комментариях к этому материалу, что этот коммутатор TP-LINK, возможно, не сможет обработать большое количество ARP-запросов, которые могут приходить на порт, подключённый к интернет-модему. В дискуссии на Hacker News этому роутеру тоже досталось немало негатива. Но я не знаю, будут ли коммутаторы Netgear, которые стоят почти столько же, значительно лучше того коммутатора, что выбрал я.
У подобных коммутаторов имеется веб-интерфейс, который позволяет настраивать VLAN прямо на устройстве.
Тегированный и нетегированный трафик
Если говорить о VLAN, то сетевой порт коммутатора может пребывать в двух состояниях:
- Он может являться членом какой-то конкретной сети (VLAN) (нетегированный порт).
- Он может отвечать за передачу трафика нескольких сетей (VLANs) (тегированный порт).
Если порт является членом VLAN — он ведёт себя как любой другой порт коммутатора. В этом режиме он, очевидно, может являться членом лишь одной сети/VLAN. Теги VLAN убирают из всего трафика, который исходит из этого порта.
Но порт, который предназначен для передачи «тегированного» VLAN-трафика, просто занимается перенаправлением этого трафика в том виде, в котором он его получает, в том числе — ничего не происходит и с VLAN-тегами.
Это — та самая хитрость, которую мы используем для передачи сетевых пакетов из разных сетей (VLANs) нашему Raspberry Pi-роутеру через единственный порт по единственному кабелю.
Raspberry Pi в роли коммутатора с одним сетевым интерфейсом
Давайте разберём эту схему.
Представим, что (возвращающийся) пакет из интернета прибывает на модем и передаётся на порт коммутатора 1.
Коммутатор знает о том, что любой трафик на этом порту принадлежит VLAN 10. Так как этот трафик надо отправить Raspberry Pi-роутеру, коммутатор добавит в пакет тег и перенаправит пакет (с тегом) Raspberry Pi — на порт коммутатора 2.
А Raspberry Pi-роутер, в свою очередь, тоже, как и коммутатор, настроен на работу с VLAN. Тег пакета сообщит роутеру о том, на какой виртуальный интерфейс нужно отправить этот пакет.
Вот пример конфигурации утилиты netplan, иллюстрирующий вышеописанную схему:
network:
version: 2
ethernets:
enp2s0f0:
dhcp4: no
vlans:
enp2s0f0.10:
id: 10
link: enp2s0f0
addresses:
- 68.69.70.71/24 (ненастоящий интернет-адрес)
gateway4: 68.69.70.1 (ненастоящий роутер провайдера)
enp2s0f0.20:
id: 20
link: enp2s0f0
addresses:
- 192.168.0.1/24 (внутренний сетевой адрес, работающий как шлюз)
Как видите — VLAN-пакеты, которые прибывают в виде тегированных пакетов, отправляются (без тегов) на виртуальный сетевой интерфейс, принадлежащий этой конкретной сети. Все эти виртуальные сетевые интерфейсы пользуются единым физическим интерфейсом (enp2s0f0). Виртуальные сетевые интерфейсы — это всего лишь имя физического интерфейса, к которому добавлена конструкция вида ».(VLAN ID)».
С этого момента вы, вероятно, уже поняли, к чему я клоню: эти два виртуальных сетевых интерфейса, в общем-то, очень похожи на роутер с двумя физическими сетевыми интерфейсами. В результате все необходимые операции по маршрутизации и по трансляции сетевых адресов, которые должны быть выполнены, выполняются не с применением физических интерфейсов, а с применением интерфейсов виртуальных.
Как работать с VLAN
Для того чтобы работать с VLAN нужен управляемый коммутатор, поддерживающий VLAN. У такого коммутатора имеется интерфейс управления, часто это — веб-интерфейс.
В данном примере я использую коммутатор TP-LINK TL-SG105E. Для того чтобы добраться до нужной мне страницы, я, в веб-интерфейсе устройства, прошёл по пути VLAN --> 802.1Q VLAN
Из этой таблицы мы можем извлечь следующие сведения:
- Порт 1 — это нетегированный член VLAN 10.
- Порт 2 — это тегированный член VLAN 10 и VLAN 20.
- Порт 3 — это нетегированный член VLAN 20.
Обратите внимание на то, что рекомендуется удалять порты из VLAN, которые их не используют. В результате я убрал порты 1, 2 и 3 из стандартной сети VLAN 1.
Теперь, если к внутренней LAN через этот же коммутатор будет подключено больше устройств, нужно будет сделать соответствующие порты нетегированными членами VLAN 20.
Возможные проблемы
▍Ограничение полосы пропускания сети
Очевидно, что если используется единственный интерфейс, то в нашем распоряжении оказывается лишь пропускная способность этого интерфейса. В большинстве случаев это — не проблема, так как гигабитный Ethernet работает в полнодуплексном режиме. Имеются физические соединения и для исходящего, и для входящего трафика.
В результате можно сказать, что полнодуплексное гигабитное Ethernet-соединение имеет непосредственную пропускную способность, равную 2 Гбит/с. Но мы, в основном, не рассматриваем подобные соединения с такой точки зрения.
Например, если мы, с компьютера, загружаем что-то на скорости в 200 Мбит/с, то этот трафик поступает к нам через VLAN 10 по пути входящего трафика. Затем он переправляется через VLAN 20 к компьютеру с использованием пути исходящего трафика. В результате тут никаких проблем не возникает.
Если планируется использовать Raspberry Pi ещё и как сервер резервного копирования данных (с подключённым к плате внешним жёстким диском), то трафик резервного копирования и интернет-трафик могут «бороться» за полосу пропускания одного и того же гигабитного интерфейса.
▍Воздействие на гигабитное интернет-подключение
Если вы сделаете себе такой маршрутизатор, о котором я тут рассказал, вы никогда не получите на нём полную скорость, характерную для гигабитного интернет-канала. Максимум, на который можно рассчитывать, вероятно, находится в районе 900 Мбит/с. (Тут я исхожу из предположения о том, что вы будете использовать x86-устройство, так как Raspberry Pi, в любом случае, не сможет, например, работать с таким трафиком в режиме файрвола).
Дело в том, что основной объём трафика связан с TCP-соединениями. Когда осуществляется загрузка каких-то материалов, данные передаются в обе стороны! Загружаемые данные — это основной трафик, но есть ещё и заметный постоянный поток данных, состоящий из пакетов, возвращающихся в интернет и сообщающих передающей стороне о том, что некие данные получены принимающей стороной (если принимающая сторона не получит подтверждения — данные будут отправлены повторно).
Помните о том, что, в нашей однопортовой системе, Raspberry Pi использует один и тот же гигабитный порт и для отправки данных в интернет через VLAN 10, и для приёма данных из интернета через VLAN 20. В результате поток трафика, идущего от вас в интернет, будет ограничивать максимально возможную скорость загрузки данных.
▍Raspberry Pi 4 Model B в роли роутера
Главное ограничение Raspberry Pi 4 Model B, которое становится проблемой для всё большего и большего количества людей — это производительность. Если вы используете IPTABLES в Linux для организации файрвола, то, по опыту знаю, пропускная способность сети падает, и составляет, максимум, 650 Мбит/с.
Но это можно счесть проблемой только в том случае, если используется гигабитный доступ в интернет, или если скорость обмена данными с интернетом превышает ту, с которой может справиться Raspberry Pi.
Если же ваша скорость подключения к интернету и близко не подходит к гигабитной — то вас эта проблема не коснётся.
Возможно, для создания маршрутизаторов, подобных вышеописанному, лучше подойдёт Raspberry Pi 400 или платформы, представленные вычислительными модулями, так как их процессоры быстрее, чем у Raspberry Pi 4 Model B.
Да, из дискуссии на Hacker News я узнал о том, что роутер с одним сетевым интерфейсом называют «router on a stick».
Итоги
Стоит ли вам собирать описанный здесь Raspberry Pi-роутер — зависит только от вас. Я пользуюсь чем-то подобным (применяя x86-сервер) уже лет 10, так как не могу провести второй кабель от модема до комнаты, где находится роутер. Вот как устроена моя домашняя сеть.
Пользуетесь ли вы домашними роутерами?