Сразу скажу, что эта статья предназначена для обычных пользователей и для тех, для кого сетевые технологии — это хобби.

Если вам нужен собственный домашний роутер — отличной аппаратной платформой для него может стать Raspberry Pi 4 Model B. Более старые модели Raspberry Pi отличаются значительными ограничениями в плане поддерживаемой ими скорости передачи данных по сети. Эти ограничения столь велики, что они не подойдут для создания интернет-роутеров в том случае, если скорость доступа к интернету превышает 100 Мбит/с.
Итак, одноплатный компьютер Raspberry Pi 4 Model B устроит нас по следующим причинам:
Главной его проблемой, похоже, является тот факт, что у него есть только один сетевой интерфейс. А если создают роутер, то таких интерфейсов нужно как минимум два:
В результате, если роутер создают на базе Raspberry Pi, то, вероятнее всего, докупят к нему USB3-сетевую карту за примерно $20, после чего проект будет завершён.

Raspberry Pi в роли коммутатора с двумя сетевыми интерфейсами
А что если я скажу вам, что то же самое можно сделать, воспользовавшись единственным встроенным сетевым интерфейсом Raspberry Pi 4?
Как это возможно?
Я, как видите, знакомлю читателей с технологией, которая существует с 1990-х годов. Она широко используется в корпоративной среде.
И, так как у меня есть такое ощущение, что эта технология не особенно широко известно в кругах людей, далёких от администрирования корпоративных сетей, я думаю, что тему 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 — он ведёт себя как любой другой порт коммутатора. В этом режиме он, очевидно, может являться членом лишь одной сети/VLAN. Теги VLAN убирают из всего трафика, который исходит из этого порта.
Но порт, который предназначен для передачи «тегированного» VLAN-трафика, просто занимается перенаправлением этого трафика в том виде, в котором он его получает, в том числе — ничего не происходит и с VLAN-тегами.
Это — та самая хитрость, которую мы используем для передачи сетевых пакетов из разных сетей (VLANs) нашему Raspberry Pi-роутеру через единственный порт по единственному кабелю.

Raspberry Pi в роли коммутатора с одним сетевым интерфейсом
Давайте разберём эту схему.
Представим, что (возвращающийся) пакет из интернета прибывает на модем и передаётся на порт коммутатора 1.
Коммутатор знает о том, что любой трафик на этом порту принадлежит VLAN 10. Так как этот трафик надо отправить Raspberry Pi-роутеру, коммутатор добавит в пакет тег и перенаправит пакет (с тегом) Raspberry Pi — на порт коммутатора 2.
А Raspberry Pi-роутер, в свою очередь, тоже, как и коммутатор, настроен на работу с VLAN. Тег пакета сообщит роутеру о том, на какой виртуальный интерфейс нужно отправить этот пакет.
Вот пример конфигурации утилиты netplan, иллюстрирующий вышеописанную схему:
Как видите — VLAN-пакеты, которые прибывают в виде тегированных пакетов, отправляются (без тегов) на виртуальный сетевой интерфейс, принадлежащий этой конкретной сети. Все эти виртуальные сетевые интерфейсы пользуются единым физическим интерфейсом (enp2s0f0). Виртуальные сетевые интерфейсы — это всего лишь имя физического интерфейса, к которому добавлена конструкция вида «.(VLAN ID)».
С этого момента вы, вероятно, уже поняли, к чему я клоню: эти два виртуальных сетевых интерфейса, в общем-то, очень похожи на роутер с двумя физическими сетевыми интерфейсами. В результате все необходимые операции по маршрутизации и по трансляции сетевых адресов, которые должны быть выполнены, выполняются не с применением физических интерфейсов, а с применением интерфейсов виртуальных.
Для того чтобы работать с VLAN нужен управляемый коммутатор, поддерживающий VLAN. У такого коммутатора имеется интерфейс управления, часто это — веб-интерфейс.
В данном примере я использую коммутатор TP-LINK TL-SG105E. Для того чтобы добраться до нужной мне страницы, я, в веб-интерфейсе устройства, прошёл по пути VLAN --> 802.1Q VLAN

Из этой таблицы мы можем извлечь следующие сведения:
Обратите внимание на то, что рекомендуется удалять порты из 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, которое становится проблемой для всё большего и большего количества людей — это производительность. Если вы используете IPTABLES в Linux для организации файрвола, то, по опыту знаю, пропускная способность сети падает, и составляет, максимум, 650 Мбит/с.
Но это можно счесть проблемой только в том случае, если используется гигабитный доступ в интернет, или если скорость обмена данными с интернетом превышает ту, с которой может справиться Raspberry Pi.
Если же ваша скорость подключения к интернету и близко не подходит к гигабитной — то вас эта проблема не коснётся.
Возможно, для создания маршрутизаторов, подобных вышеописанному, лучше подойдёт Raspberry Pi 400 или платформы, представленные вычислительными модулями, так как их процессоры быстрее, чем у Raspberry Pi 4 Model B.
Да, из дискуссии на Hacker News я узнал о том, что роутер с одним сетевым интерфейсом называют «router on a stick».
Стоит ли вам собирать описанный здесь Raspberry Pi-роутер — зависит только от вас. Я пользуюсь чем-то подобным (применяя x86-сервер) уже лет 10, так как не могу провести второй кабель от модема до комнаты, где находится роутер. Вот как устроена моя домашняя сеть.
Пользуетесь ли вы домашними роутерами?


Если вам нужен собственный домашний роутер — отличной аппаратной платформой для него может стать 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, так как не могу провести второй кабель от модема до комнаты, где находится роутер. Вот как устроена моя домашняя сеть.
Пользуетесь ли вы домашними роутерами?
