แขกและโฮสต์ไม่สามารถเห็นกันโดยใช้ linux-kvm และ macvtap


9

ฉันกำลังย้ายเครื่องเสมือน kvm จากโฮสต์เก่า (ทั้งฮาร์ดแวร์และระบบปฏิบัติการ) ไปยังเครื่องใหม่

สำหรับเครือข่าย virt ผู้จัดการเสนอฉันตัวเลือกใหม่: macvtap นี่เป็นทางเลือกที่ดีในการตั้งค่าบริดจ์บน eth0

ดังนั้นตอนนี้เกสต์ก็ไม่เป็นไรรับ IP จากเซิร์ฟเวอร์ DHCP เครือข่ายท้องถิ่นของฉันสามารถเข้าถึงอินเทอร์เน็ตได้ แขกยังเห็นเครื่องอื่น ๆ ในเครือข่ายท้องถิ่นฉันสามารถ ssh พวกเขา ฯลฯ

ปัญหาคือโฮสต์และแขกไม่เห็นกัน ฉันไม่สามารถติดต่อแขกจากโฮสต์โดยใช้ไอพีแขกไม่สามารถเข้าถึงโฮสต์จากแขกโดยใช้ไอพีโฮสต์ ไม่มี ping, ssh, http, ไม่มีอะไรเลย

นี่คือroute -nคำสั่งจากโฮสต์:

$ /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

(เอาท์พุทเดียวกันจากแขก)

ฉันอาจจะตั้งค่าอินเตอร์เฟซ tun / tap ใหม่เพื่อการสื่อสารระหว่างโฮสต์และแขก แต่มันดูเกินความจริงเล็กน้อย มีวิธีที่จะทำให้โฮสต์และแขกสื่อสาร?


Macvtap ไม่ใช่การแทนที่ที่ถูกต้องสำหรับการเชื่อมต่อ หากคุณต้องการเปลี่ยนเป็นบริดจ์ให้ดูที่ openvswitch
user186658

คำตอบ:


7

ฉันถามคำถามนี้เกี่ยวกับ IRC และปรากฏว่า macvtap

อัดฉีดทราฟฟิกของผู้เยี่ยมชมในสแต็กเครือข่ายต่ำเกินไปสำหรับสิ่งนั้น

วิธีแก้ปัญหาคือการเพิ่มเน็ตเวิร์กอินเตอร์เฟสสำหรับแขกและโฮสต์เพื่อสื่อสารหรืออยู่กับโซลูชันบริดจ์เดิม ...


1
นี่คือคำแนะนำทีละขั้นตอนเกี่ยวกับวิธีการสร้างโฮสต์ / ส่วนติดต่อผู้เยี่ยมชมโดยไม่ต้องปิดการใช้งานตัวจัดการเครือข่าย: wiki.libvirt.org/page/…
HDave

1
ฉันไม่สามารถรับคำแนะนำเหล่านั้นให้ทำงาน ...
HDave

4

virt-manager กล่าวอย่างชัดเจนว่า macvtap ไม่สามารถใช้งานได้สำหรับโฮสต์ไปยังการสื่อสารเครือข่ายแขกเมื่อคุณตั้งค่า ฉันเพิ่งเพิ่มอินเทอร์เฟซตาม nat ตัวที่สองตั้งค่าในแขกและใช้สิ่งนั้นเพื่อสื่อสารกับโฮสต์ของฉัน


1

วิธีแก้ไขคือกำหนดค่าอินเทอร์เฟซ macvlan บนไฮเปอร์ไวเซอร์ที่มีที่อยู่ IP เดียวกันกับอินเทอร์เฟซฮาร์ดแวร์จริง (สำคัญมาก) และกำหนดค่าการกำหนดเส้นทางบนโฮสต์เพื่อใช้งาน ใน Qemu / KVM ให้ใช้อินเตอร์เฟส macvtap บนฮาร์ดแวร์อินเตอร์เฟสตามปกติ

สำหรับ config ของฉัน (เครือข่าย 192.168.1.0/24, อินเตอร์เฟสฮาร์ดแวร์ p10p1 และเกตเวย์ 192.168.1.1) จะให้ (บนไฮเปอร์ไวเซอร์):

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

1

ดังที่ได้กล่าวไว้ในคำตอบก่อนหน้าวิธีแก้ปัญหานี้คือการเพิ่มอะแดปเตอร์เครือข่าย macvlan บนโฮสต์ อย่างไรก็ตามฉันรู้สึกว่าการเปลี่ยนเส้นทางไปยังอะแดปเตอร์ macvlan ด้วยตนเองนั้นค่อนข้างแฮ็คโดยเฉพาะอย่างยิ่งเนื่องจากฉันต้องการการสนับสนุน IPv6 และการตั้งค่าเส้นทางด้วยตนเองอาจกลายเป็นปัญหาเมื่อคำนำหน้าเปลี่ยนไป ดังนั้นนี่คือการกำหนดค่าของฉันซึ่งทำให้เคอร์เนลอยู่ในการควบคุมตารางเส้นทาง:

(การกำหนดค่าเฉพาะที่นี่คือเฉพาะ Debian และ Upstart แต่ขั้นตอนพื้นฐานควรทำงานกับ GNU / Linux ใด ๆ )

การสร้างอะแด็ปเตอร์ macvlan เมื่อบูต

ก่อนอื่นคุณต้องเลือกที่อยู่ MAC สำหรับอะแดปเตอร์ของคุณ คุณอาจจะสามารถใช้แบบสุ่มได้ แต่ฉันขอแนะนำให้คุณสร้างอะแดปเตอร์ macvlan ด้วยตนเองและใช้ MAC ด้วยวิธีนี้ MAC จำเป็นต้องปฏิบัติตามอนุสัญญาใด ๆ ที่อาจมี

แนะนำให้ตั้งค่า MAC แบบตายตัวเนื่องจากไม่เช่นนั้นจะไม่มีวิธีเช่นเซิร์ฟเวอร์ DHCP ที่จะจดจำเครื่องของคุณหลังจากรีบูตเครื่องและกำหนดที่อยู่ IP เดิมให้เหมือนเดิม

ดังนั้นสร้างอะแดปเตอร์และค้นหา 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
...

เลขฐานสิบหกที่ไฮไลต์คือที่อยู่ MAC ของคุณ

ตอนนี้คุณสร้างสคริปต์เริ่มต้น - ซึ่งจะต้องเรียกใช้ก่อนที่เครือข่ายจะ initalized - เพื่อสร้างอะแดปเตอร์ macvlan แต่ละการเริ่มต้น คำสั่งที่ต้องทำคือ:

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

ตัวอย่างสคริปต์พุ่งพรวดเริ่มต้นเพื่อจุดประสงค์นี้คือ:

start on starting networking

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

/etc/init/macvlan.confเพียงแค่ใส่นี้เช่น

การตั้งค่าการกำหนดค่าเครือข่าย

ใน/etc/network/interfacesตั้งค่าอะแดปเตอร์เครือข่ายทางกายภาพของคุณเป็นแบบแมนนวล (แต่ปล่อยให้มันอัตโนมัติ) และย้ายการกำหนดค่าก่อนหน้า (โดยทั่วไปคือ DHCP หรือที่อยู่ IP แบบคงที่) ไปยังอะแดปเตอร์ macvlan ของคุณ เช่น:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

ปิดใช้งาน IPv6 สำหรับฟิสิคัลอะแด็ปเตอร์

สุดท้ายคุณไม่ต้องการฟิสิคัลอะแด็ปเตอร์เพื่อรับที่อยู่ IP สำหรับการตั้งค่า IPv4 อะแดปเตอร์เป็นแบบแมนนวลจะป้องกันไม่ให้ได้รับที่อยู่ อย่างไรก็ตามฉันไม่พบการกำหนดค่าที่หยุดเคอร์เนลไม่ให้รับ / กำหนดที่อยู่ IPv6 สำหรับ / ไปยังอะแดปเตอร์ เมื่อใดก็ตามมันยังเพิ่มเส้นทางสำหรับพวกเขาซึ่งอาจทำให้เกิดปัญหา ดังนั้นวิธีที่ดีที่สุดคือปิดการใช้งาน IPv6 สำหรับฟิสิคัลอแด็ปเตอร์ คุณสามารถทำได้โดยเพิ่มบรรทัด

net.ipv6.conf.eth0.disable_ipv6=1

ถึง/etc/sysctl.confโดยสร้างไฟล์/etc/sysctl.d/ด้วยบรรทัดนี้หรือโดยการเพิ่ม

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

ในสคริปต์เริ่มต้นของคุณ

เมื่อคุณรีบูทเครื่องการสื่อสารจากโฮสต์ถึงแขกควรทำงานกับทั้ง IPv4 และ IPv6


โปรดระวังว่าหากคุณทำผิดพลาดในขณะที่ติดตั้งโฮสต์ของคุณอาจไม่สามารถเข้าถึงได้ผ่านเครือข่ายแม้หลังจากรีบูต ทำเช่นนี้ต่อเมื่อคุณมีการเข้าถึงเครื่องหรือการป้องกันอื่น ๆ อยู่ในสถานที่เพื่อให้คุณสามารถแก้ไขปัญหาที่อาจเกิดขึ้น


1

คุณต้องการที่จะจบลงด้วยสิ่งนี้:

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

โปรดทราบว่าคอลัมน์สุดท้ายมี "macvlan0" แทนที่จะเป็น "eth0"

เพื่อให้บรรลุนั้นคุณสามารถใช้คำสั่งเหล่านี้โดยสมมติว่า 192.168.0.42 เป็นที่อยู่ IP ของคุณ:

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

ส่วนใหญ่คล้ายกับโซลูชันของ npen หากคุณต้องการสคริปต์ที่ซับซ้อนยิ่งขึ้นดูหน้าเว็บของฉันเกี่ยวกับเรื่องนี้


อย่าลืมโหลดmacvlanโมดูล:modprobe macvlan
mdd

0

ฉันใช้สิ่งที่ Lazzaro เขียนไว้ใน Debian แต่ฉันต้องการเพิ่มบันทึกย่อ

ก่อนอื่นต้องตั้งค่าส่วนติดต่อผู้เยี่ยมชมเป็น "อุปกรณ์ต้นทาง" -> "อุปกรณ์โฮสต์ eth0: macvtap"; "โหมดแหล่งที่มา" -> " สะพาน "

ประการที่สองสคริปต์ init ที่คุณไม่ได้ทำงานให้ฉัน ( ดูเหมือนว่าอินเทอร์เฟซ macvlan0 ถูกสร้างขึ้นช้าเกินไปในระหว่างการเริ่มต้น ) ดังนั้นฉันจึงใช้สิ่งนี้:

nano /etc/init.d/macvlan

เปลี่ยน mac เป็นอันที่ได้รับมอบหมายเมื่อสร้างอินเตอร์เฟสครั้งแรก:

#!/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

บันทึกและตั้งค่าบิตเรียกใช้งาน:

chmod +x /etc/init.d/macvlan

และเพิ่มลิงก์ทั้งหมดสำหรับ init:

update-rc.d macvlan defaults
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.