![](https://habrastorage.org/webt/iw/jj/sx/iwjjsxb5uleirvtsxdoobb2dt68.jpeg)
Если вам нужен собственный домашний роутер — отличной аппаратной платформой для него может стать 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, так как не могу провести второй кабель от модема до комнаты, где находится роутер. Вот как устроена моя домашняя сеть.
Пользуетесь ли вы домашними роутерами?
![](https://habrastorage.org/webt/ou/g5/kh/oug5kh6sjydt9llengsiebnp40w.png)
Комментарии (32)
reticular
18.10.2021 16:51-2не надо никаких VLAN
используйте LEVEL2 модели OSIrionnagel
18.10.2021 18:02А можете более подробно?
suns
18.10.2021 20:01Наверное имелось ввиду, что можно с разных маков общаться
rionnagel
19.10.2021 03:18Как я понимаю нет и ещё с неуправляемым свитчем куда идет провайдер и локалка. Но даже если прикинуть управляемый свитч, ip аллиасы со своими маками, мак вайтлистами и т.д., то всё равно это гораздо менее надежно и требует большей экспертизы для настройки, чем те же виланы (хотя бы хорошее знание флагов sysctl для сетей). Я просто изначально думал, что это будет очередной хитрый протокол.
kornerz
18.10.2021 18:19+2т.е. клиенты в том же L2 домене, что и аплинк?
Допустим, провайдер тоже отдает адреса по DHCP. Что получит клиент?
redneko
18.10.2021 18:00Самый дешёвый коммутатор с поддержкой VLAN, который мне удалось найти — это TP-LINK TL-SG105E
И страдайте с этой тупой железкой, у которой нет MGMT VLAN (была такая по несчастью, сэкономил). Если настроить на получение адреса по DHCP - то может получить IP от провайдера. Остаётся только вариант со статичным назначением адреса. При выборе коммутатора желательно момент с отдельным VLAN для управления уточнять сразу
Admaer
19.10.2021 13:01Так а что мешает создать новый VLAN и назначит его "VLAN'ом для управления"? Я не очень понимаю в чём трудность. В первоначальной настройке? (Может схватить по DHCP не предназначенный ему IP). Кстати, а свичи с заранее настроенным MGMT VLAN вообще бывают? Обычно там идёт VLAN 1 на все порты, а дальше делай что хочешь.
redneko
19.10.2021 13:10Мешает то, что конкретно эта железка не знает понятие mgmt vlan как класс и админка доступна в любом vlan по тому адресу, которая она успела схватить первым. И это поведение никак не обходится, разве что статикой прибить IP из внутренней сети. Но тогда в моём кейсе терялась прелесть динамической регистрации в DNS с созданием A, AAAA и PTR записей при выделении адреса DHCP сервером
Admaer
19.10.2021 14:08+2эта железка не знает понятие mgmt vlan как класс
Я, кстати, тоже :D
Мы просто делали отдельный VLAN для управления, ставили адрес только на виртуальный интерфейс в этом VLAN (в пользовательских VLAN'ах у коммутаторов не было IP адресов, соответственно и цепляться не к чему) и вешали ещё ACL, чтобы доступ был только из подсети ИТ отдела.
Не знаю, может ли конкретно TP-LINK TL-SG105E работать с ACL. Если может - то никаких проблем быть не должно (
а вообще не стоит использовать китайские "управляемые" свичи за 1.500 рублей).
Alexsey
18.10.2021 18:21+1А теперь давайте посчитаем сколько все это извращенство будет стоить и просто возьмем нормальный роутер. Ну еще можно прикинуть через сколько вас хакнет какой-нибудь китайский ботнет если перед raspberry не будет железки с фаерволлом и не будет NAT.
redneko
18.10.2021 20:11+2При нормальной настройке IPtables/nftables + SSH по ключу only вероятность того, что поломают RPi куда ниже заводских роутеров, у которых вебморды кишат дырками, DLink и Linksys чего стоят. Говорю как владелец x86 самоделки всё-в-одном - и роутер с VPN живёт и несколько виртуалкок крутится и прочие мелочи в виде ISCSI таргета. Никто за восемь лет не сломал, успешно пережит переезд с седьмой центоси на восьмой оракл.
Alexsey
18.10.2021 21:05+1Когда слегка редактировал комментарий видимо случайно потер важное замечание - ...хакнет китайский ботнет если не озаботиться правильным hardening'ом системы на железке и малина будет смотреть в интернет напрямую.
Так то понятно если руки из правильного места растут то никто не мешает на чем угодно поднять роутер если железо и софт позволяют.
Yuribtr
18.10.2021 18:29+5Итак, автор статьи предлагает потрать минимум 7000 р за малину с 2ГБ памяти, еще 2000 р за коммутатор с поддержкой VLAN, плюс еще надо купить внешнюю антенну, а в идеале их должно быть несколько.
И ни слова про безопасность такого решения, а ведь VLAN при неправильной конфигурации может быть сломан.
FSA
18.10.2021 18:50+1Что-то дороговато получается, как уже отмечали. А ещё можно у китайцев найти платы с 4 портами, например, есть Banana Pi . Думаю будет попроще для баловства. А по надёжности не сильно хуже той же RPi с дешёвым коммутатором.
suns
18.10.2021 20:04Я нашел замечательную плату NanoPi R2S, у которой изначально 2 порта и замечательный корпус
nochkin
18.10.2021 22:43+1Там второй порт висит на USB 3.0, что сказывается на скорости (не всегда это критично, конечно). Но с таким же успехом можно взять USB-Ethernet адаптер и для Pi.
Просто часто эти Pi лежат уже без дела.
kxx
18.10.2021 20:47Использую такую схему дома уже более 6 лет - cubietruck + dgs-1100-5. Правда, cubietruck изначально покупался для других целей, но так как там были нерешаемые проблемы с драйвером gpu (и сейчас не все гладко), то решил сделать из него однорукий роутер под debian с сетевым диском (NFS), Transmssion, minidlna.
unsignedchar
18.10.2021 23:06+2КМК сила Малинки в gpio и видео. Вместо роутера, конечно, можно использовать.. но готовый роутер обойдется дешевле же.
ModestONE
20.10.2021 15:34-1Статья занимательная, спасибо! Но практического проку от подобной реализации нуль, ничего личного.
vvzvlad
22.10.2021 11:45+1Обоснуете?
unsignedchar
22.10.2021 14:18-1Малинка (от $50) + источник питания + корпус + SD карта + немного танцев.
Готовый роутер — те же $50, включил и работает.
ModestONE
22.10.2021 14:45+1Обоснуете?
На изи. Бюджетная малина с обвесом, в том числе с коммутатором - это примерно 100 баксов. Древнюю брать смысла нет, по совокупности причин. И это я не учитываю то, что ее наценили. За 100 баксов можно купить микротик хап ас3.rionnagel
22.10.2021 15:24А за 0-5$ + прогулку по помойке можно собрать древний пк с парой сетевух и древний свитч, либо вообще найти рабочий роутер. Дешевле всегда есть как. Этот кейс из серии - есть малинка и я хочу роутер на линуксе. Всегда можно было купить дешевый свитч и дешевую usb сетевуху к малинке и не использовать виланы, но подход из статьи даст читателю задуматься о применимости данной технологии на конкретном примере.
unsignedchar
22.10.2021 16:41Всегда можно было купить дешевый свитч и дешевую usb сетевуху к малинке
Если все равно покупать желуди и спички, чтобы с них сложитьёжикароутер — почему сразу не купить роутер?
ModestONE
22.10.2021 17:10Смысл в том, что кто юзает влан-ы, будучи понимая, что это, как работает и иже, тот не будет из малины собирать роутер. И да, подачу вы не отбили. Хап ас3 ставит крест на всех этих начинаниях. По одной простой причине - время и куча бессмысленных телодвижений.
прогулку по помойке
На помойку хожу лишь для того чтоб мусор выкинуть. По остальному выше ответил.
ex_ineris
21.10.2021 10:55А для чего такие костыли велосипеды, не проще ли купить нормальный роутер? Машинку как роутер у нее один порт эзернет надо брать машинку CM 4 module и к ней плату с двумя гигабитами минимум, а это будет баксов 300.
dtmse
21.10.2021 11:20+1Лет десять назад я реализовывал дома подобие этой схемы, только вместо Raspberry был компактный x86-серверочек с единственным сетевым портом, а ввиду отсутствия полноценного управляемого коммутатора была произведена модификация простейшего пятипортового свича на чипе Marvell 88E6060, к которому была подпаяна микросхема 93C46 (репрограммируемое ПЗУ на 128 байт) с зашитой в неё конфигурацией Port-based VLAN для коммутатора. Этого было достаточно, т.к. провайдер раздавал интернет через pppoe.
dreesh
интересно старый андроид через usb можно повесить?