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

В разделе описано, как настроить виртуальную машину в качестве маршрутизатора и с ее помощью организовать доступ в интернет для других машин в подсети.

Маршрутизатор позволяет перенаправлять трафик от одного сетевого интерфейса к другому. Принцип его работы состоит в следующем:

  1. На сетевой интерфейс маршрутизатора приходит трафик от других машин подсети.

  2. При прохождении трафика через маршрутизатор в заголовках IP-пакетов происходит подмена адреса источника.

  3. Виртуальные машины в подсети получают доступ в интернет с помощью публичного IP-адреса, который назначен на сетевой интерфейс маршрутизатора.

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

../_images/schm__vm-router.svg

Перед началом работы

  1. Зарегистрируйтесь в личном кабинете Cloud.ru.

    Если вы уже зарегистрированы, войдите под своей учетной записью.

  2. Убедитесь, что для вашей учетной записи достаточно прав на проект. При необходимости настройте права или запросите их у администратора.

Создайте маршрутизатор

Маршрутизатор будет принимать трафик от других виртуальных машин в подсети.

  1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Инфраструктура → Виртуальные машины.

  2. Нажмите Создать виртуальную машину.

  3. Введите название виртуальной машины — «vm-router».

  4. Укажите настройки:

    • Зона доступности — «ru.AZ-1».

    • Образ — «Ubuntu 22.04».

    • Гарантированная доля vCPU — 10%.

  5. Нажмите Продолжить.

  6. Подключите ВМ к подсети.

    1. В блоке Сетевые настройки нажмите Подключить к подсети.

    2. В поле Подсети выберите подсеть «Default_ru.AZ-1».

    3. Скопируйте и сохраните адрес подсети: он потребуется для дальнейшей настройки.

    4. Нажмите Подключить.

  7. Назначьте ВМ публичный IP-адрес.

    1. В поле Тип IP выберите Плавающий.

    2. Нажмите Арендовать новый.

    3. В поле Интерфейс выберите сетевой интерфейс, подключенный к подсети «Default_ru.AZ-1».

  8. Настройте параметры авторизации пользователя.

    1. В поле Логин введите имя пользователя виртуальной машины: например, «router».

    2. Выберите пароль в качестве метода аутентификации.

    3. Укажите пароль пользователя.

  9. Нажмите Создать.

  10. В строке созданной ВМ скопируйте и сохраните адрес из столбца Внутренний IP: он потребуется для дальнейшей настройки.

Создайте клиентскую ВМ

Клиентская виртуальная машина без публичного IP-адреса будет получать доступ в интернет через маршрутизатор.

  1. На странице сервиса «Виртуальные машины» нажмите Создать виртуальную машину.

  2. Введите название виртуальной машины — «vm-client».

  3. Укажите настройки:

    • Зона доступности — «ru.AZ-1».

    • Образ — «Ubuntu 22.04».

    • Гарантированная доля vCPU — 10%.

  4. Нажмите Продолжить.

  5. Подключите ВМ к подсети.

    1. В блоке Сетевые настройки нажмите Подключить к подсети.

    2. В поле Подсети выберите подсеть «Default_ru.AZ-1».

    3. Нажмите Подключить.

  6. Отключите опцию Подключить публичный IP.

  7. Настройте параметры авторизации пользователя.

    1. В поле Логин введите имя пользователя виртуальной машины: например, «client».

    2. Выберите пароль в качестве метода аутентификации.

    3. Укажите пароль пользователя.

  8. Нажмите Создать.

Настройте маршрутизатор

На маршрутизаторе необходимо настроить правила, по которым он управляет трафиком.

  1. Нажмите на название виртуальной машины «vm-router».

  2. Перейдите на вкладку Серийная консоль.

  3. Введите логин и пароль пользователя, указанные при создании ВМ.

  4. Включите маршрутизацию пакетов в параметрах ядра.

    1. Проверьте текущий статус параметра. Выполните команду:

      cat /proc/sys/net/ipv4/ip_forward

      Результат выполнения команды:

      • 1 — параметр включен, можно переходить к п. 5;

      • 0 — параметр выключен, нужно внести изменения в файле /etc/sysctl.conf.

    2. Откройте файл /etc/sysctl.conf для редактирования:

      sudo nano /etc/sysctl.conf
    3. Найдите строку #net.ipv4.ip_forward=1 и удалите знак # в начале. Сохраните изменения.

    4. Примените изменения:

      sudo sysctl -p /etc/sysctl.conf
  5. Создайте правило маршрутизации, которое при передаче трафика подменяет IP-адрес виртуальных машин в подсети на IP-адрес маршрутизатора:

    sudo iptables -t nat -A POSTROUTING -o enp3s0 -s <адрес_подсети> -j SNAT --to <внутренний_IP_маршрутизатора>

    Где:

    • <адрес_подсети> — адрес подсети «Default_ru.AZ-1».

    • <внутренний_IP_маршрутизатора> — внутренний IP-адрес виртуальной машины «vm-router».

  6. Сохраните правило:

    sudo mkdir /etc/iptables && touch /etc/iptables/iptables.rules && iptables-save > /etc/iptables/iptables.rules

Настройте сетевой интерфейс маршрутизатора

На сетевом интерфейсе маршрутизатора необходимо отключить проверку адресов источника и назначения.

  1. Выберите виртуальную машину «vm-router».

  2. Перейдите на вкладку Сетевые параметры.

  3. В разделе Подсети нажмите на название подсети «Default_ru.AZ-1».

  4. Перейдите на вкладку Интерфейсы.

  5. В строке нужного интерфейса нажмите Горизонтальное меню и выберите Свойства.

  6. Отключите опцию Проверка адреса источника/назначения.

  7. Подтвердите отключение.

Настройте клиентскую ВМ

После настройки маршрутизатора нужно изменить статические маршруты на клиентской ВМ.

  1. Выберите виртуальную машину «vm-client».

  2. Перейдите на вкладку Серийная консоль.

  3. Введите логин и пароль пользователя, указанные при создании ВМ.

  4. Удалите маршрут по умолчанию:

    sudo ip r delete default
  5. Добавьте новый маршрут по умолчанию, который указывает на «vm-router»:

    sudo ip r add default via <внутренний_IP_маршрутизатора> dev enp3s0

    Где <внутренний_IP_маршрутизатора> — внутренний IP-адрес виртуальной машины «vm-router».

  6. Измените маршруты к DNS-серверам на «vm-client»:

    sudo ip r add 8.8.8.8 via <внутренний_IP_маршрутизатора> dev enp3s0
    sudo ip r add 8.8.4.4 via <внутренний_IP_маршрутизатора> dev enp3s0
  7. Проверьте доступ в интернет с помощью команды ping:

    ping -c 10 cloud.ru

    Убедитесь, что пакеты возвращаются. Пример ответа команды:

    PING cloud.ru (185.71.64.201) 56(84) bytes of data.
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=1 ttl=57 time=5.55 ms
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=2 ttl=57 time=2.53 ms
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=3 ttl=57 time=1.82 ms
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=4 ttl=57 time=1.88 ms
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=5 ttl=57 time=1.71 ms
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=6 ttl=57 time=1.79 ms
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=7 ttl=57 time=1.67 ms
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=8 ttl=57 time=1.58 ms
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=9 ttl=57 time=1.65 ms
    64 bytes from 185.71.64.201 (185.71.64.201): icmp_seq=10 ttl=57 time=1.97 ms
    --- cloud.ru ping statistics ---
    10 packets transmitted, 10 received, 0% packet loss, time 13059ms

Теперь трафик с «vm-client» передается в интернет через «vm-router».

Evolution