Конфигурация сети виртуальной машины для маршрутизируемого режима на серверах Hetzner, OVH и Online.net противоречит интуиции, поскольку у вас есть сети, которые похожи на это:
Host IP: 192.168.0.2
Host Netmask: 255.255.255.0 (/24)
Host Gateway: 192.168.0.1
Guest IP: 10.0.0.1
Guest Netmask: 255.255.255.255 (/32)
Guest Gateway: 192.168.0.1
Guest MAC: 02:00:00:01:02:03
Приведенный выше пример является просто иллюстрацией, а не примерами IP-адресов, которые вы можете ожидать от любого из вышеупомянутых хостинг-провайдеров.
А? Какие? Как вы можете иметь подсеть только из одного IP-адреса (10.0.0.1/32
)? Там нет места для ворот! Почему шлюз находится в другой подсети (192.168.0.0/24
)?
Вот вопросы, которые заставляют Linux и Windows не проходить проверку работоспособности сети, поскольку сети для них не имеют смысла. Они думают, что ворота будут недоступны.
Hetzner, OVH и Online.net используют некоторые хитрости в сети, которые делают шлюз доступным в любом случае.
К счастью, как в Linux, так и в Windows вы можете переопределить проверки работоспособности и установить вышеуказанную конфигурацию интерфейса.
Возможные решения
Статическая адресация
Это проще всего сделать. Большая часть конфигурации, которую вам нужно сделать на хосте, - это создать мост.
хозяин
В Debian/Ubuntu, если ваш интерфейс управления / Интернет - это eth0
, вы можете отредактировать /etc/network/interfaces
чтобы иметь мост br0
следующим образом:
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.0.2 # Host IP
netmask 255.255.255.0 # Host Netmask
gateway 192.168.0.1 # Host Gateway
metric 0
bridge_ports eth0
bridge_stp on
bridge_fd 0
bridge_maxwait 0
Запустите sudo service networking restart
чтобы сетевая конфигурация начала действовать.
В RHEL/CentOS, если ваш интерфейс управления / Интернет - это eth0
, вы можете отредактировать /etc/sysconfig/network-scripts/ifcfg-eth0
для использования моста br0
следующим образом:
TYPE="Ethernet"
BOOTPROTO="none"
DEVICE="eth0"
ONBOOT="yes"
NM_CONTROLLED="no"
BRIDGE="br0"
Затем создайте новый файл /etc/sysconfig/network-scripts/ifcfg-br0
для настройки моста:
DEVICE="br0"
BOOTPROTO="static"
IPADDR="192.168.0.2" # Host IP
NETMASK="255.255.255.0" # Host Netmask
GATEWAY="192.168.0.1" # Host Gateway
ONBOOT="yes"
TYPE="Bridge"
NM_CONTROLLED="no"
Запустите sudo service network restart
чтобы сетевая конфигурация вступила в силу.
Если вы остаетесь подключенным к вашему серверу, поздравляю, у вас есть рабочий мост!
гипервизор
На чистом Xen xl (libxenlight) это все, что вам нужно написать для конфигурации виртуального интерфейса:
vif=[ 'mac=02:00:00:01:02:03,bridge=br0' ]
Обратите внимание, что 02:00:00:01:02:03
- это MAC-адрес, который Hetzner, OVH или Online.net предоставили вам для гостевой сети, а br0
- это мост, который мы только что настроили выше.
Если вы используете libvirt, внутри <devices>
добавьте этот интерфейс:
<interface type='bridge'>
<mac address='02:00:00:01:02:03'/>
<source bridge='br0'/>
</interface>
Как только вы настроите этот виртуальный интерфейс с правильным MAC-адресом и мостом, загрузите ваш гость и подключитесь к его консоли (xl console domU
, virsh console domU
или подключитесь к сеансу VNC гостя, если применимо).
гость
Здесь идет ужасная часть. Это зависит от операционной системы от того, как переопределить проверки работоспособности сети. Я расскажу о Debian/Ubuntu, RHEL/CentOS и Microsoft Windows NT.
В Debian/Ubuntu, если интерфейс называется eth0
, запишите это в /etc/network/interfaces
:
auto eth0
iface eth0 inet static
address 10.0.0.1 # Guest IP
broadcast 10.0.0.1 # Guest IP
netmask 255.255.255.255
gateway 192.168.0.1 # Guest Gateway, a.k.a. Host Gateway
post-up route add 192.168.0.1 dev eth0
post-up route add default gw 192.168.0.1
pre-down route del 192.168.0.1 dev eth0
pre-down route del default gw 192.168.0.1
Команды iproute2 post-up
и post-down
сообщают операционной системе в любом случае применить шлюз, даже если он находится в другой подсети.
После запуска sudo service networking restart
, вы должны быть в состоянии связаться с гостем через Guest IP 10.0.0.1
.
В RHEL/CentOS, если интерфейс называется eth0
, запишите это в /etc/sysconfig/network-scripts/ifcfg-eth0
:
DEVICE="eth0"
BOOTPROTO="none"
ONBOOT="yes"
USERCTL="no"
PEERDNS="yes"
TYPE="Ethernet"
NETMASK="255.255.255.255"
IPADDR="10.0.0.1" # Guest IP
GATEWAY="192.168.0.1" # Guest Gateway, a.k.a. Host Gateway
ARP="yes"
HWADDR="02:00:00:01:02:03" # Guest MAC
Затем напишите следующее в /etc/sysconfig/network-scripts/route-eth0
:
192.168.0.1 dev eth0
default via 192.168.0.1 dev eth0
Этот файл говорит iproute2 применить шлюз в любом случае, даже если он находится в другой подсети.
После запуска sudo service network restart
вы сможете подключиться к гостю через Guest IP 10.0.0.1
.
В Microsoft Windows NT перейдите в раздел "Сетевые подключения" на панели управления, щелкните интерфейс правой кнопкой мыши и выберите "Свойства". На вкладке "Сеть" выберите «Протокол Интернета версии 4 (TCP/IPv4)», затем нажмите "Свойства". Заполните поля, как показано:
Когда вы нажмете "ОК", вы получите это предупреждение:
Нажмите "ОК", чтобы подтвердить, что вы все равно хотите использовать шлюз.
Через несколько секунд вы сможете добраться до вашего гостя по гостевому IP 10.0.0.1
.
Динамическая адресация DHCP
К сожалению, это невозможно. Ни один DHCP-сервер не назначит вам 10.0.0.1/32
и сообщит вам, что шлюзом является 192.168.0.1
, даже если вы каким-либо образом перехватили DHCPDISCOVER гостя. И ни один DHCP-клиент не примет эту странную конфигурацию.
Вам нужна правильно структурированная сеть со шлюзом внутри вашей подсети для настройки DHCP. Единственный способ сделать это - создать частную сеть (172.16.0.0/12
) и выполнить преобразование сетевого адреса между частным IP-адресом вашего гостя (172.16.0.2
) и его общедоступным IP-адресом (10.0.0.1
) через шлюз (172.16.0.1
).
Частная сеть и NAT
Несмотря на то, что я проверил все вышеперечисленные шаги, я так и не смог создать индивидуальный / базовый NAT от частных IP-адресов до публичных IP-адресов. Частично причина в том, что для построения сетей нужно многое сделать.
Ваша сеть может выглядеть так:
Guest Public IP: 10.0.0.1
Guest Private IP: 172.16.0.2
Guest Netmask: 255.240.0.0 (/12)
Guest Gateway: 172.16.0.1
Затем узел будет пересылать трафик между гостевым общедоступным IP-адресом 10.0.0.1
и гостевым частным IP-адресом 172.16.0.2
через гостевой шлюз 172.16.0.1
.
OpenStack (который поддерживает Xen через libvirt) потенциально может обеспечить эту настройку NAT, а также DHCP-сервер в частной подсети через свою сетевую абстракцию, OpenStack Neutron, но сама настройка OpenStack - довольно сложная задача.
Мне удалось получить установку OpenStack с одним узлом и частные сети Neutron, работающие для экземпляров / гостей / серверов Nova, но я не мог понять, как преобразовывать частные IP-адреса (172.16.0.0/12
) в NAT для внешних сетевых IP-адресов 10.0.0.1/32
, 10.0.0.2/32
и т.д.), Поскольку OpenStack не поддерживает нестандартную сетевую структуру Хетцнера, OVH и Online.net для готовых виртуальных машин. Это остается нерешенной проблемой.
Дополнительные ресурсы