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

Включение мостовых подключений с помощью одной сетевой карты с несколькими IP-адресами

У меня есть сервер с одной сетевой картой (eth1). Моему серверу назначено 5 общедоступных IP-адресов, и в настоящее время он настроен следующим образом (/etc/network/interfaces):

# The primary network interface
allow-hotplug eth1
iface eth1 inet static
    address xxx.yyy.zzz.130
    netmask 255.255.255.248
    network xxx.yyy.zzz.128
    broadcast xxx.yyy.zzz.135
    gateway xxx.yyy.zzz.129

iface eth1:0 inet static
    address xxx.yyy.zzz.131
    netmask 255.255.255.248

iface eth1:1 inet static
    address xxx.yyy.zzz.132
    netmask 255.255.255.248

iface eth1:2 inet static
    address xxx.yyy.zzz.133
    netmask 255.255.255.248

iface eth1:3 inet static
    address xxx.yyy.zzz.134
    netmask 255.255.255.248

Это работает отлично, однако я хотел добавить виртуальную машину KVM с мостовым подключением с общедоступным IP-адресом. xxx.yyy.zzz.131.

Если я сделаю это:

auto br0
iface br0 inet static
  bridge-ports eth1
  bridge_stp off
  bridge_fd 0
  bridge_maxwait 0
  address xxx.yyy.zzz.131
  netmask 255.255.255.248

затем только xxx.yyy.zzz.131 доступен. Ни один из других IP-адресов нет.

Если я изменю его на bridge-ports eth1:0 Я получаю сообщение об ошибке:

SIOCSIFFLAGS: Cannot assign requested address
RTNETLINK answers: File exists
Failed to bring up br0.

Если я прокомментирую другие разделы о eth1:0, помимо указанной выше ошибки, я также получаю Ignoring unknown interface eth1:0=eth10. в начале.

Как добавить мостовое устройство, если у меня только одна сетевая карта и несколько IP-адресов?

Вы можете использовать несколько способов использования общедоступного IP-адреса внутри виртуальной машины.

Первый способ - это то, что вы выбрали. В этом случае вы создаете мостовой интерфейс с eth1 как порт моста.

Ваш interfaces файл должен выглядеть примерно так.

iface br0 inet static
    bridge-ports eth1
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0
    address xxx.yyy.zzz.130
    netmask 255.255.255.248
    gateway xxx.yyy.zzz.129

iface br0:1 inet static
    address xxx.yyy.zzz.132
    netmask 255.255.255.248

iface br0:2 inet static
    address xxx.yyy.zzz.133
    netmask 255.255.255.248

iface br0:3 inet static
    address xxx.yyy.zzz.134
    netmask 255.255.255.248

Обратите внимание, xxx.yyy.zzz.131 не назначается на хосте. Так же broadcast и network варианты бесполезны, поэтому я их пропустил.

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

Другой способ - использовать функцию proxy-arp. Для этого вам не нужно менять файл интерфейсов. Вы просто назначаете общедоступный IP-адрес внутри виртуальной машины (как первичный или вторичный), на хосте добавляете маршрут к этому общедоступному IP-адресу и включаете функцию proxy-arp на eth1 интерфейс. Обратите внимание, этот общедоступный IP-адрес не должен назначаться на самом хосте, только внутри виртуальной машины. Также не забудьте сделать эти изменения постоянными (вы можете использовать post-up варианты в interfaces файл).

ip route add <public-ip> dev <virt-bridge-iface>
sysctl -w net.ipv4.conf.eth1.proxy_arp=1

У вас должен быть только IP-адрес для хозяин на главном мосту. IP-адреса для гостей должны быть назначены только для гостей.

Невозможно создать мостовую сеть для одного IP-адреса. Это нужно делать для всего сетевого интерфейса или не делать вообще. Если у вас только одна сетевая карта, единственный вариант - назначить все IP-адреса на хост-машине, а затем использовать брандмауэр (например, iptables) сделать NAT для гостевой ОС.

Эта статья есть сценарий, который сделает это автоматически при запуске / остановке гостевых ОС.