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



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

Итак, одноплатный компьютер Raspberry Pi 4 Model B устроит нас по следующим причинам:

  1. Он относительно недорог.
  2. Он достаточно быстр.
  3. Он может хорошо нагрузить работой свой гигабитный сетевой интерфейс.
  4. Он энергоэффективен.

Главной его проблемой, похоже, является тот факт, что у него есть только один сетевой интерфейс. А если создают роутер, то таких интерфейсов нужно как минимум два:

  1. Первый интерфейс подключают к модему или роутеру, дающему доступ в интернет (идеально — в режиме моста).
  2. Второй интерфейс подключают к домашней сети (возможно — к коммутатору).

В результате, если роутер создают на базе 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, то сетевой порт коммутатора может пребывать в двух состояниях:

  1. Он может являться членом какой-то конкретной сети (VLAN) (нетегированный порт).
  2. Он может отвечать за передачу трафика нескольких сетей (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, так как не могу провести второй кабель от модема до комнаты, где находится роутер. Вот как устроена моя домашняя сеть.

Пользуетесь ли вы домашними роутерами?

Комментарии (32)


  1. dreesh
    18.10.2021 16:47
    +1

    интересно старый андроид через usb можно повесить?


  1. reticular
    18.10.2021 16:51
    -2

    не надо никаких VLAN
    используйте LEVEL2 модели OSI


    1. FFiX
      18.10.2021 18:00
      +1

      Так автор и описывает L2 VLAN. Или я что-то неверно понял?


    1. rionnagel
      18.10.2021 18:02

      А можете более подробно?


      1. suns
        18.10.2021 20:01

        Наверное имелось ввиду, что можно с разных маков общаться


        1. rionnagel
          19.10.2021 03:18

          Как я понимаю нет и ещё с неуправляемым свитчем куда идет провайдер и локалка. Но даже если прикинуть управляемый свитч, ip аллиасы со своими маками, мак вайтлистами и т.д., то всё равно это гораздо менее надежно и требует большей экспертизы для настройки, чем те же виланы (хотя бы хорошее знание флагов sysctl для сетей). Я просто изначально думал, что это будет очередной хитрый протокол.


    1. kornerz
      18.10.2021 18:19
      +2

      т.е. клиенты в том же L2 домене, что и аплинк?
      Допустим, провайдер тоже отдает адреса по DHCP. Что получит клиент?


      1. reticular
        18.10.2021 19:18
        -3

        ну простите :(
        только статика
        просто на интерфейс назначаете несколько IP адресов
        и коммутатор обычный без поддержки VLAN


        1. rionnagel
          18.10.2021 19:48
          +6

          Просто аллиасы? Я бы не рискнул не разделять сеть провайдера и свою локалку.


  1. redneko
    18.10.2021 18:00

    Самый дешёвый коммутатор с поддержкой VLAN, который мне удалось найти — это TP-LINK TL-SG105E

    И страдайте с этой тупой железкой, у которой нет MGMT VLAN (была такая по несчастью, сэкономил). Если настроить на получение адреса по DHCP - то может получить IP от провайдера. Остаётся только вариант со статичным назначением адреса. При выборе коммутатора желательно момент с отдельным VLAN для управления уточнять сразу


    1. Admaer
      19.10.2021 13:01

      Так а что мешает создать новый VLAN и назначит его "VLAN'ом для управления"? Я не очень понимаю в чём трудность. В первоначальной настройке? (Может схватить по DHCP не предназначенный ему IP). Кстати, а свичи с заранее настроенным MGMT VLAN вообще бывают? Обычно там идёт VLAN 1 на все порты, а дальше делай что хочешь.


      1. redneko
        19.10.2021 13:10

        Мешает то, что конкретно эта железка не знает понятие mgmt vlan как класс и админка доступна в любом vlan по тому адресу, которая она успела схватить первым. И это поведение никак не обходится, разве что статикой прибить IP из внутренней сети. Но тогда в моём кейсе терялась прелесть динамической регистрации в DNS с созданием A, AAAA и PTR записей при выделении адреса DHCP сервером


        1. Admaer
          19.10.2021 14:08
          +2

          эта железка не знает понятие mgmt vlan как класс

          Я, кстати, тоже :D

          Мы просто делали отдельный VLAN для управления, ставили адрес только на виртуальный интерфейс в этом VLAN (в пользовательских VLAN'ах у коммутаторов не было IP адресов, соответственно и цепляться не к чему) и вешали ещё ACL, чтобы доступ был только из подсети ИТ отдела.

          Не знаю, может ли конкретно TP-LINK TL-SG105E работать с ACL. Если может - то никаких проблем быть не должно (а вообще не стоит использовать китайские "управляемые" свичи за 1.500 рублей).


  1. Alexsey
    18.10.2021 18:21
    +1

    А теперь давайте посчитаем сколько все это извращенство будет стоить и просто возьмем нормальный роутер. Ну еще можно прикинуть через сколько вас хакнет какой-нибудь китайский ботнет если перед raspberry не будет железки с фаерволлом и не будет NAT.


    1. redneko
      18.10.2021 20:11
      +2

      При нормальной настройке IPtables/nftables + SSH по ключу only вероятность того, что поломают RPi куда ниже заводских роутеров, у которых вебморды кишат дырками, DLink и Linksys чего стоят. Говорю как владелец x86 самоделки всё-в-одном - и роутер с VPN живёт и несколько виртуалкок крутится и прочие мелочи в виде ISCSI таргета. Никто за восемь лет не сломал, успешно пережит переезд с седьмой центоси на восьмой оракл.


      1. Alexsey
        18.10.2021 21:05
        +1

        Когда слегка редактировал комментарий видимо случайно потер важное замечание - ...хакнет китайский ботнет если не озаботиться правильным hardening'ом системы на железке и малина будет смотреть в интернет напрямую.

        Так то понятно если руки из правильного места растут то никто не мешает на чем угодно поднять роутер если железо и софт позволяют.


  1. Yuribtr
    18.10.2021 18:29
    +5

    Итак, автор статьи предлагает потрать минимум 7000 р за малину с 2ГБ памяти, еще 2000 р за коммутатор с поддержкой VLAN, плюс еще надо купить внешнюю антенну, а в идеале их должно быть несколько.
    И ни слова про безопасность такого решения, а ведь VLAN при неправильной конфигурации может быть сломан.


  1. FSA
    18.10.2021 18:50
    +1

    Что-то дороговато получается, как уже отмечали. А ещё можно у китайцев найти платы с 4 портами, например, есть Banana Pi . Думаю будет попроще для баловства. А по надёжности не сильно хуже той же RPi с дешёвым коммутатором.


    1. suns
      18.10.2021 20:04

      Я нашел замечательную плату NanoPi R2S, у которой изначально 2 порта и замечательный корпус


      1. nochkin
        18.10.2021 22:43
        +1

        Там второй порт висит на USB 3.0, что сказывается на скорости (не всегда это критично, конечно). Но с таким же успехом можно взять USB-Ethernet адаптер и для Pi.

        Просто часто эти Pi лежат уже без дела.


  1. kxx
    18.10.2021 20:47

    Использую такую схему дома уже более 6 лет - cubietruck + dgs-1100-5. Правда, cubietruck изначально покупался для других целей, но так как там были нерешаемые проблемы с драйвером gpu (и сейчас не все гладко), то решил сделать из него однорукий роутер под debian с сетевым диском (NFS), Transmssion, minidlna.


  1. unsignedchar
    18.10.2021 23:06
    +2

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


  1. ModestONE
    20.10.2021 15:34
    -1

    Статья занимательная, спасибо! Но практического проку от подобной реализации нуль, ничего личного.


    1. vvzvlad
      22.10.2021 11:45
      +1

      Обоснуете?


      1. unsignedchar
        22.10.2021 14:18
        -1

        Малинка (от $50) + источник питания + корпус + SD карта + немного танцев.
        Готовый роутер — те же $50, включил и работает.


      1. ModestONE
        22.10.2021 14:45
        +1

        Обоснуете?


        На изи. Бюджетная малина с обвесом, в том числе с коммутатором - это примерно 100 баксов. Древнюю брать смысла нет, по совокупности причин. И это я не учитываю то, что ее наценили. За 100 баксов можно купить микротик хап ас3.


        1. rionnagel
          22.10.2021 15:24

          А за 0-5$ + прогулку по помойке можно собрать древний пк с парой сетевух и древний свитч, либо вообще найти рабочий роутер. Дешевле всегда есть как. Этот кейс из серии - есть малинка и я хочу роутер на линуксе. Всегда можно было купить дешевый свитч и дешевую usb сетевуху к малинке и не использовать виланы, но подход из статьи даст читателю задуматься о применимости данной технологии на конкретном примере.


          1. unsignedchar
            22.10.2021 16:41

            Всегда можно было купить дешевый свитч и дешевую usb сетевуху к малинке


            Если все равно покупать желуди и спички, чтобы с них сложить ёжика роутер — почему сразу не купить роутер?


          1. ModestONE
            22.10.2021 17:10

            Смысл в том, что кто юзает влан-ы, будучи понимая, что это, как работает и иже, тот не будет из малины собирать роутер. И да, подачу вы не отбили. Хап ас3 ставит крест на всех этих начинаниях. По одной простой причине - время и куча бессмысленных телодвижений.

            прогулку по помойке

            На помойку хожу лишь для того чтоб мусор выкинуть. По остальному выше ответил.


  1. Veter44k
    20.10.2021 19:32
    +2

    Если уж использовать RasPI как роутер, то ставить на него нужно OpenWRT


  1. ex_ineris
    21.10.2021 10:55

    А для чего такие костыли велосипеды, не проще ли купить нормальный роутер? Машинку как роутер у нее один порт эзернет надо брать машинку CM 4 module и к ней плату с двумя гигабитами минимум, а это будет баксов 300.


  1. dtmse
    21.10.2021 11:20
    +1

    Лет десять назад я реализовывал дома подобие этой схемы, только вместо Raspberry был компактный x86-серверочек с единственным сетевым портом, а ввиду отсутствия полноценного управляемого коммутатора была произведена модификация простейшего пятипортового свича на чипе Marvell 88E6060, к которому была подпаяна микросхема 93C46 (репрограммируемое ПЗУ на 128 байт) с зашитой в неё конфигурацией Port-based VLAN для коммутатора. Этого было достаточно, т.к. провайдер раздавал интернет через pppoe.