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

Доступ к гостевой ВМ через дополнительный публичный IP

У меня выделенный сервер CentOS (Hetzner):
IP: aa.bb.cc.16
Шлюз: aa.bb.cc.1
Маска сети: 255.255.255.255

и дополнительный IP (гостевая виртуальная машина (libvirt) с установленным Debian):
IP: aa.bb.cc.61
Шлюз: aa.bb.cc.1
Маска сети: 255.255.255.192

Я настроил маршрутизируемую конфигурацию с помощью документации Hetzner (https://wiki.hetzner.de/index.php/Netzkonfiguration_CentOS/en#Routed_.28brouter.29).

Конфигурация хоста:
кошка /etc/sysctl.conf

net.ipv4.conf.all.rp_filter=1  
net.ipv4.icmp_echo_ignore_broadcasts=1  
net.ipv4.ip_forward=1  
net.ipv6.conf.all.forwarding=1  
net.ipv4.conf.default.proxy_arp=1  
net.ipv4.conf.all.send_redirects=0  
net.ipv4.conf.eth0.send_redirects=0  
net.ipv4.conf.br0.send_redirects=0  
net.ipv4.conf.default.send_redirects=0  
net.bridge.bridge-nf-call-ip6tables = 0  
net.bridge.bridge-nf-call-iptables = 0  
net.bridge.bridge-nf-call-arptables = 0  

кошка / и т. д. / sysconfig / сетевые скрипты / ifcfg-eth0

DEVICE=eth0
ONBOOT=yes
HWADDR=XX:XX:XX:XX:XX:XX
BOOTPROTO=none
IPADDR=aa.bb.cc.16
NETMASK=255.255.255.255
SCOPE="peer aa.bb.cc.1"
IPV6INIT=yes
IPV6ADDR=2a01:4f8:yyy:yyyy::2/128
IPV6_DEFAULTGW=fe80::1
IPV6_DEFAULTDEV=eth0

кошка / и т. д. / sysconfig / сетевые сценарии / ifcfg-br0

DEVICE=br0
ONBOOT=yes
TYPE="Bridge"
BOOTPROTO=static
IPADDR=aa.bb.cc.16
NETMASK=255.255.255.255
IPV6INIT=yes
IPV6ADDR=2a01:4f8:yyy:yyyy::2/64
STP=off
DELAY=0

кошка / и т. д. / sysconfig / сетевые сценарии / маршрут-br0

ADDRESS0=aa.bb.cc.61
NETMASK0=255.255.255.255

Гостевая конфигурация:
кот / и т.д. / сеть / интерфейсы

auto lo
iface lo inet loopback

auto eth0
    iface eth0 inet static
    address aa.bb.cc.61
    netmask 255.255.255.255
    pointopoint aa.bb.cc.16
    gateway aa.bb.cc.16
    dns-nameservers 212.133.98.98 212.133.99.99 212.133.100.100

iface eth0 inet6 static
    address 2a01:4f8:yyy:yyyy::4
    netmask 64
    address 2a01:4f8:yyy:yyyy::2

Для доступа в Интернет с гостевой виртуальной машины в Интернет я добавил правило:

iptables -t nat -A POSTROUTING -o eth0 -s aa.bb.cc.61 -j SNAT --to-source aa.bb.cc.16

Вопрос: Возможен доступ из Интернета к гостевой ВМ через гостевой IP-адрес aa.bb.cc.61 в маршрутизированном режиме? Когда я пингую извне (интернет) на aa.bb.cc.61 Я получаю сообщение «Истекло время ожидания запроса». Но aa.bb.cc.16 (хост) пингуется нормально. Какое правило я должен добавить?

Спасибо.

Вот рабочее решение:

кошка / и т. д. / sysconfig / сетевые скрипты / ifcfg-eth0

DEVICE=eth0
ONBOOT=yes
HWADDR=XX:XX:XX:XX:XX:XX
BOOTPROTO=none
IPADDR=aa.bb.cc.16
NETMASK=255.255.255.255
SCOPE="peer aa.bb.cc.1"
BRIDGE=br0

кошка / и т. д. / sysconfig / сетевые сценарии / ifcfg-br0

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=aa.bb.cc.16
NETMASK=255.255.255.255
SCOPE="peer  aa.bb.cc.1"
ONBOOT=yes
DELAY=0

mv / и т. д. / sysconfig / сетевые сценарии / маршрут-eth0 / и т. д. / sysconfig / сетевые сценарии / маршрут-br0 кошка кошка / и т. д. / sysconfig / сетевые сценарии / маршрут-br0

### Hetzner Online GmbH - installimage
# routing for eth0
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=aa.bb.cc.1

Гостевая конфигурация:
кот / и т.д. / сеть / интерфейсы

auto lo
iface lo inet loopback

auto eth0
    iface eth0 inet static
    address aa.bb.cc.61
    netmask 255.255.255.255
    pointopoint aa.bb.cc.16
    gateway aa.bb.cc.16
    dns-nameservers 212.133.98.98 212.133.99.99 212.133.100.100
    hwaddress ether 00:01:02:ab:cd:de # MAC Address for additional IP

Во-первых, необходимо прояснить несколько вещей.

В руководстве, которое вы используете, упоминаются «режим маршрутизатора» и «мостовой режим».

Описанный режим роутера почти полностью бессмыслен. Он включает в себя создание пустого моста «только для хоста», подключение к нему виртуальной машины и последующую маршрутизацию трафика IP-уровня от этого моста к исходящему интерфейсу. Это игнорирует тот факт, что libvirt может создать свой собственный виртуальный интерфейс NAT (с дополнительной маршрутизацией, DHCP и DNS) и подключать к нему интерфейсы виртуальных машин. Фактически, libvirt создает и активирует эту сеть по умолчанию. Это называется сетью "по умолчанию".

В вашем случае у вас есть две подсети (которые, как я предполагаю, находятся в отдельных доменах уровня 2 - как это было бы почти во всех ситуациях). Один адрес будет использоваться для доступа к вашему гипервизору «aa.bb.cc.16 / 32» (это недопустимая подсеть - подробнее об этом позже). Этот адрес можно разместить непосредственно в интерфейсе.

И тогда у вас есть второй IP-адрес в другой подсети (aa.bb.cc.61 / 26). Этот адрес должен находиться на интерфейсе виртуальной машины в гостевой системе. Это можно сделать напрямую с помощью моста, и хотя опубликованное вами руководство изначально предлагает плохие решения для «режима маршрутизации», предлагаемая конфигурация для напрямую используемого моста на самом деле является правильным способом работы. Однако он также предлагает совершенно неправильную конфигурацию.

Следующая сетевая конфигурация будет работать для указанного моста, если вы обновите значения, чтобы отразить свой сценарий:

# /etc/sysconfig/network-scripts/ifcfg-eth0
# device: eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
BRIDGE=br0

# /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE="Bridge"
BOOTPROTO=static
ONBOOT=yes

Как только это будет сделано, используйте этот мост как устройство для подключения вашей сетевой карты виртуальной машины. При необходимости вы можете указать IP-адрес на самом мосту, чтобы обеспечить связь между хостом и гостем. Однако это будет в вашей подсети, к которой вы предъявляете иск за публичный доступ. Если вам действительно нужна связь между хостом и гостем, я бы порекомендовал частный домен уровня 2 либо через интерфейс NAT «по умолчанию», либо через пустой мост с частным IP-пространством как на хосте, так и на гостевой (что создаст всего два сетевых адаптера на ВМ).

В качестве примечания: сетевая маска, которую вы опубликовали для своего IP-адреса гипервизора (255.255.255.255), составляет 32 бита. Это не позволит использовать один адрес в его сети, и я предполагаю, что это просто опечатка. Если это не опечатка, вам нужно использовать адресное пространство, которое фактически позволит хосту, даже если это всего лишь 31-битная сетевая маска.

Это касается вещей в общем смысле. Надеюсь, этой информации достаточно, чтобы вы приняли решение и правильно все настроили.