VK Cloud logo
Обновлена 20 декабря 2023 г. в 05:58

Сеть в ВМ Linux

В этом руководстве приведены рекомендации по устранению проблем с конфигурацией сети на виртуальных машинах Linux.

В качестве примера предполагается, что:

  • виртуальная машина имеет только один сетевой интерфейс;
  • решается проблема отсутствующего доступа к виртуальной машине по SSH.

Описанные подходы также могут быть использованы, когда доступ потерян до другого приложения (например, веб-сервера NGINX) или когда у виртуальной машины есть несколько сетевых интерфейсов.

Пример проблемы

  • Невозможно подключиться к виртуальной машине по SSH по ее приватному IP-адресу или плавающему IP-адресу (если он есть).
  • Некоторое время назад проблем с подключением не было.

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

  1. Выполните принудительную перезагрузку.

    Эта операция может помочь, если виртуальная машина не отвечает или ее сетевой интерфейс инициализируется некорректно:

    1. Остановите виртуальную машину.
    2. Для остановленной виртуальной машины выполните принудительный перезапуск.

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

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

  3. Убедитесь, что вы можете получить доступ к VNC-консоли виртуальной машины и авторизоваться в ней по преднастроенному логину.

    Если это необходимо, восстановите пароль для логина.

  4. Получите информацию о конфигурации сетевого интерфейса виртуальной машины:

    1. Перейдите в личный кабинет VK Cloud.

    2. Выберите проект, где находится нужная виртуальная машина.

    3. Перейдите в раздел Облачные вычисления → Виртуальные машины.

    4. Нажмите на имя нужной виртуальной машины.

    5. Перейдите на вкладку Сети.

    6. Запишите следующую информацию о сети:

      • имя сети и подсети;
      • шлюз и CIDR для подсети;
      • IP-адреса: приватный IP-адрес и плавающий IP-адрес (если есть);
      • MAC-адрес;
      • настройки Firewall (список групп безопасности).

      Для примера будут использоваться следующие значения:

      Параметр
      Значение
      Имя сети
      demoNetwork
      Имя подсети
      demoSubnet
      Шлюз
      10.0.0.1
      CIDR
      10.0.0.0/24
      Приватный IP-адрес
      10.0.0.5
      Приватный IP-адрес в комбинации с префиксом из CIDR
      10.0.0.5/24
      Плавающий IP-адрес
      192.0.2.22
      MAC-адрес
      fa:16:3e:aa:bb:cc
      Настройки Firewall
      default

1. Проверьте настройки сетевого интерфейса

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

Проверьте корректность настройки сетевого интерфейса:

  1. Подключитесь к консоли виртуальной машины и авторизуйтесь.

  2. Выполните команду:

    ip link show

    Пример вывода:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT                   group default qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode                   DEFAULT group default qlen 1000    link/ether fa:16:3e:aa:bb:cc brd ff:ff:ff:ff:ff:ff    altname enp0s3

    Найдите в выводе команды имя интерфейса, для которого параметр link\ether совпадает с MAC-адресом, полученным ранее. В данном примере это будет ens3.

  3. Выполните команду, подставив в нее полученное на предыдущем шаге имя интерфейса:

    ip address show ens3

    Пример вывода:

    2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000    link/ether fa:16:3e:aa:bb:cc brd ff:ff:ff:ff:ff:ff    altname enp0s3    inet 10.0.0.5/24 metric 100 brd 10.0.0.255 scope global dynamic ens3       valid_lft 603373sec preferred_lft 603373sec    inet6 fe80::f816:3eff:feb4:d70f/64 scope link       valid_lft forever preferred_lft forever

    Вывод должен содержать:

    • Сведения о состоянии интерфейса: state UP.
    • Приватный IP-адрес виртуальной машины, скомбинированный с префиксом /24 из CIDR подсети, в параметре inet (10.0.0.5/24).
  4. Выполните команду:

    ip route show default

    Пример вывода:

    default via 10.0.0.1 dev ens3 proto dhcp src 10.0.0.5 metric 100

    Убедитесь, что вывод содержит:

    • IP-адрес шлюза (via 10.0.0.1).
    • Имя интерфейса, полученное ранее (dev ens3).
    • Приватный IP-адрес виртуальной машины (src 10.0.0.5).

    Если вывод команд ip address show и ip route show содержит в себе приведенные сведения, то настройки сетевого интерфейса корректны. Перейдите к проверке приложений.

    Если вывод команд ip address show и ip route show не содержит в себе приведенных сведений, то настройки сетевого интерфейса некорректны.

  5. Настройте сетевой интерфейс вручную:

    1. Отредактируйте файл /etc/netplan/50-cloud-init.yaml и приведите его к следующему виду:

      network:    ethernets:        ens3: # Имя интерфейса            dhcp4: false            addresses:                - 10.0.0.5/24 # Приватный IP-адрес + префикс из CIDR            routes:                - to: 0.0.0.0/0                  via: 10.0.0.1 # Адрес шлюза            nameservers:                addresses:                    - 5.61.237.120                    - 5.61.237.127            match:                macaddress: fa:16:3e:aa:bb:cc # MAC-адрес            set-name: ens3    version: 2

      При необходимости укажите другие DNS-серверы в параметре networks.ethernets.ens3.nameservers.addresses.

    2. Выполните команду:

      sudo netplan apply
  6. Запретите вносить автоматические изменения в отредактированный конфигурационный файл:

    echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
  7. Проверьте наличие доступа по SSH к виртуальной машине. Если доступ не появился, перейдите к проверке приложений.

2. Проверьте, что нужные приложения запущены на виртуальной машине

Сетевой интерфейс может быть исправен, но приложения и сервисы могут быть не запущены или работать на нестандартном порте.

Проверьте работу SSH:

  1. Подключитесь к консоли виртуальной машины и авторизуйтесь.

  2. Выполните команду:

    sudo systemctl status ssh

    По выводу команды определите, запущен ли сервис:

    • Active: active (running): сервис SSH запущен.
    • Active: inactive (dead): сервис SSH не запущен.
  3. В зависимости от статуса сервиса SSH выполните следующие действия:

    1. Определите, на каком порте работает сервис SSH:

      sudo cat /etc/ssh/sshd_config | grep -w Port

      В выводе будет содержаться номер порта:

      Port 22

      Если сервис работает на стандартном порте 22перейдите к проверке настроек файервола ВМ. В противном случае переходите к следующему шагу.

    2. Подключитесь, используя номер нестандартного порта. Например, если сервис SSH работает на порте 222:

      ssh -i /path/to/private_key_file username@192.0.2.22 -p 222
    3. Проверьте наличие доступа по SSH к виртуальной машине. Если доступ не появился, перейдите к проверке настроек файервола ВМ.

3. Проверьте настройки файервола виртуальной машины

Если на виртуальной машине настроен файервол (например, iptables, ufw, firewalld), то он может препятствовать подключению, даже если IP-адрес виртуальной машины корректный, а сервис SSH настроен и работает.

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

Чтобы проверить настройки файервола:

  1. Подключитесь к консоли виртуальной машины и авторизуйтесь.

  2. Отключите файервол:

    sudo ufw disable
  3. Проверьте наличие доступа по SSH к виртуальной машине.

    Если доступ появился, скорректируйте правила файервола и снова включите его.

    Если доступ не появился, снова включите файервол и проверьте настройки групп безопасности файервола VK Cloud.

Чтобы снова включить файервол:

  1. Подключитесь к консоли виртуальной машины и авторизуйтесь.

  2. Выполните команду:

    sudo ufw enable

4. Проверьте настройки групп безопасности файервола VK Cloud

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

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

Чтобы проверить настройки файервола:

  1. Перейдите в личный кабинет VK Cloud.

  2. Выберите проект, где находится нужная виртуальная машина.

  3. Перейдите в раздел Облачные вычисления → Виртуальные машины.

  4. Нажмите на имя нужной виртуальной машины.

  5. Перейдите на вкладку Сети.

  6. Раскройте меню нужного сетевого подключения и выберите пункт Редактировать подключение.

  7. В параметре Настройки Firewall:

    1. Удалите все выбранные группы безопасности.

    2. Выберите из выпадающего списка группы безопасности default и all («все разрешено»).

      Группа безопасности default разрешает любой исходящий трафик. Группа безопасности all разрешает любой входящий трафик.

  8. Нажмите кнопку Сохранить.

  9. Проверьте наличие доступа по SSH к виртуальной машине.

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

    Если доступ не появился, вернитесь к исходным настройкам файервола и обратитесь в техническую поддержку.

Чтобы снова настроить правила файервола:

  1. Перейдите в личный кабинет VK Cloud.

  2. Выберите проект, где находится нужная виртуальная машина.

  3. Перейдите в раздел Облачные вычисления → Виртуальные машины.

  4. Нажмите на имя нужной виртуальной машины.

  5. Перейдите на вкладку Сети.

  6. Раскройте меню нужного сетевого подключения и выберите пункт Редактировать подключение.

  7. В параметре Настройки Firewall:

    1. Удалите группу безопасности all.

    2. Выберите из выпадающего списка необходимые группы безопасности.

      Если выбранные группы безопасности не содержат правила, разрешающие исходящий трафик, выберите также группу безопасности default. Эта группа разрешает исходящий трафик. В противном случае у виртуальной машины не будет доступа в сеть.

5. Обратитесь в техническую поддержку

Если диагностика не помогла в решении проблемы, обратитесь в техническую поддержку, предоставив информацию, полученную при диагностике.