Tamu dan tuan rumah tidak dapat saling melihat menggunakan linux-kvm dan macvtap

8

Saya memigrasi mesin virtual kvm dari host lama (baik perangkat keras dan OS) ke yang baru.

Untuk jaringan, manajer virtusus mengusulkan saya opsi baru: macvtap . Ini tampak alternatif yang baik untuk membangun jembatan di eth0.

Jadi sekarang guest boot dengan baik, mendapat IP dari server DHCP jaringan lokal saya, dapat mencapai internet. Tamu juga melihat mesin lain di jaringan lokal, saya bisa ssh mereka, dll.

Masalahnya adalah bahwa tuan rumah dan tamu tidak saling bertemu. Saya tidak dapat menjangkau tamu dari host menggunakan IP tamu, saya juga tidak dapat mencapai host dari tamu menggunakan IP host. Tanpa ping, ssh, http, tidak ada.

Ini dia route -n perintah dari tuan rumah:

$ /sbin/route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

(output yang sama dari tamu).

Saya mungkin bisa mengatur antarmuka tun / tap baru yang didedikasikan untuk komunikasi antara tuan rumah dan tamu tetapi tampaknya sedikit berlebihan. Apakah ada cara untuk membuat tuan rumah dan tamu berkomunikasi?

ascobol
sumber
Macvtap bukan pengganti yang tepat untuk menjembatani. Jika Anda ingin beralih daripada menjembatani, lihat openvswitch.
user186658

Jawaban:

4

Saya mengajukan pertanyaan ini pada IRC dan tampaknya macvtap

menyuntikkan lalu lintas tamu ke tumpukan jaringan terlalu rendah untuk itu

Solusinya kemudian menambahkan antarmuka jaringan untuk tamu dan tuan rumah untuk berkomunikasi, atau tetap dengan solusi yang dijembatani lama ...

ascobol
sumber
1
Berikut ini adalah petunjuk langkah demi langkah tentang cara membuat antarmuka host / tamu tanpa harus menonaktifkan manajer jaringan: wiki.libvirt.org/page/…
HDave
1
Saya tidak bisa mendapatkan instruksi itu untuk bekerja ...
HDave
4

virt-manager mengatakan dengan jelas bahwa macvtap tidak berfungsi untuk komunikasi jaringan host ke guest ketika Anda mengaturnya. Saya hanya menambahkan antarmuka berbasis nat kedua, mengaturnya di tamu, dan menggunakannya untuk berkomunikasi dengan tuan rumah saya.

Journeyman Geek
sumber
1

Solusinya adalah mengkonfigurasi antarmuka macvlan pada hypervisor, dengan alamat IP yang sama dari antarmuka perangkat keras yang sebenarnya (sangat penting), dan untuk mengkonfigurasi routing pada host untuk menggunakannya. Di Qemu / KVM, gunakan antarmuka macvtap pada antarmuka perangkat keras seperti biasa.

Untuk konfigurasi saya (192.168.1.0/24 jaringan, antarmuka perangkat keras p10p1, dan gateway 192.168.1.1), ia memberikan (pada hypervisor):

ip link add link p10p1 address 00:19:d1:29:d2:58 macvlan0 type macvlan mode bridge
ip address add 192.168.1.100/24 dev macvlan0
ip link set dev macvlan0 up

ip route flush dev p10p1
ip route add default via 192.168.1.1 dev macvlan0 proto static
npen
sumber
1

Seperti yang telah disebutkan dalam jawaban sebelumnya, solusi untuk masalah ini adalah menambahkan adapter jaringan macvlan pada host. Namun, saya merasa bahwa secara manual rewiring rute ke adaptor macvlan agak berantakan, terutama karena saya ingin dukungan IPv6 dan secara manual mengatur rute mungkin menjadi masalah ketika awalan berubah. Jadi inilah konfigurasi saya yang membuat kernel mengendalikan tabel routing:

(Konfigurasi khusus di sini adalah khusus Debian dan pemula, tetapi langkah-langkah dasar harus bekerja pada GNU / Linux.)

Membuat adaptor macvlan saat boot

Pertama, Anda perlu memilih alamat MAC untuk adaptor Anda. Anda mungkin bisa hanya menggunakan yang acak, tetapi saya sarankan Anda secara manual membuat adaptor macvlan dan menggunakan MAC-nya. Dengan cara ini, MAC tunduk pada konvensi yang mungkin ada.

Menetapkan MAC tetap disarankan, karena jika tidak, tidak ada jalan untuk mis. server DHCP untuk mengenali mesin Anda setelah reboot dan menetapkannya alamat IP yang sama seperti sebelumnya.

Jadi buat adaptor dan cari MAC:

root@host:~# ip link add link eth0 macvlan0 type macvlan mode bridge
root@host:~# ip addr show dev macvlan0
#: macvlan0@eth0:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
    link/ether  12: 34: 56: 78: 90: ab  brd ff: ff: ff: ff: ff: ff
... 

Nomor heksadesimal yang disorot adalah alamat MAC Anda.

Sekarang Anda membuat skrip init - yang harus dijalankan sebelum jaringan diinisialisasi - untuk membuat adaptor macvlan setiap startup. Perintah untuk melakukan ini adalah:

ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge

Contoh skrip init pemula untuk tujuan ini adalah:

start on starting networking

script
    ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge
end script

Masukkan saja ini, mis. /etc/init/macvlan.conf.

Menyiapkan konfigurasi jaringan

Di /etc/network/interfaces, atur adapter jaringan fisik Anda menjadi manual (tetapi biarkan otomatis) dan pindahkan konfigurasi sebelumnya (biasanya DHCP atau alamat IP statis) ke adaptor macvlan Anda. Misalnya.:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

Menonaktifkan IPv6 untuk adaptor fisik

Terakhir, Anda tidak menginginkannya fisik adaptor untuk mendapatkan alamat IP. Untuk pengaturan IPv4, adaptor ke manual mencegahnya mendapatkan alamat. Namun, saya belum menemukan konfigurasi yang menghentikan kernel untuk mendapatkan / menetapkan alamat IPv6 untuk / ke adaptor. Ketika itu terjadi, itu juga menambahkan rute bagi mereka, yang dapat menyebabkan masalah. Jadi cara terbaik tampaknya menonaktifkan IPv6 untuk adaptor fisik. Anda dapat melakukan ini dengan menambahkan baris

net.ipv6.conf.eth0.disable_ipv6=1

untuk /etc/sysctl.conf, dengan membuat file dalam /etc/sysctl.d/ dengan baris ini, atau dengan menambahkan

sysctl -w net.ipv6.conf.eth0.disable_ipv6=1

ke skrip init Anda.

Ketika sekarang Anda me-reboot mesin Anda, berkomunikasi dari host ke tamu harus bekerja dengan IPv4 dan IPv6.


Perlu diketahui, bahwa jika Anda membuat kesalahan saat mengatur ini, host Anda dapat menjadi tidak terjangkau melalui jaringan bahkan setelah reboot. Lakukan ini hanya jika Anda memiliki akses fisik ke alat berat atau perlindungan lainnya sehingga Anda dapat memperbaiki masalah yang mungkin terjadi.

Lazzaro
sumber
1

Anda ingin berakhir dengan sesuatu seperti ini:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 macvlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 macvlan0

Perhatikan bahwa kolom terakhir berisi "macvlan0" bukan "eth0".

Untuk mencapai itu, Anda dapat menggunakan perintah ini, dengan asumsi 192.168.0.42 sebagai alamat IP Anda:

ip link add link eth0 macvlan0 type macvlan mode bridge
ip address add 192.168.0.42 dev macvlan0
ip link set dev macvlan0 up
ip route flush dev eth0
ip route add default via 192.168.0.1

Paling mirip dengan solusi npen. Jika Anda ingin skrip yang lebih canggih, lihat halaman web tentang subjek ini.

Evert Mouw
sumber
Jangan lupa memuat macvlan modul: modprobe macvlan
mdd
0

Saya menggunakan apa yang ditulis Lazzaro di Debian, tetapi saya ingin menambahkan beberapa catatan.

Pertama-tama, kebutuhan antarmuka tamu diatur ke "Perangkat sumber" - & gt; "Perangkat host eth0: macvtap"; "Mode sumber" - & gt; " Jembatan ".

Kedua, skrip init yang belum Anda gunakan untuk saya ( tampaknya antarmuka macvlan0 dibuat terlambat saat startup ), jadi saya menggunakan ini:

nano /etc/init.d/macvlan

Ubah mac ke yang ditetapkan saat antarmuka pertama kali dibuat:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          macvlan
# Required-Start:    $local_fs
# Required-Stop:     
# Default-Start:     S
# Default-Stop:      
# Short-Description: Set up macvlan
# Description:       This script sets up the macvlan interface
#                    before it can be used by networking.
# X-Start-Before:    networking
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh


do_start () {
        ip link add link eth0 address 00:11:22:aa:bb:cc macvlan0 type macvlan mode bridge
###      REPLACE MAC ON EACH HOST ->  ^^ ^^ ^^ ^^ ^^ ^^
}

case "$1" in
  start|"")
        do_start
        ;;
  *)
        echo "Sorry, this only sets up the macvlan interface." >&2
        exit 3
        ;;
esac

Simpan dan atur bit eksekusi:

chmod +x /etc/init.d/macvlan

dan tambahkan semua tautan untuk init:

update-rc.d macvlan defaults
Nick Name
sumber