Назад | Перейти на главную страницу

Почему я теряю подключение к сети для виртуальной машины за пределами / 24?

У меня есть несколько виртуальных машин (Ubuntu Server 14.04), размещенных на одном реальном сервере (Ubuntu Server 14.04 с KVM). Количество виртуальных машин растет, и скоро у меня их будет более 254.

Тестировать,

  1. Я изменился в /etc/network/interfaces реального сервера маска сети из 255.255.255.0 к 255.255.254.0. IP-адрес реального сервера 192.168.1.30.

  2. Я проделал аналогичную операцию с virsh net-edit default, который изменил маску сети virbr0 к 255.255.254.0.

  3. Я изменил сетевую маску коммутатора на 255.255.254.0 также.

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

    auto eth0
    iface eth0 inet static
    address 192.168.2.35
    netmask 255.255.254.0
    network 192.168.1.0
    broadcast 192.168.2.255
    gateway 192.168.1.1
    dns-nameservers 192.168.1.13
    dns-search example.com
    

Это текущее состояние:

  1. Я не могу пинговать 192.168.2.35 с реального сервера: он просто застрял на «PING 192.168.2.35 (192.168.2.35) 56 (84) байтов данных». При остановке (Ctrl + C) он жалуется: «143 пакета передано, 0 получено, 100% потеря пакетов, время 142134 мс».

  2. Виртуальная машина 192.168.2.35 не может ничего пинговать (ни коммутатор, ни реальный сервер, ни google.com), выдает ошибку «connect: Network is unreachable» для первых двух или «ping: unknown host google.com» для последнего.

  3. Виртуальная машина может пинговать сама себя.

Что не так с моей конфигурацией?

Я до сих пор не понимаю, почему / 22 вместо / 23

Потому что вы неправильно рассчитали свои подсети и пытаетесь использовать IP-адреса из двух разных подсетей.

Или, другими словами, если вы используете маску / 23 бит, ваш начальный адрес для диапазона должен быть первым адресом для этого диапазона. 192.168.1.1 не является начальным адресом для любой сети, описываемой 23-битной маской, потому что именно так работает математика.

С 23-битной маской допустимые сети следующие.

$ ipcalc 192.168.0.0/23
Address:   192.168.0.0          11000000.10101000.0000000 0.00000000
Netmask:   255.255.254.0 = 23   11111111.11111111.1111111 0.00000000
Wildcard:  0.0.1.255            00000000.00000000.0000000 1.11111111
=>
Network:   192.168.0.0/23       11000000.10101000.0000000 0.00000000
HostMin:   192.168.0.1          11000000.10101000.0000000 0.00000001
HostMax:   192.168.1.254        11000000.10101000.0000000 1.11111110
Broadcast: 192.168.1.255        11000000.10101000.0000000 1.11111111
Hosts/Net: 510

$ ipcalc 192.168.2.0/23
Address:   192.168.2.0          11000000.10101000.0000001 0.00000000
Netmask:   255.255.254.0 = 23   11111111.11111111.1111111 0.00000000
Wildcard:  0.0.1.255            00000000.00000000.0000000 1.11111111
=>
Network:   192.168.2.0/23       11000000.10101000.0000001 0.00000000
HostMin:   192.168.2.1          11000000.10101000.0000001 0.00000001
HostMax:   192.168.3.254        11000000.10101000.0000001 1.11111110
Broadcast: 192.168.3.255        11000000.10101000.0000001 1.11111111
Hosts/Net: 510

Хотя в конфигурации вашего интерфейса у вас есть address 192.168.2.35, и gateway 192.168.1.1. Учитывая эту маску, ваш шлюз и адрес находятся в совершенно разных подсетях. Конечно, настройки вашего широковещательного и сетевого адреса также неверны.

Если вы используете 22-битную маску, вы получите диапазон, включающий 192.168.1.x и 192.168.2.x. Имейте в виду, что ваша трансляция и значения сети по-прежнему неверны, их также необходимо исправить.

$ ipcalc 192.168.2.0/22
Address:   192.168.2.0          11000000.10101000.000000 10.00000000
Netmask:   255.255.252.0 = 22   11111111.11111111.111111 00.00000000
Wildcard:  0.0.3.255            00000000.00000000.000000 11.11111111
=>
Network:   192.168.0.0/22       11000000.10101000.000000 00.00000000
HostMin:   192.168.0.1          11000000.10101000.000000 00.00000001
HostMax:   192.168.3.254        11000000.10101000.000000 11.11111110
Broadcast: 192.168.3.255        11000000.10101000.000000 11.11111111
Hosts/Net: 1022