Неработающая сеть KVM не работает

Настоящее рабочее решение находится здесь https://bbs.archlinux.org/viewtopic.php?id=129872, а затем htop или mc работает по-прежнему!

1
задан 14 September 2012 в 17:41

2 ответа

Это два сценария, которые я использую для создания моста для qemu-kvm.

Сначала позвольте хосту стать IP-маршрутизатором.

Script ip-router.sh:

#!/bin/bash

internetinterface="eth0"

username=`whoami`

if [ "x$username" != "xroot" ] ; then

    echo    
    echo "You must be root in order to run this script..."
    echo    

    exit    

fi  

if [ "x$1" != "x" ] ; then
    internetinterface="$1"
fi  

if [ "x$1" == "xdel" ] || [ "x$2" == "xdel" ] ; then
    disable="1"
else
    disable="0"
fi  

if [ "$disable" == "0" ] ; then
    echo "Enabling IP forward and setting up masquerade NAT on interface $internetinterface"

    echo 1 > /proc/sys/net/ipv4/ip_forward

    iptables -t nat -A POSTROUTING -o $internetinterface -j MASQUERADE
else
    echo "Disable IP forward and setting down masquerade NAT on interface $internetinterface"

    echo 0 > /proc/sys/net/ipv4/ip_forward

    iptables -t nat -D POSTROUTING -o $internetinterface -j MASQUERADE
fi  

Затем создайте интерфейс tun-tap и bridge с вашим интерфейсом по умолчанию (обычно с подключением к Интернету).

Сценарий create-qemu-bridged-tuntap.sh: [!d4 ]

#!/bin/bash

bridgename=br0
tapinterface=tap0
outinterface=eth1

if [ "x$1" != "x" ] ; then
    outinterface="$1"
fi  

ifaces=`awk -F: '{print $1}' /proc/net/dev | tail -n +3`
iffound="0"

for i in $ifaces
do  
    if [ "$outinterface" == "$i" ] ; then
            iffound="1"
    fi  
done

if [ "$iffound" == "0" ] ; then
    echo
    echo "Can't find the output interface."
    echo
    exit 1
fi  

outifaceip=`ifconfig | grep -A1 $outinterface | tail -1 | awk -F: '{print $2}' | awk '{print $1}'`
outifaceiptokens=`echo $outifaceip | awk -F \. '{print NF}'`

if [ "$outifaceiptokens" != "4" ] ;  then
    echo
    echo "The selected output interface $outinterface doesn't seem to have a valid IP address."
    echo
    exit 1
fi  

hostaddress="192.168.1.1"
guestaddress="192.168.1.95"

sudo tunctl -t $tapinterface

sudo brctl addbr $bridgename
sudo brctl addif $bridgename $tapinterface

sudo ip link set $bridgename up
sudo ip addr add $hostaddress/24 dev $bridgename

sudo route add -host $guestaddress dev $bridgename
sudo parprouted eth1 $bridgename

sudo ~/scripts/ip-router.sh $outinterface

Я ежедневно использую эти скрипты, поэтому они должны хорошо работать и для вас. Вам нужно будет установить какой-то пакет, чтобы все это работало. С помощью:

dlocate `which COMMAND`

вы можете видеть, какой пакет требуется для COMMAND. Например, чтобы увидеть, какой пакет требуется для brctl, просто запустите:

dlocate `which brctl`

, и у вас будет:

bridge-utils: /sbin/brctl

Используя тот же подход для всех команды в этих сценариях, вы должны (по крайней мере) запустить эту командную строку aptitude:

sudo aptitude install dlocate iproute parprouted iptables uml-utilities bridge-utils net-tools

Наконец, вы можете запустить основной скрипт (как обычный пользователь):

Запустив ip addr, вы увидите интерфейс br0 с IP-адресом 192.168.1.1, как указано внутри скрипта create-qemu-bridged-tuntap.sh:

#> ip addr
8: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 36:76:ee:d6:63:b2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 scope global br0

Это host address, как видно по guest. И наоборот, гость будет иметь IP-адрес 192.168.1.95 (опять же, это можно легко изменить внутри основного скрипта).

Теперь, используя virt-manager, вам просто нужно настроить гостевой nic для использования br0 в качестве физического интерфейса.

Внутри guest вам просто нужно указать eth0 IP-адрес 192.168.1.95, и все должно работать нормально. [ ! d15]

Slackware13:~> ifconfig 
eth0      Link encap:Ethernet  HWaddr 52:54:00:F7:6A:78  
          inet addr:192.168.1.95  Bcast:192.168.1.255  Mask:255.255.255.0
3
ответ дан 25 May 2018 в 07:15
  • 1
    Хотя вы используете мост для этого, мне кажется, что вы создаете объект перенаправления NAT. Тем не менее, если вы можете переносить некоторые хост-порты, возможно, он будет делать то, что хочет EApubs. Очень интересный и очень полезный ответ безотносительно. – John S Gruber 14 September 2012 в 19:24
  • 2
    Спасибо, он работает безупречно для моих целей. Но, по сути, мне не нужен удаленный доступ к моей виртуальной машине, и я думал, что EApubs просто пытается получить доступ к Интернету на своей виртуальной машине. – Avio 14 September 2012 в 19:59
  • 3
    @Avio Нет, мой друг, мне нужен удаленный доступ к моей машине. Если я устанавливаю NAT и создаю VM, он работает. – THpubs 14 September 2012 в 20:02
  • 4
    Здесь есть ключ к проблеме, в которой была отключена пересылка IP, то есть cat /proc/sys/net/ipv4/ip_forward дал 0. Включив его и сохранив его, я выяснил эту проблему для меня, инструкций в этом сообщении . – Jake Cobb 29 October 2015 в 22:59

Если поведение, которое вы видите, является хостом, может получить доступ к гостю, и гость может получить доступ к хосту, но гость не может получить доступ к другим машинам в сети или наоборот. Вероятно, брандмауэр хоста блокирует доступ. [ ! d0]

См. https://bugs.launchpad.net/ubuntu/+source/ufw/+bug/573461

В частности, этот раздел: «Последний шаг - отключить netfilter on мост:

# cat >> /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
EOF
3
ответ дан 25 May 2018 в 07:15

Другие вопросы по тегам:

Похожие вопросы: