Введение

На 4 курсе Бауманки я получил задание: сделать виртуальную локальную сеть на базе Linux. Информации на эту тему оказалось довольно много, но ее поиск может занять много времени, а порой даже запутать. Поэтому я решил расписать самые основные шаги для построения локальной сети с использованием VirtualBox, а также пролить свет на некоторые неочевидные настройки Linux.

Описание задачи

Создать виртуальную сеть в VirtualBox, включающую в себя первую сеть на 2024 хостов, вторую сеть на 256 хостов и сервер, выступающий в роли маршрутизатора. В последствии на сервере можно будет настроить файервол для вывода в интернет обоих сетей.

Схема подключения локальных сетей
Схема подключения локальных сетей

Любой компьютер первой сети должен успешно выполнять пинг любого другого компьютера второй сети и наоборот. ICMP-пакеты должны проходить через сервер. Сети и сервер должны быть представлены в виде компьютеров с соответствующими ipv4-адресами.

Настройка виртуальных машин

Если говорить максимально коротко, то сервер одновременно находится и в первой локальной сети, и во второй. Это значит, что по одному сетевому интерфейсу он видит все компьютеры из сети на 2048 хостов, а по другому - все компьютеры из сети на 256 хостов. Для объединения виртуальных машин, допустим сервера и машины первой сети, будем использовать тип подключения "Внутренняя сеть". Внутренняя сеть позволит объединить сервер (SERVER) и первую сеть (LAN 1) на физическом уровне (аналог - соединение кабелем).

Тип подключения первой сети
Тип подключения первой сети
Тип подключения сервера
Тип подключения сервера

Следует обратить внимание на то, что имя внутренней сети LAN1 на первом адаптере должно совпадать с именем внутренней сети SERVER'а на первом адаптере. Таким образом, можно реализовать физическое соединение любого адаптера виртуальной машины LAN 1 с любым адаптером виртуальной машины SERVER. Аналогичным образом соединим вторую сеть (LAN 2) с другим сетевым адаптером сервера, за одним исключением, название внутренней сети должно отличаться.

На данном этапе машины соединены физически, но отправлять ICMP пакеты еще нельзя, для этого необходимо настроить ip-адреса.

Настройка адресов сетей и сервера

Для первой сети на 2048 хостов зададим адрес 192.168.1.0/21, для второй - 192.168.2.0/24. Про ip-адресацию написано уже достаточно большое количество статей, поэтому на ней останавливаться не будем. Соответственно, необходимо задать адреса каждой виртуальной машине.

Для начала стоит посмотреть на сетевые интерфейсы сервера с помощью команды ifconfig:

Сетевые интерфейсы сервера
Сетевые интерфейсы сервера
  • eth0 - из предыдущего пункта адаптер 1 с типом подключения "Сетевой мост", сейчас его рано разбирать

  • eth1 - адаптер 2 с типом подключения внутренняя сеть, соединяется с адаптером 1 (там это будет eth0) первой виртуальной машины LAN 1, имя подключения LAN 1

  • eth2 - адаптер 2 с типом подключения внутренняя сеть, соединяется с адаптером 1 второй виртуальной машины LAN 2, имя подключения LAN 2

Следующими двумя командами зададим ip-адреса сервера в первой и второй сетях соответственно:

  • ifconfig eth1 192.168.1.10 netmask 255.255.248.0

  • ifconfig eth2 192.168.2.10 netmask 255.255.255.0

Затем необходимо настроить ip-адреса на eth0 виртуальных машин LAN1 и LAN2. Выполнив команду ifconfig на каждой из машин можно увидеть следующее:

Настройки сетевых интерфейсов на сервере
Настройки сетевых интерфейсов на сервере
Настройки сетевых интерфейсов LAN 1
Настройки сетевых интерфейсов LAN 1
Настройки сетевых интерфейсов LAN 2
Настройки сетевых интерфейсов LAN 2

На данном этапе LAN 1 видит SERVER по адресу 192.168.1.10, а SERVER видит LAN 1 по 192.168.1.1. Похожая ситуация и со второй сетью, LAN 1 видит SERVER по адресу 192.168.2.10, а SERVER видит LAN 1 по 192.168.2.1.

Убедиться в этом можно с помощью команды ping, которая отсылает icmp пакеты по определенному ip-адресу и принимает ответ. При пинге с SERVER'а адреса 192.168.2.1 (команда ping 192.168.2.10) должен получиться следующий результат:

Результат успешного пинга сервера
Результат успешного пинга сервера

Пакеты идут, значит все правильно.

Маршрутизация через сервер

Данная часть статьи легче для понимая, поэтому коротко и по делу. LAN 1 и LAN 2 находят в разных сетях, но у них есть общая точка соприкосновения - SERVER. Это значит, что две сети могут общаться между собой именно через него. Но для этого надо настроить маршрутизацию.

Для начала стоит разрешить на сервере пересылку пакетов между различными сетевыми интерфейсами командой: echo 1 > /proc/sys/net/ipv4/ip_forward. С помощью утилиты маршрутизации route добавим статические маршруты из сети LAN 1 в LAN 2 через SERVER, и из сети LAN 2 в LAN 1 через SERVER.

LAN 1: route add -net 192,168.2.0 netmask 255.255.255.0 gw 192.168.1.10 dev eth0
LAN 2: route add -net 192.168.0.0 netmask 255.255.248.0 gw 192.168.2.10 dev eth0

Следует отметить, что атрибут -net указывается для того, чтобы провести маршрут именно до сети, а не до отдельного хоста, а после атрибута gw указывается адрес сервера для той сети, в которой начинается маршрут.

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

Заключение

Данная статья должна ответить на базовые вопросы читателей по поводу практической реализации и расставить по местам некоторые вопросы о создании виртуальных локальных сетей в VirtualBox с использованием Linux.

Также стоит отметить, что на практике стоит выбрать другой адрес для первой подсети, например 10.0.0.0/21, чтобы избежать пересекающихся диапазонов адресов.

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


  1. 3ycb
    26.06.2023 12:59
    +2

    LAN 2: route add -net 192,168.0.0 netmask 255.255.248.0 gw 192.168.2.10 dev eth0

    А Вы не ошиблись? Тут не 1 должно быть?
    И в обоих строчках, точки, вместо запятых. (192,168)


    1. cat_chi
      26.06.2023 12:59

      Тут не 1 должно быть?

      Зачем?

      UPD. Прошу прощения, теперь вижу, что автор с самого начала берёт диапазон 192.168.1.0/21


  1. maiketa
    26.06.2023 12:59
    +8

    Сурьезно?
    192.168.0.0/21 = 192.168.0.0-192.168.7.254
    192.168.2.0/24 = 192.168.2.0-192.168.2.254

    Назначать на разные интерфейсы пересекаемые множества IP адресов?
    Для того чтобы понять в чем тут проблема:

    • у вас есть адрес хоста 192.168.2.10 (для примера), так вот он из какой из двух сетей и почему не из другой?

    • вы когда пингуете адрес, вы маску его IP знаете? А когда он в интернете?

    Технически все будет работать и даже если завести 192.168.2.10/24/1 справа и 192.168.2.10/21/0.1 слева. Оба хоста будут доходить до своих шлюзов и пинговать их. Но остальные сети будет видеть только хост 192.168.2.10/24/1 (у него маска меньше и обратный маршрут будет всегда на него)
    А потом ведущий сетевой инженер тратит 2 часа на понимание логики.

    Не надо так... пойду выпью чтоли... с горя...


    1. cat_chi
      26.06.2023 12:59

      А потом ведущий сетевой инженер тратит 2 часа на понимание логики.

      Учитывая, что это, как я понимаю – студенческая курсовая работа, в реальности ведущий инженер будет стоять с палкой над душой и контролировать каждое действие :)


      1. anonymous
        26.06.2023 12:59

        НЛО прилетело и опубликовало эту надпись здесь


    1. max31ru12 Автор
      26.06.2023 12:59
      +1

      Спасибо за комментарий, мне есть куда совершенствоваться. Если вы сетевой инженер или имеете неплохие познания в этой сфере, то должны понимать, что статья ориентирована больше на студентов, которым она может помочь. Конечно, следовало выбрать другое множество адресов, например, 10.0.0.0/21. Это моя недоработка. Вопрос про интернет не считаю уместным, потому что я не говорил об iptables, чтобы выпустить сети в интернет.


  1. TommyMurl
    26.06.2023 12:59

    Стоит же сделать маску поменьше, оставляя места под адрес сервера и бродкаст? И можно вопрос, если пинговать один и тот же адрес, но с разными масками, работать будет? Вопрос к чему: на серверах сетей ARP таблицы конфликтовать не будут? (маска ведь указана, значит обращаемся к определенной сети)


    1. max31ru12 Автор
      26.06.2023 12:59

      Адрес сервера и бродкаст конечно стоит учитывать, решил просто опустить этот момент, потому что это могло бы некоторых запутать. Лучше в такой ситуации пропинговать через fping 192.168.1.1/24, а так, конечно, стоит эти моменты продумать заранее и сделать все удобно, потому что конфликты при обычном пинге будут. Спасибо за хорошие вопросы!


      1. vehicross
        26.06.2023 12:59
        -1

        Как будто два бота переписываются )) ChatGPT уже здесь? )))


        1. anonymous
          26.06.2023 12:59

          НЛО прилетело и опубликовало эту надпись здесь


  1. EugenySk
    26.06.2023 12:59
    -1

    спасибо, полезно


  1. mc_tol
    26.06.2023 12:59
    +2

    Учитывая, что это, как я понимаю – студенческая курсовая работа

    Да нет же, уровень статьи - средний, не может такого быть </s>

    Про пересечение сетей уже написали, про запятые в адресах тоже, плюс еще команда неведомая:

    Для начала стоит посмотреть на сетевые интерфейсы сервера с помощью команды ifcofig

    Ну и вишенка:

    Данная статья должна ответить на базовые вопросы читателей и расставить по местам некоторые фундаментальные вопросы

    Да снова нет же, она по местам вопросы не расставляет. Особенно фундаментальные. Она на них отвечать должна. Но увы...


    1. max31ru12 Автор
      26.06.2023 12:59
      +1

      Спасибо за замечания, это моя первая статья, в следующий раз постараюсь допускать меньше ошибок. Если моя статья не ответила на ваши вопросы, значит, скорее всего, вам следует посмотреть где-нибудь еще.


  1. gaponik
    26.06.2023 12:59
    +1

    Во 1-х в статье куча ошибок... Выше часть из них описана....

    Но самое главное сеть 192.168.0.0/21 включает в себя сеть 192.168.2.0/24 как результат все описанное не будет работать от слова совсем...

    Сети не должны пересекаться...

    как результат если на одном интерфейсе будет сеть 192.168.0.0/21, то на другом интерфейсе должна быть сеть например 192.168.8.0/24 ну не как 192.168.2.0/24


  1. max31ru12 Автор
    26.06.2023 12:59

    Не хочу вас расстраивать, но работает. За ошибки прошу прощения, буду стараться лучше. Мне следовало выбрать другой адрес для первой сети, чтобы статья была более наглядной, и не возникали спорные вопросы.


  1. twixus_vulgaris
    26.06.2023 12:59

    "Для первой сети на 2048 хостов зададим адрес 192.168.1.0/21, для второй - 192.168.2.0/24"
    Автора не смущает, что диапазоны адресов пересекаются? Не говоря уже о том, что первая сеть должна быть 192.168.0.0/21


    1. max31ru12 Автор
      26.06.2023 12:59

      Как локальное решение это работает неплохо. Да, мне следовало выбрать другой адрес, чтобы возникало меньше вопросов.


      1. mc2
        26.06.2023 12:59

        Создайте две машины с адресом 192.168.2.2 в каждой из сетей. Сделайте ping и посмотрите на результат, какая из машин отвечает.


        1. anonymous
          26.06.2023 12:59

          НЛО прилетело и опубликовало эту надпись здесь


    1. net_racoon
      26.06.2023 12:59

      Да и плюс 2048 хостов в одной подсети- это капец канеш.


      1. FlyingDutchman
        26.06.2023 12:59

        Студенческий ботнет и диванные DDOS-войска в одном флаконе, ой, подсети.


  1. kav4ik
    26.06.2023 12:59
    +1

    Может, чтобы предостеречь студентов, от проблем которые их могут ждать, если они будут использовать вашу статью, стоит добавить в конце статьи пояснения о проблемах и способах решения?


    1. anonymous
      26.06.2023 12:59

      НЛО прилетело и опубликовало эту надпись здесь


  1. vehicross
    26.06.2023 12:59
    -1

    Данная статья должна ответить на базовые вопросы читателей и расставить по местам некоторые фундаментальные вопросы о создании виртуальных локальных сетей в VirtualBox с использованием Linux.

    Уважаемый автор, подскажите, на какие базовые вопросы, по Вашему мнению, должна ответить эта статья, и какие фундаментальные вопросы расставить по местам?

    Вы умудрились в задаче уровня «2+2» наворотить таких косяков, что Вашу статью разве что включать в простейший тест при приеме на работу эникейщика (даже не сисадмина и уж подавно не сетевого админа).

    Не позорьтесь и ВУЗ не позорьте, уберите статью и поизучайте матчасть - у Вас пробелы в совершенно фундаментальных знамениях.


    1. max31ru12 Автор
      26.06.2023 12:59
      +1

      Спасибо за ваше мнение, обязательно к нему не прислушаюсь.


  1. DoMoVoY
    26.06.2023 12:59

    На замену ifconfig/route в Linux пришел пакет iproute2 с командами ip addr / ip route лет как 10 назад. Ваши примеры устарели. А для рассчета адресов пользуйтесь пакетом ipcalc.


    1. net_racoon
      26.06.2023 12:59

      Зачем ipcalc? Это все в уме считается