LINUX.ORG.RU
ФорумAdmin

Настроить сеть на хосте KVM

 


0

2

Вечер добрый, комрады.

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

Дано: Хостовая машина, работает под управлением Ubuntu Server 16.04 Хост машина имеет один физический интерфейс смотрящий в локалку 10.10.80.150/24 и стек дополнительных IP (никак на момент установки не обозначенных 10.10.80.200-10.10.80.220). Во время установки был выбран KVM и автоматом подтянулись настройки моста.

Нужно: На хосте поднять виртуалку, которая бы работала на одном из IP стека *200-220, для определенности пусть будет *201.

После установки: Как выше написал, все настройки подтянулись автоматически, сеть везде есть, но стек нужных IP не задействован. Содержимое interfaces

auto enp1s0
iface enp1s0 inet static
address 10.10.80.150
netmask 255.255.255.0
gateway 10.10.80.1
dns-nameservers 10.10.80.1
Вывод ifconfig -a
enp1s0    Link encap:Ethernet  HWaddr d0:50:99:95:21:25  
          inet addr:10.10.80.150  Bcast:10.10.80.255  Mask:255.255.255.0
          inet6 addr: fe80::d250:99ff:fe95:2125/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5704 errors:0 dropped:0 overruns:0 frame:0
          TX packets:416 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:806268 (806.2 KB)  TX bytes:91228 (91.2 KB)

lo        Link encap:Локальная петля (Loopback)  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:160 errors:0 dropped:0 overruns:0 frame:0
          TX packets:160 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:11840 (11.8 KB)  TX bytes:11840 (11.8 KB)

virbr0    Link encap:Ethernet  HWaddr 52:54:00:c2:e4:d1  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:50 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2824 (2.8 KB)  TX bytes:2468 (2.4 KB)

virbr0-nic Link encap:Ethernet  HWaddr 52:54:00:c2:e4:d1  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

vnet0     Link encap:Ethernet  HWaddr fe:54:00:dd:f0:72  
          inet6 addr: fe80::fc54:ff:fedd:f072/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1569 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1762 (1.7 KB)  TX bytes:82392 (82.3 KB)

Собственно, вопрос, как правильно выполнить задачу? Для того чтобы задействовать нужные IP прописываю виртуальнй интерфейс

auto enp1s0:1
iface enp1s0:1 inet static
address 10.10.80.201
netmask 255.255.255.0
gateway 10.10.80.1
dns-nameservers 10.10.80.1

При перезапуске сети ловлю ошибку systemctl status networking.service

● networking.service - Raise network interfaces
   Loaded: loaded (/lib/systemd/system/networking.service; enabled; vendor preset: enabled)
  Drop-In: /run/systemd/generator/networking.service.d
           └─50-insserv.conf-$network.conf
   Active: failed (Result: exit-code) since Ср 2016-10-19 16:21:01 MSK; 43s ago
     Docs: man:interfaces(5)
  Process: 1639 ExecStop=/sbin/ifdown -a --read-environment (code=exited, status=0/SUCCESS)
  Process: 1718 ExecStart=/sbin/ifup -a --read-environment (code=exited, status=1/FAILURE)
  Process: 1710 ExecStartPre=/bin/sh -c [ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=
 Main PID: 1718 (code=exited, status=1/FAILURE)

окт 19 16:21:00 uto-d systemd[1]: Starting Raise network interfaces...
окт 19 16:21:01 uto-d ifup[1718]: RTNETLINK answers: File exists
окт 19 16:21:01 uto-d ifup[1718]: Failed to bring up enp1s0:1.
окт 19 16:21:01 uto-d systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE
окт 19 16:21:01 uto-d systemd[1]: Failed to start Raise network interfaces.
окт 19 16:21:01 uto-d systemd[1]: networking.service: Unit entered failed state.
окт 19 16:21:01 uto-d systemd[1]: networking.service: Failed with result 'exit-code'.

Но при этом работает почти все )) нужный ip 10.10.80.201 пингуется в сети, если на хостовой машине настроить iptables, то веб-сервер, работающий на виртуалке прекрасно отвечает на 80 порту во вне, на хостовой машине сеть полноценно пашет, а вот исходящие запросы с виртуалки (например ping ya.ru) - лежат. Роуты верные на ней, адреса резолвятся, но пинг не уходит.

Вывод ifconfig -a с добавленным виртуальным интерфейсом идентичен на 100% с добавлением последнего

enp1s0:1  Link encap:Ethernet  HWaddr d0:50:99:95:21:25  
          inet addr:10.10.80.201  Bcast:10.10.80.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

Помогите сделать «правильно». Спасибо.

все надо делать иначе.

во первых на хосте создать мост над enp1s0 и отдать айпи .150 ему, а не самому интерфейсу

во вторых прицепить VM к этому мосту

в третьих внутри самой гостевой ОС настроить айпи .201

все.

dyasny ★★★★★ ()
Ответ на: комментарий от dyasny

я, конечно, не силен в теме, но имхо приведенный вывод ifconfig говорит о том, что мост есть. И изначально писал что все зарабботало из коробки, вопрос только в том, как задействовать нужный IP. Могу добавить вот такой вывод brctl show

bridge name	bridge id		STP enabled	interfaces
virbr0		8000.525400c2e4d1	yes		virbr0-nic
							vnet0
Поднимается он судя по всему скриптом bridge из папки /etc/network/if-pre-up.d на уже прописанный в /etc/interfaces интерфейс. Вот содержимое на всякий случай
# You don't usually need to touch this file at all, the full configuration
# of the bridge can be done in a standard way on /etc/network/interfaces.

# Have a look at /usr/share/doc/bridge-utils/README.Debian if you want
# more info about the way on wich a bridge is set up on Debian.

if [ ! -x /sbin/brctl ]
then
  exit 0
fi

. /lib/bridge-utils/bridge-utils.sh

case "$IF_BRIDGE_PORTS" in
    "")
	exit 0
	;;
    none)
	INTERFACES=""
	;;
    *)
	INTERFACES="$IF_BRIDGE_PORTS"
	;;
esac

# Previous work (create the interface)
if [ "$MODE" = "start" ] && [ ! -d /sys/class/net/$IFACE ]; then
  brctl addbr $IFACE || exit 1
  if [ "$IF_BRIDGE_HW" ]; then
    ip link set dev $IFACE address $IF_BRIDGE_HW
  fi
# Wait for the ports to become available
  if [ "$IF_BRIDGE_WAITPORT" ]
  then
    set x $IF_BRIDGE_WAITPORT &&   
    shift &&
    WAIT="$1" &&
    shift &&
    WAITPORT="$@" &&
    if [ -z "$WAITPORT" ];then WAITPORT="$IF_BRIDGE_PORTS";fi &&
    STARTTIME=$(date +%s) &&
    NOTFOUND="true" &&
    /bin/echo -e "\nWaiting for a max of $WAIT seconds for $WAITPORT to become available." &&
    while [ "$(($(date +%s)-$STARTTIME))" -le "$WAIT" ] && [ -n "$NOTFOUND" ]
    do
      NOTFOUND=""
      for i in $WAITPORT
      do
        if ! grep -q "^[\ ]*$i:.*$" /proc/net/dev;then NOTFOUND="true";fi
      done
      if [ -n "$NOTFOUND" ];then sleep 1;fi
    done
  fi
# Previous work (stop the interface)
elif [ "$MODE" = "stop" ];  then
  ip link set dev $IFACE down || exit 1
fi

all_interfaces= &&
unset all_interfaces &&
bridge_parse_ports $INTERFACES | while read i
do
  for port in $i
  do
    # We attach and configure each port of the bridge
    if [ "$MODE" = "start" ] && [ ! -d /sys/class/net/$IFACE/brif/$port ]; then
      if [ -x /etc/network/if-pre-up.d/vlan ]; then
        env IFACE=$port /etc/network/if-pre-up.d/vlan
      fi
      if [ "$IF_BRIDGE_HW" ]
      then
        KVER="$(uname -r)"
        LKVER="${KVER#*.}"
        LKVER="${LKVER%%-*}"
        LKVER="${LKVER%%.*}"
        if [ "${KVER%%.*}" -lt 3 -o "${KVER%%.*}" -eq 3 -a "$LKVER" -lt 3 ]
        then
          ip link set dev $port address $IF_BRIDGE_HW
        fi
      fi
      if [ -f /proc/sys/net/ipv6/conf/$port/disable_ipv6 ]
      then
        echo 1 > /proc/sys/net/ipv6/conf/$port/disable_ipv6
      fi
      brctl addif $IFACE $port && ip link set dev $port up
    # We detach each port of the bridge
    elif [ "$MODE" = "stop" ] && [ -d /sys/class/net/$IFACE/brif/$port ];  then
      ip link set dev $port down && brctl delif $IFACE $port && \
        if [ -x /etc/network/if-post-down.d/vlan ]; then
          env IFACE=$port /etc/network/if-post-down.d/vlan
        fi
      if [ -f /proc/sys/net/ipv6/conf/$port/disable_ipv6 ]
      then
        echo 0 > /proc/sys/net/ipv6/conf/$port/disable_ipv6
      fi
    fi
  done
done

# We finish setting up the bridge
if [ "$MODE" = "start" ] ; then

  if [ "$IF_BRIDGE_AGEING" ]
  then
    brctl setageing $IFACE $IF_BRIDGE_AGEING
  fi

  if [ "$IF_BRIDGE_BRIDGEPRIO" ]
  then
    brctl setbridgeprio $IFACE $IF_BRIDGE_BRIDGEPRIO
  fi

  if [ "$IF_BRIDGE_GCINT" ]
  then
    brctl setgcint $IFACE $IF_BRIDGE_GCINT
  fi

  if [ "$IF_BRIDGE_HELLO" ]
  then
    brctl sethello $IFACE $IF_BRIDGE_HELLO
  fi

  if [ "$IF_BRIDGE_MAXAGE" ]
  then
    brctl setmaxage $IFACE $IF_BRIDGE_MAXAGE
  fi

  if [ "$IF_BRIDGE_PATHCOST" ]
  then
    brctl setpathcost $IFACE $IF_BRIDGE_PATHCOST
  fi

  if [ "$IF_BRIDGE_PORTPRIO" ]
  then
    brctl setportprio $IFACE $IF_BRIDGE_PORTPRIO
  fi

  if [ "$IF_BRIDGE_STP" ]
  then
    brctl stp $IFACE $IF_BRIDGE_STP
  fi

  if [ "$IF_BRIDGE_FD" ]
  then
    brctl setfd $IFACE $IF_BRIDGE_FD
  fi


  # We activate the bridge
  ip link set dev $IFACE up


  # Calculate the maximum time to wait for the bridge to be ready
  if [ "$IF_BRIDGE_MAXWAIT" ]
  then
    MAXWAIT=$IF_BRIDGE_MAXWAIT
  else
    MAXWAIT=$(brctl showstp $IFACE 2>/dev/null|sed -n 's/^.*forward delay[ \t]*\(.*\)\..*bridge forward delay[ \t]*\(.*\)\..*$/\1 \2/p')
    if [ "$MAXWAIT" ]
    then
      if [ ${MAXWAIT% *} -gt ${MAXWAIT#* } ]
      then
        MAXWAIT=$((2*(${MAXWAIT% *}+1)))
      else
        MAXWAIT=$((2*(${MAXWAIT#* }+1)))
      fi
    else
      if [ "$IF_BRIDGE_FD" ]
      then
        MAXWAIT=$((2*(${IF_BRIDGE_FD%.*}+1)))
      else
        MAXWAIT=32
      fi
      /bin/echo -e "\nWaiting $MAXWAIT seconds for $IFACE to get ready."
      sleep $MAXWAIT
      MAXWAIT=0
    fi
  fi


  # Wait for the bridge to be ready
  if [ "$MAXWAIT" != 0 ]
  then
    /bin/echo -e "\nWaiting for $IFACE to get ready (MAXWAIT is $MAXWAIT seconds)."

    unset BREADY
    unset TRANSITIONED
    COUNT=0

    # Use 0.1 delay if available
    sleep 0.1 2>/dev/null && MAXWAIT=$((MAXWAIT * 10))

    while [ ! "$BREADY" -a $COUNT -lt $MAXWAIT ]
    do
      sleep 0.1 2>/dev/null || sleep 1
      COUNT=$(($COUNT+1))
      BREADY=true
      for i in $(brctl showstp $IFACE|sed -n 's/^.*port id.*state[ \t]*\(.*\)$/\1/p')
      do
        if [ "$i" = "listening" -o "$i" = "learning" -o "$i" = "forwarding" -o "$i" = "blocking" ]
        then
          TRANSITIONED=true
        fi
        if [ "$i" != "forwarding" -a "$i" != "blocking" ] && [ ! "$TRANSITIONED" -o "$i" != "disabled" ]
        then
          unset BREADY
        fi
      done
    done

  fi

# Finally we destroy the interface
elif [ "$MODE" = "stop" ];  then

  brctl delbr $IFACE

fi

Конфиги виртуальной машины

    <interface type='bridge'>
      <mac address='52:54:00:dd:f0:72'/>
      <source bridge='virbr0'/>
      <target dev='vnet0'/>
      <model type='rtl8139'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

и virsh net-dumpxml default

<network>
  <name>default</name>
  <uuid>d0e58956-e98f-4326-87cf-ecdc85be2dc1</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:c2:e4:d1'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

P.S. на всякий случай попытался в рабочем варианте на виртуальной машине просто поменять в /etc/network/interfaces address с 192.168.122.11 на 10.10.80.201 - эффекта полный ноль, сети нет и указанный IP не пингуется из вне

очень надеюсь на помощь, второй день бьюсь (

robodal ()
Ответ на: комментарий от robodal

этот мост внутренний, он не прицеплен к внешнему интерфейсу. так что не надо спорить. создайте новый мост над интерфейсом, дайте ему адрес сервера и далее как я писал выше

dyasny ★★★★★ ()
Ответ на: комментарий от dyasny

И не пытался спорить, пытался разобраться )

Вот если бы я сразу понял или догадался, что KVM поднимает виртуальный мост внутренний, то вопросов бы вообще не было.. к сожалению ни в одной статье упоминания этого не встретил ((

Все получилось, большое спасибо за помощь.

robodal ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.