Я создаю интерфейс моста для своих виртуальных машин KVM:
ip link add name br0 type bridge
ip addr add 172.20.0.1/24 dev br0
ip link set dev br0 up
Создаю виртуальные машины KVM:
virt-install --name $VM_NAME1 --network=bridge:br0,mac=$VM_MAC1
virt-install --name $VM_NAME2 --network=bridge:br0,mac=$VM_MAC2
Теперь я хочу предоставить виртуальным машинам доступ в Интернет:
brctl addif enp3s0 br0
enp3s0 - мой основной интерфейс. Как только я запускаю эту команду, мой хост теряет свой IP и доступ к Интернету. Даже когда я даю ему IP, проблема сохраняется:
dhclient enp3s0
Ни хост, ни виртуальные машины не имеют доступа к Интернету.
Когда вы добавляете свой хост-контроллер Ethernet к мосту br0
(подключенный к виртуальной машине) вы фактически создаете два новых устройства в сети (два устройства с новыми MAC-адресами) вместо старого. В этом случае ваш мост и ваша виртуальная машина должны получить новый IP-адрес. Теперь сложность заключается в том, что ваш провайдер / хостинговая компания хочет, чтобы ваш MAC оставался таким же, как MAC вашего физического контроллера Ethernet. Когда вы включаете мост, ваш интернет-провайдер не может идентифицировать новые устройства, что приводит к отсутствию подключения к Интернету.
Вам нужен NAT, чтобы ваша виртуальная машина использовала IP-адрес хоста для доступа в Интернет. Вы можете настроить его с помощью следующих команд:
ip link add name br0 type bridge
ip addr add 172.20.0.1/24 dev br0
ip link set dev br0 up
sysctl -w net.ipv4.ip_forward=1
iptables --table nat --append POSTROUTING --out-interface enp3s0 -j MASQUERADE
iptables --insert FORWARD --in-interface br0 -j ACCEPT
После этого вы сможете получить доступ к Интернету со своих виртуальных машин (вам не нужно запускать brctl
)
Я подозреваю, что вы можете найти простейшее решение - не добавлять свою сетевую карту к мосту, а вместо этого использовать пересылку и маскировку.
Другими словами, сделайте что-нибудь вроде:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o enp3s0 -j MASQUERADE