У меня есть сервер с одной сетевой картой (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 для гостевой ОС.
Эта статья есть сценарий, который сделает это автоматически при запуске / остановке гостевых ОС.