Inhaltsverzeichnis

Virtualisierung Netzwerk-Bridge

Die Definition einer Netzwerk-Bridge ist zur Kommunikation der Gast-Systeme mit z.B. dem Internet eine Möglichkeit dies zu realisieren.
Die Definition einer Netzwerk-Bridge kann auch nur zur Kommunikation der Gast-Systeme - untereinander konfiguriert werden.

:!: WICHTIG - Die Definition einer virtuellen Bridge virbr0 und einer Bridge br0 sollte NICHT verwechselt werden !!!

Nachfolgende Schritte definieren eine Bridge br0 als zusätzliches Netzwerkinterface auf dem Host-System.
Nachfolgende Schritte definieren eine virtuelle Bridge virbr0 als zusätzliches virtuelles Netzwerkinterface auf dem Host-System.

Die Neuanlage eines Bridge br0 Netzwerkinterfaces erfolgt wie die Konfiguration einer physischen Netzwerkkarte, oder dem loopback-Interface im Konfigurationsverzeichnis:

Die Neuanlage eines virtuellen Brdige virbr0 Netzwerkinterfaces erfolgt bereits bei der Installation der Virtualisierungsumgebung im Konfigurationsverzeichnis:

Ab hier werden zur Ausführung nachfolgender Befehle root-Rechte benötigt. Um der Benutzer root zu werden, melden Sie sich bitte als root-Benutzer am System an, oder wechseln mit nachfolgendem Befehl zum Benutzer root:

$ su -
Password:

Physikalisches Interface

Nachfolgende Änderungen müssen an dem physikalischen Interface - hier in diesem Beispiel - eth0 durchgeführt werden, wodurch die Konfigurationsdatei

wie nachfolgend gezeigt, angepasst werden muss:

...
BRIDGE=br0
...

Die komplette Konfigurationsdatei /etc/sysconfig/network-scripts/ifcfg-eth0 sieht dann in etwa wie nachfolgend dargestellt aus:

# NM_CONTROLLED="yes"
DEVICE=eth0
HWADDR=00:64:32:16:08:8c
ONBOOT=yes
BRIDGE=br0

Bridge Interface: br0

:!: HINWEIS - es soll keine IP-Adresse via DHCP vergeben werden, sondern eine feste IP-Adresse verwendet werden!!!

Host/Gast geteilte Verbindung

:!: HINWEIS - Es soll ermöglicht werden, dass das Host-System und alle Gast-System sich z.B. die Internet-Verbindung teilen können und sowohl der

Host Definitionen

Um eine Bridge br0 anzulegen, wird ebenfalls im Verzeichnis /etc/sysconfig/network-scripts/ nachfolgende Konfigurationsdatei unter Zuhilfenahme des vi-Editors NEU erzeugt:

# vi /etc/sysconfig/network-scripts/ifcfg-br0

welche in etwa nachfolgend dargestellten Inhalt haben sollte:

DEVICE=br0
HWADDR=00:64:32:16:08:8C
ONBOOT=yes
IPADDR=192.168.0.5
BOOTPROTO=none
NETMASK=255.255.255.240
TYPE=Bridge
GATEWAY=192.168.0.1
DNS1=192.168.0.1
IPV6INIT=no
USERCTL=no
DELAY=0

:!: WICHTIG - Ein Neustart der Netzwerkverbindungen ist erforderlich !!!

Der Befehl zum Neustart der Netzwerkverbindungen lautete wie nachfolgend dargestellt:

# service network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:                                [  OK  ]
Bringing up interface br0:                                 [  OK  ]

:!: WICHTIG - Ein Neustart des libvirtd (Daemon) ist erforderlich !!!

# service libvirtd restart
Stopping libvirtd daemon:                                  [  OK  ]
Starting libvirtd daemon:                                  [  OK  ]

Zur Überprüfung, ob eine Bridge br0 erfolgreich im Host-System angelegt wurde, können nachfolgend dargestellte Befehle genutzt werden:

# ifconfig
br0       Link encap:Ethernet  HWaddr 00:64:32:16:08:8C  
          inet addr:192.168.0.5  Bcast:192.168.0.15  Mask:255.255.255.240
          inet6 addr: fe80::225:90ff:fe25:c48c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:249 errors:0 dropped:0 overruns:0 frame:0
          TX packets:177 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:21734 (21.2 KiB)  TX bytes:28444 (27.7 KiB)

eth0      Link encap:Ethernet  HWaddr 00:64:32:16:08:8C  
          inet6 addr: fe80::225:90ff:fe25:c48c/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:88489 errors:0 dropped:0 overruns:0 frame:0
          TX packets:99568 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:87181470 (83.1 MiB)  TX bytes:88791181 (84.6 MiB)
          Memory:fe9e0000-fea00000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:34397 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34397 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:163885800 (156.2 MiB)  TX bytes:163885800 (156.2 MiB)

virbr0    Link encap:Ethernet  HWaddr 26:64:32:16:08:0B  
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:4423 (4.3 KiB)

und

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.00259025c48c       no              eth0
virbr0          8000.000000000000       yes

Gast Definitionen

In dieser Konfiguration wird davon ausgegangen, dass ein Gast-System wie unter nachfolgendem Link beschrieben, angelegt wurde:

Das Wesentliche bei der oben genannten Anlage eines Gast-Systems, ist hier die Definition der Netzwerkkarte, welche mit dem virt-manager bei der Erstellung des Gast-Systems durchgeführt wurden. Diese sollte wie auf nachfolgendem Bild dargestellt konfiguriert worden sein:

New VM - Schritt 5 - Advanced options - Netzwerkkarte

:!: WICHTIG - Die Netzwerkkarte MUSS als [Host device eth0 (Bridge 'br0')] definiert worden sein!!!

Die Konfigurationsdatei /etc/sysconfig/network-scripts/ifcfg-eth0 sieht dann in etwa wie nachfolgend dargestellt aus:

DEVICE=eth0
HWADDR=52:54:00:b6:10:9a
ONBOOT=yes
IPADDR=192.168.0.6
BOOTPROTO=none
NETMASK=255.255.255.240
TYPE=Ethernet
GATEWAY=192.168.0.1
DNS1=192.168.0.1
IPV6INIT=no
USERCTL=no

Zum Abschluss müssen, ausgehend davon, dass der NetworkManager NICHT genutzt wird, die Netzwerkkarten Definitionen neu eingelesen, bzw. das Netzwerk neu gestartet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# service network restart
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:                                [  OK  ]

Anschließend kann mit nachfolgendem Befehl überprüft werden, ob eine Verbindung zum Gateway und dadurch auch ins Internet möglich ist:

# ping -c 3 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.375 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.602 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.588 ms

--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.375/0.521/0.602/0.107 ms

Nur Gast Verbindung

:!: HINWEIS - Es soll ermöglicht werden, dass das Host-System NICHT direkt die Internet-Verbindung nutzen kann, sondern NUR alle Gast-Systeme die Internet-Verbindung nutzen können

Host Definitionen

Um eine Bridge br0 anzulegen, wird ebenfalls im Verzeichnis /etc/sysconfig/network-scripts/ nachfolgende Konfigurationsdatei unter Zuhilfenahme des vi-Editors NEU erzeugt:

# vi /etc/sysconfig/network-scripts/ifcfg-br0

welche in etwa nachfolgend dargestellten Inhalt haben sollte:

DEVICE=br0
HWADDR=00:64:32:16:08:8C
ONBOOT=yes
BOOTPROTO=none
TYPE=Bridge
IPV6INIT=no
USERCTL=no
DELAY=0

:!: HINWEIS - Die Bridge br0 hat hier KEINE IP-Adresse!!!

:!: WICHTIG - Ein Neustart der Netzwerkverbindungen ist erforderlich !!!

Der Befehl zum Neustart der Netzwerkverbindungen lautete wie nachfolgend dargestellt:

# service network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:                                [  OK  ]
Bringing up interface br0:                                 [  OK  ]

:!: WICHTIG - Ein Neustart des libvirtd (Daemon) ist erforderlich !!!

# service libvirtd restart
Stopping libvirtd daemon:                                  [  OK  ]
Starting libvirtd daemon:                                  [  OK  ]

Zur Überprüfung, ob eine Bridge br0 erfolgreich im Host-System angelegt wurde, können nachfolgend dargestellte Befehle genutzt werden:

# ifconfig
br0       Link encap:Ethernet  HWaddr 00:64:32:16:08:8C  
          inet6 addr: fe80::225:90ff:fe25:c48c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:249 errors:0 dropped:0 overruns:0 frame:0
          TX packets:177 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:21734 (21.2 KiB)  TX bytes:28444 (27.7 KiB)

eth0      Link encap:Ethernet  HWaddr 00:64:32:16:08:8C  
          inet6 addr: fe80::225:90ff:fe25:c48c/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:88489 errors:0 dropped:0 overruns:0 frame:0
          TX packets:99568 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:87181470 (83.1 MiB)  TX bytes:88791181 (84.6 MiB)
          Memory:fe9e0000-fea00000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:34397 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34397 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:163885800 (156.2 MiB)  TX bytes:163885800 (156.2 MiB)

virbr0    Link encap:Ethernet  HWaddr 26:64:32:16:08:0B  
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:4423 (4.3 KiB)

und

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.00259025c48c       no              eth0
virbr0          8000.000000000000       yes

Gast Definitionen

In dieser Konfiguration wird davon ausgegangen, dass ein Gast-System wie unter nachfolgendem Link beschrieben, angelegt wurde:

Das Wesentliche bei der oben genannten Anlage eines Gast-Systems, ist hier die Definition der Netzwerkkarte, welche mit dem virt-manager bei der Erstellung des Gast-Systems durchgeführt wurden. Diese sollte wie auf nachfolgendem Bild dargestellt konfiguriert worden sein:

New VM - Schritt 5 - Advanced options - Netzwerkkarte

:!: WICHTIG - Die Netzwerkkarte MUSS als [Host device eth0 (Bridge 'br0')] definiert worden sein!!!

Die Konfigurationsdatei /etc/sysconfig/network-scripts/ifcfg-eth0 sieht dann in etwa wie nachfolgend dargestellt aus:

DEVICE=eth0
HWADDR=52:54:00:b6:10:9a
ONBOOT=yes
IPADDR=192.168.0.6
BOOTPROTO=none
NETMASK=255.255.255.240
TYPE=Ethernet
GATEWAY=192.168.0.1
DNS1=192.168.0.1
IPV6INIT=no
USERCTL=no

Zum Abschluss müssen, ausgehend davon, dass der NetworkManager NICHT genutzt wird, die Netzwerkkarten Definitionen neu eingelesen, bzw. das Netzwerk neu gestartet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# service network restart
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:                                [  OK  ]

Anschließend kann mit nachfolgendem Befehl überprüft werden, ob eine Verbindung zum Gateway und dadurch auch ins Internet möglich ist:

# ping -c 3 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.375 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.602 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.588 ms

--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.375/0.521/0.602/0.107 ms

Virtuelles Interface

Nachfolgende Änderungen können an dem virtuellen Interface - hier in diesem Beispiel - virbr0 durch Ausführen des Befehls

# virsh net-edit dmz
Network default XML configuration edited. 

durchgeführt werden, wodurch die komplette Konfigurationsdatei

wie nachfolgend gezeigt, aussieht:

<network>
  <name>dmz</name>
  <uuid>ef1d3d1e-a8a1-3179-d418-799d7131f79f</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <ip address='192.168.1.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.1.2' end='192.168.1.254' />
    </dhcp>
  </ip>
</network>

:!: WICHTIG - Durch die automatische Anlage eines virtuellen Interfaces durch den libvirtd, werden auch z.B. iptables Firewall-Regeln automatisch beim starten des libvirtd hinzugefügt, bzw. beim stoppen des libvirtd entfernt!!!

:!: HINWEIS - Falls Dieses Verhalten NICHT gewünscht sein sollte, bleibt nur die Möglichkeit, auf die automatische Anlage eines virtuellen Interfaces durch den libvirtd, zu verzichten!

Bridge Interface: virbr0

:!: HINWEIS - es soll keine IP-Adresse via DHCP vergeben werden, sondern eine feste IP-Adresse verwendet werden!!!

:!: WICHTIG - Grundsätzlich sind keine Veränderungen an dem virtuellen Interface virbr0 durchzuführen.

Host/Gast/Gast Verbindung

Eine Verbindung zwischen dem

kann mit nachfolgender Konfiguration einer Netzwerkkarte, wie unter nachfolgendem Link dargestellt,

realisiert werden.

Die eigentliche Konfiguration der Netzwerkkarte des Gast-Systems, hier am Beispiel einer Netzwerkinterfaces eth1, in der Konfigurationsdatei

könnte dann wie nachfolgend gezeigt aussehen:

# NM_CONTROLLED=yes
DEVICE=eth1
HWADDR=52:54:00:fa:64:e9
ONBOOT=yes
IPADDR=192.168.1.10
BOOTPROTO=none
NETMASK=255.255.255.0
TYPE=Ethernet
GATEWAY=192.168.1.10
DNS1=192.168.1.10
IPV6INIT=no
USERCTL=no

:!: WICHTIG - Ein Neustart der Netzwerkverbindungen ist erforderlich !!!

Der Befehl zum Neustart der Netzwerkverbindungen lautete wie nachfolgend dargestellt:

# service network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:                                [  OK  ]
Bringing up interface eth1:                                [  OK  ]

Anschließend kann mit nachfolgendem Befehl überprüft werden, ob eine Verbindung zum z.B. Host-System möglich ist:

# ping -c 3 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.365 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.601 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.558 ms

--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.363/0.511/0.592/0.103 ms

Gast-System als Gateway

:!: WICHTIG - Diese Einstellung ist NUR auf dem GAST-SYSTEM, welches als GATEWAY fungieren soll, zu aktivieren!!!

Das nachfolgend beschriebene Masquerading, beschreibt die Nutzung eines Gast-System anstelle des Wirt-System, um als Gateway für das virtuelle Netzwerkinterface virbr0 zu fungieren.

Nochmal zum deutlicheren Verständnis,

IP-Forwarding

Damit verschiedene Gast-Systeme für Netzübergreifende Kommunikation z.B. Internet, einen spezielles Gast-System als Gateway nutzen können, muss die nachfolgend genannte Konfigurationsdatei

wie nachstehend beschrieben geändert werden:

VON - KEIN Masquerading auf dem Gateway (nur relevanter Ausschnitt):

# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.
 
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
...

AUF - Aktives Masquerading auf dem Gateway (nur relevanter Ausschnitt):

# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1
...

Firewall-Regeln

Eine Anpassung der Firewall-Regeln muss ebenfalls erfolgen, da sonst keine Verbindung eines Gast-Systems über das Gast-System, welches als Gateway fungieren soll möglich ist, muss die nachfolgend genannte Konfigurationsdatei

wie nachstehend beschrieben, geändert werden:

VON - STANDARD - Vorher iptables Regelwerk:

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

AUF - MASQUERADING - Nachher - iptables Regelwerk:

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth+ -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -o eth+ -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Der Unterschied liegt einmal darin, das NAT betrieben werden muss, was nachfolgender Teil der iptables-Regeln aussagt (nur relevanter Ausschnitt):

...
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth+ -j MASQUERADE
...

und das die Möglichkeit die iptables-Kette/CHAIN - FORWARD - für die Gast-Systeme, welche nicht als Gateway fungieren, nutzbar zu machen, was in nachfolgenden iptables-Regeln beschrieben ist (nur relevanter Ausschnitt):

...
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -o eth+ -j ACCEPT
...

:!: WICHTIG - Es muss eine Neustart des entsprechenden Gast-Systems, welches als Gateway fungieren soll, durchgeführt werden!!!