KVM Bridged Network ไม่ทำงาน


23

ฉันเพิ่งติดตั้ง KVM บน Ubuntu Server ตามคู่มือนี้: https://help.ubuntu.com/community/KVM/Installation

จากนั้นจัดเตรียมเครือข่าย bridged ดังแสดงในที่นี่: https://help.ubuntu.com/community/KVM/Networking

จากนั้นฉันสร้างเครื่องเสมือนด้วย virt-manager ฉันพยายามหลายครั้ง แต่แขกล้มเหลวในการเชื่อมต่อกับเครือข่าย! ความช่วยเหลือใด ๆ

ifconfig:

      br0       Link encap:Ethernet  HWaddr d0:27:88:b0:e4:38  
                inet addr:192.168.20.100  Bcast:192.168.20.255  Mask:255.255.255.0
                inet6 addr: fe80::d227:88ff:feb0:e438/64 Scope:Link
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:62 errors:0 dropped:0 overruns:0 frame:0
                TX packets:62 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0 
                RX bytes:10493 (10.4 KB)  TX bytes:8433 (8.4 KB)

      eth0      Link encap:Ethernet  HWaddr d0:27:88:b0:e4:38  
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:62 errors:0 dropped:0 overruns:0 frame:0
                TX packets:63 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000 
                RX bytes:11361 (11.3 KB)  TX bytes:8479 (8.4 KB)
                Interrupt:41 

      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:0 errors:0 dropped:0 overruns:0 frame:0
                TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0 
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

      virbr0    Link encap:Ethernet  HWaddr 5a:8c:57:95:af:3b  
                inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
                UP 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:0 
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

brctl แสดง:

 bridge name    bridge id      STP enabled    interfaces
 br0       8000.d02788b0e438   no        eth0
 virbr0         8000.000000000000   yes  

brctl showmacs br0:

 port no   mac addr       is local? ageing timer
   1  5c:d9:98:67:b6:28   no          48.33
   1  d0:27:88:b0:e4:38   yes          0.00
   1  e0:2a:82:f9:6c:09   no           0.00

เส้นทาง ip:

 default via 192.168.20.1 dev br0  metric 100 
 192.168.20.0/24 dev br0  proto kernel  scope link  src 192.168.20.100 
 192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1

* ในแขก *ฉันไม่สามารถคัดลอกวางข้อมูลจากแขกเพราะไม่สามารถ ssh ไม่ได้รับ ip จาก DHCP จะไม่ทำงานแม้หลังจากตั้งค่าด้วยตนเอง


ฉันขอแนะนำให้คุณให้ผลลัพธ์จากคำสั่งต่อไปนี้? บนโฮสต์: ifconfig, brctl show, และbrctl showmacs br0 ip routeในวันที่เข้าพัก: ifconfig, ip route, ping 8.8.8.8, และping <your internet router> traceroute 8.8.8.8ฉันไม่สามารถพูดได้ว่าฉันได้กำหนดค่า kvm ในแบบที่คุณมี แต่ฉันได้รับการเชื่อมต่อการทำงานโดยใช้kvmคำสั่ง ฉันต้องตัดการเชื่อมต่อแบบไร้สายดังนั้นโฮสต์ของฉันจะเชื่อมต่ออินเทอร์เน็ตและตามที่คุณยกมาบอกว่าคุณต้องเชื่อมต่ออินเทอร์เน็ตด้วยอีเธอร์เน็ต
John S Gruber

@JohnSGruber เพิ่งเพิ่มข้อมูลที่คุณร้องขอ แต่ฉันไม่สามารถคัดลอกวางข้อมูลจากแขกเพราะไม่สามารถ ssh ไป ไม่ได้รับ ip จาก DHCP จะไม่ทำงานแม้หลังจากตั้งค่าด้วยตนเอง
THpubs

ที่อยู่ MAC ที่คุณกำหนดให้กับแขกในbrctl showmacs br0รายการด้านบนหรือไม่
John S Gruber

ฉันไม่ได้เพิ่มแม็ด้วยตนเอง .. แต่แจ้งให้เราตรวจสอบแม็คมันได้ ..
THpubs

@JohnSGruber ไม่ฉันไม่เห็น MAC ที่นี่!
THpubs

คำตอบ:


22

รอบคัดเลือกโซน

สิ่งต่อไปนี้ใช้ได้กับฉันสำหรับ Ubuntu 12.04 คุณควรปิดการใช้งานไฟร์วอลล์ของคอมพิวเตอร์ของคุณในขณะที่คุณทดสอบสิ่งนี้เพื่อไม่ให้รบกวน

ไฟล์ / etc / default / qemu-kvm ควรถูกติดตั้งตั้งแต่แรก

คุณจะต้องติดตั้งบริดจ์ -emils qemu-kvmและlibvirt-bin ผู้ใช้ที่ใช้เครื่องเสมือนควรเพิ่มกลุ่ม libvirtdติดตั้ง bridge-utils ติดตั้ง qemu-kvmติดตั้ง libvirt-bin

ดูเหมือนว่าไม่จำเป็นต้องเพิ่มความสามารถในการ CAP_NET_ADMIN อีกต่อไป

การตั้งค่าเครือข่าย

โหมดเครือข่ายเริ่มต้นคือโหมดผู้ใช้หรือที่เรียกว่า SLIRP มันใช้สะพาน virbr0 ที่กำหนดไว้ล่วงหน้าซึ่งเป็น NAT ส่งไปยังคอมพิวเตอร์ของผู้เข้าพัก เส้นทาง NAT ใช้ ip_forwarding คุณลักษณะเคอร์เนลและiptables โหมดบริดจ์ใช้บริดจ์เสมือนในแขกที่เชื่อมต่อกับอีเธอร์เน็ต (ไม่ได้ติดตั้ง) และที่ทั้งโฮสต์และแขกมีอินเทอร์เฟซเครือข่าย

ไดอะแกรมต่อไปนี้อาจทำให้ความแตกต่างชัดเจนขึ้น:

ไดอะแกรมเครือข่าย

คุณสามารถดูว่าเครือข่ายผู้ใช้เริ่มต้นถูกกำหนดด้วย:

virsh net-dumpxml default

ฉันสามารถตั้งค่าโหมด bridged ด้วยวิธีการต่อไปนี้:

ใน / etc / network / interfaces (จากส่วนเชื่อมโยงของโพสต์ที่คุณพูดถึงในคำถามของคุณ):

แท้จริง
iface lo inet loopback
#auto eth0
#iface eth0 inet dhcp
auto eth0
คู่มือ iface eth0 inet
อัตโนมัติ br0
iface br0 inet dhcp
    bridge_ports eth0
    ปิด bridge_stp
    bridge_fd 0
    bridge_maxwait 0

Reboot; และตรวจสอบให้แน่ใจว่าเครือข่ายไร้สายไม่ทำงาน ตรวจสอบเส้นทาง IP ip routeเริ่มต้นด้วย ต้องใช้อินเตอร์เฟส br0

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

NB โดยทั่วไปคุณไม่สามารถใช้เครือข่ายไร้สายแทน eth0เนื่องจากพวกเขาไม่สามารถใช้ที่อยู่ MAC หลายแห่ง (ฉันอนุมานว่าพวกเขาต้องการเครือข่ายที่สองสำหรับบริดจ์)

เป็นทางเลือกที่คุณสามารถปิดการใช้อีเธอร์เน็ตและให้แน่ใจว่ามันไม่ได้มีที่อยู่ IP ip routeและว่าไม่มีเส้นทางเริ่มต้นการตั้งค่ากับ แล้ว:

 sudo ifconfig eth0 0.0.0.0 up
 sudo brctl addbr br0
 sudo brctl addif br0 eth0
 sudo ifconfig br0 up
 sudo dhclient br0 &

คุณสามารถระบุที่อยู่ IP แบบคงที่ได้ที่นี่รวมถึงการกำหนดเส้นทางเริ่มต้นและที่อยู่ DNS สำหรับตัวอย่างdhclientนี้ทำสิ่งนี้

นี่คือตารางเส้นทางของฉัน:

รายการเส้นทาง $ ip
เริ่มต้นผ่าน 192.168.1.1 dev br0 ตัวชี้วัด 100 
169.254.0.0/16 dev br0 การเชื่อมโยงขอบเขตตัวชี้วัด 1000 
192.168.1.0/24 dev br0 การเชื่อมโยงขอบเขตเคอร์เนลโปรโต src 192.168.1.45 
192.168.122.0/24 dev virbr0 การเชื่อมโยงขอบเขตเคอร์เนลโปรโต src 192.168.122.1

ใช้ kvm

ฉันสามารถบูทเครื่อง kvm bridged ด้วย:

 $ sudo kvm -name Quantal -m 1024 -hda foo.qcow2 --soundhw ac97 -device virtio-net,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0

-netdev tapทำให้พารามิเตอร์ sudo ต้องการ เมื่อ VM เริ่มทำงาน qemu-kvm จะรันคำสั่งต่อไปนี้:

ifconfig vnet0 0.0.0.0 ขึ้นไป
brctl addif brctl addif br0 vnet0

สิ่งนี้ทำโดย / etc / qemu-ifup

อินเตอร์เฟส vnet0 ของ VM ถูกเพิ่มเข้ากับ br0 bridge เนื่องจากเส้นทางเริ่มต้นด้านบนใช้อินเตอร์เฟสบริดจ์นั้น หากไม่มีส่วนต่อประสานการแตะแทนจะถูกเพิ่มไปยังส่วนต่อประสาน virbr0 เนื่องจากที่ไม่ได้เชื่อมต่อกับอินเทอร์เน็ต NAT จะถูกใช้เพื่อเชื่อมต่อแขกกับโฮสต์และอินเทอร์เน็ตในการทดลองของฉัน คุณสามารถนำ vnet0 ไปยังบริดจ์เฉพาะใน / etc / default / qemu-kvm การใช้ virt-manager ด้านล่างคุณสามารถกำหนดสะพานที่จะเชื่อมต่อได้อย่างชัดเจน

เนื่องจากคำสั่งข้างต้นที่ออกโดย qemu-kvm และ-netdev tap,id=tunnel,ifname=vnet0พารามิเตอร์เครื่องเสมือน vm เชื่อมต่อกับอุโมงค์ vnet0 และอุโมงค์เชื่อมต่อกับสะพาน br0

ตอนนี้ฉันสามารถ ssh เข้าสู่ VM ผู้เยี่ยมชมนี้จากคอมพิวเตอร์เครื่องอื่นบนเครือข่ายของฉัน

โฮสต์ของฉันifconfig(หมายเหตุอินเตอร์เฟส vnet0 ที่ปรากฏบนเครือข่ายของฉันเมื่อ VM กำลังทำงาน):

$ ifconfig
การเชื่อมโยง br0: Ethernet HWaddr 00: 1e: 33: 88: 07: e5  
          inet addr: 192.168.1.45 Bcast: 255.255.255.255 รูปแบบ: 255.255.255.0
          inet6 addr: fe80 :: 21e: 33ff: fe88: 7e5 / 64 ขอบเขต: ลิงก์
          ออกอากาศแบบมัลติคาสต์วิ่ง MTU: 1500 เมตริก: 1
          แพ็กเก็ต RX: ข้อผิดพลาด 6526: 0 ลดลง: 0 overruns: 0 เฟรม: 0
          แพ็กเก็ต TX: 7543 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 ผู้ให้บริการ: 0
          การชนกัน: 0 txqueuelen: 0 
          จำนวนไบต์: 2712940 (2.7 MB) TX ไบต์: 1071835 (1.0 MB)

eth0 ลิงก์ encap: อีเทอร์เน็ต HWaddr 00: 1e: 33: 88: 07: e5  
          ออกอากาศแบบมัลติคาสต์วิ่ง MTU: 1500 เมตริก: 1
          RX แพ็กเก็ต: 7181 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 เฟรม: 0
          แพ็คเก็ต TX: 7740 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 ผู้ให้บริการ: 0
          การชน: 0 txqueuelen: 1,000 
          จำนวนไบต์: 2974585 (2.9 MB) TX ไบต์: 1096580 (1.0 MB)
          การขัดจังหวะ: 43 ที่อยู่ฐาน: 0x6000 

lo Link encap: Local Loopback  
          inet addr: 127.0.0.1 รูปแบบ: 255.0.0.0
          inet6 addr: :: 1/128 ขอบเขต: โฮสต์
          การเรียกใช้ LOOPBACK RUNNING MTU: 16436 เมตริก: 1
          แพ็กเก็ต RX: 10 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 เฟรม: 0
          แพ็กเก็ต TX: 10 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 ผู้ให้บริการ: 0
          การชนกัน: 0 txqueuelen: 0 
          จำนวนไบต์: 664 (664.0 B) TX ไบต์: 664 (664.0 B)

vnet0 ลิงก์ encap: Ethernet HWaddr ca: 0c: 73: c3: bc: 45  
          inet6 addr: fe80 :: c80c: 73ff: fec3: bc45 / 64 ขอบเขต: ลิงก์
          ออกอากาศแบบมัลติคาสต์วิ่ง MTU: 1500 เมตริก: 1
          RX แพ็กเก็ต: 226 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 เฟรม: 0
          แพ็กเก็ต TX: 429 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 ผู้ให้บริการ: 0
          การชน: 0 txqueuelen: 500 
          จำนวนไบต์: 26919 (26.9 KB) TX ไบต์: 58929 (58.9 KB)

virbr0 ลิงก์ encap: อีเทอร์เน็ต HWaddr d6: 18: 22: db: ff: 93  
          inet addr: 192.168.122.1 Bcast: 192.168.122.255 รูปแบบ: 255.255.255.0
          ออกอากาศแบบมัลติคาสต์ MTU: 1500 เมตริก: 1
          แพ็กเก็ต RX: 0 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 เฟรม: 0
          แพ็กเก็ต TX: 0 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 ผู้ให้บริการ: 0
          การชนกัน: 0 txqueuelen: 0 
          จำนวนไบต์: 0 (0.0 B) TX ไบต์: 0 (0.0 B)

การกำหนดค่าบริดจ์ของฉันขณะใช้งาน VM:

แสดง $ brctl
บริดจ์ชื่อบริดจ์ id อินเตอร์เฟส STP ที่เปิดใช้งาน
br0 8000.001e338807e5 ไม่มี eth0
                                                        vnet0
virbr0 8000.000000000000 ใช่

โปรดทราบว่าทั้งอินเตอร์เฟส vnet0 ของเครื่องเสมือนและอินเตอร์เฟส eth0 นั้นเชื่อมต่อกับ br0 bridge

และ MAC บนอินเตอร์เฟส br0:

$ brctl showmacs br0
พอร์ตไม่มี mac addr อยู่ภายใน? เครื่องจับเวลา
  1 00: 05: 5d: cf: 64: 61 no 2.54
  1 00: 19: d2: 42: 5d: 3f no 36.76
  1 00: 19: df: da: af: 7c no 2.86
  1 00: 1e: 33: 88: 07: e5 ใช่ 0.00
  1 00: 60: 0f: e4: 17: d6 no 0.79
  2 52: 54: 00: 12: 34: 56 ไม่มี 0.80
  1 58: 6d: 8f: 17: 5b: c0 no 5.91
  1 c8: aa: 21: เป็น: 8d: 16 no 167.69
  2 ca: 0c: 73: c3: bc: 45 ใช่ 0.00

โปรดทราบว่าอินเทอร์เฟซ br0 เชื่อมต่อโฮสต์คอมพิวเตอร์ของฉันกับบริดจ์เดียวกันที่แขกใช้งาน

คุณสามารถตรวจสอบว่าคุณกำลัง bridged มากกว่า NAT traceroute 8.8.8.8ส่งไปยังเครือข่ายของคุณเองโดยใช้ หากโหนดแรกคือเราเตอร์เครือข่ายของคุณแทนที่จะเป็นที่อยู่ ip ของแขกเครือข่ายของคุณควรทำงานอย่างถูกต้อง

ดูเอกสารนี้

virt ผู้จัดการ

ให้แน่ใจว่าคุณได้ติดตั้งและvirt-manager แพคเกจคือการพึ่งพาแนะนำและนำมาใช้ในการกำหนดค่าเครือข่ายของระบบเมื่อสร้างหรือแก้ไขแขกผู้เข้าพักhalhalvirt-manager

ในขณะที่การกำหนด br0 บริดจ์ดังกล่าวข้างต้นฉันสร้างเครื่องเสมือนที่มี virt-manager ดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

ฉันสามารถไปที่เครือข่ายภายในบ้านของฉันและอินเทอร์เน็ตจากแขกรายนี้ได้โดยตรง ฉันยังสามารถ ssh จากคอมพิวเตอร์ Ubuntu อื่น ๆ (ไม่ใช่โฮสต์และไม่ใช่แขก) บนเครือข่ายในบ้านของฉัน

นี่คือkvmคำสั่งที่ใช้เวลานานมากโดย virt-manager (สำหรับการเปรียบเทียบกับ EApubs หรือใครก็ตามที่มีปัญหากับสิ่งนี้):

/ usr / bin / kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1, ซ็อกเก็ต = 1, แกน = 1, เธรด = 1, เธรด = 1 - ชื่อที่แม่นยำ - uuid f057a729-eda6-4b85-84dc-f100c9ae3789 - nodefconfig -nodefaults -chardev socket, id = charmonitor, path = / var / lib / libvirt / qemu / precision.monitor, เซิร์ฟเวอร์, nowait -mon chardev = charmonitor, id = จอภาพ, โหมด = control -rtc ฐาน = utc-no- ปิด -drive file = / media / natty / home / gruber / ubuntu-kvm / tmpW8gSGB.qcow2, ถ้า = none, id = drive-ide0-0-0, format = qcow2 -device ide-drive, bus = ide.0 , ยูนิต = 0, ไดรฟ์ = drive-ide0-0-0, id = ide0-0-0, bootindex = 1 -netdev tap, fd = 18, id = hostnet0 - อุปกรณ์ rtl8139, netdev = hostnet0, id = net0, mac = 52: 54: 00: 0e: da: 9b, บัส = pci.0, addr = 0x3 -chardev pty, id = charserial0 -device isa-serial, chardev = charserial0, id = serial0 -usb -vnc 127.0.0.1: 0 -vga cirrus -device intel-hda, id = sound0, bus = pci.0, addr = 0x4 -device hda-duplex, id = sound0-codec0, บัส = sound0.0,cad = 0 - อุปกรณ์ virtio-บอลลูน-pci, id = balloon0, รถบัส = pci.0, addr = 0x5

นี่คือส่วนเครือข่ายของคำอธิบายเครื่องเสมือนใน /etc/libvirt/qemu/quantal.xml

    <interface type='bridge'>
      <mac address='52:54:00:b0:8e:aa'/>
      <source bridge='br0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

ตามลิงค์นี้เพื่อประสิทธิภาพและความน่าเชื่อถือการตั้งค่ารุ่นอุปกรณ์เครือข่ายเป็นสิ่งที่ดีที่สุดvirtioคุณสามารถทำได้โดยการกดปุ่มiไปที่การตั้งค่า NIC และการตั้งค่า "รุ่นอุปกรณ์" virtio"เพื่อ คุณสามารถเพิ่มสิ่งนี้ลงใน XML ด้านบนได้โดยเพิ่มบรรทัด:

      <model type='virtio'/>

สรุป

ทั้งหมดนี้ใช้เวลา 12.04 คือ:

  1. การติดตั้ง virt-manager, bridge-utils, qemu-kvm และแพ็กเกจที่เกี่ยวข้อง
  2. ตรวจสอบให้แน่ใจว่าผู้ใช้แต่ละคนที่ต้องการใช้ kvm อยู่ในกลุ่ม libvirtd
  3. การกำหนด / etc / network / interfaces ดังกล่าว (ซึ่งตรงกับบทความที่ยกมา)
  4. รีบูตตรวจสอบให้แน่ใจว่าเสียบปลั๊กอีเธอร์เน็ตแล้วและไร้สาย (ถ้ามี) ปิดอยู่
  5. รัน kvm กับรูปภาพโดยตรงเช่น-device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0หรือสร้างเครื่องเสมือนที่มี virt-manager โดยระบุบริดจ์เครือข่าย br0 ภายใต้แผงขั้นตอนที่ 4-> ตัวเลือกขั้นสูง

ไม่จำเป็นต้องทำการเปลี่ยนแปลงใด ๆ กับระบบเครือข่ายความสามารถเทมเพลตหรือการกำหนดค่า

ในการแสดงบริการในแขกใหม่ของคุณกับอินเทอร์เน็ตคุณควร:

  1. จัดเตรียมและกำหนดค่าบริการไฟร์วอลล์ใด ๆ ที่คุณต้องการ
  2. กำหนดที่อยู่แบบคงที่ในการกำหนดค่าของผู้เยี่ยมชมหรือในบริการ DHCP ของคุณ
  3. หากคุณใช้เราเตอร์ NAT เปิดพอร์ตสำหรับบริการที่คุณกำลังนำผู้ใช้ไปยังที่อยู่ IP ของแขก

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

ดูhttps://help.ubuntu.com/community/KVM/Installation , https://help.ubuntu.com/community/KVM/Networkingและhttps://help.ubuntu.com/12.04/serverguide/libvirt HTML


สวัสดีฉันไม่มีการ์ดไร้สายในเครื่องนั้น เพียงอีเธอร์เน็ต :)
THpubs

ฉันเข้าใจว่าคุณไม่มีระบบไร้สาย - แต่คนอื่น ๆ อาจอ่านคำถามนี้ ฉันโพสต์หัวข้อ virt-manager เนื่องจากเป็นสิ่งที่คุณใช้ คุณระบุ Bridged เป็น br0 ในขั้นตอนที่ 4 ตัวเลือกขั้นสูงเมื่อสร้างเครื่องเสมือนหรือไม่? พารามิเตอร์เครือข่ายในคำสั่ง kvm ถูกเรียกทำงานโดย virt-manager จับคู่กับฉันหรือไม่? (คุณสามารถดูได้โดยเรียกใช้ps aux | grep kvm)
John S Gruber

สวัสดีเมื่อสร้างเครื่องเสมือนโดยใช้ virt manager ในตัวเลือกขั้นสูงฉันไม่เห็น eth0 และ br0
THpubs

นั่นอาจเป็นปัญหา - เป็นกุญแจสำคัญในการทำให้มันทำงานภายใต้ virt-manager คุณกำลังใช้งานเครื่องที่จะใช้โฮสต์ (และมี br0 ที่กำหนดไว้ในbrctl showคำถามของคุณหรือไม่) คุณใช้ Ubuntu รุ่นใด อาจเป็นความแตกต่าง เครื่องมือจัดการคุณธรรมรุ่นใด (เหมืองคือ 0.9.1-1ubuntu5.1)
John S Gruber

ฉันกำลังใช้งาน Ubuntu 12.04 และ virt-manager 0.9.1-1ubuntu5.1 ที่จริงแล้วฉันไม่ได้ติดตั้ง virt-manager ไว้ในโฮสต์ ฉันมีมันในเครื่องระยะไกลและฉันใช้มันเพื่อเชื่อมต่อกับโฮสต์ นั่นเป็นปัญหาที่ฉันมีอยู่เหรอ?
THpubs

6

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

ดู: https://bugs.launchpad.net/ubuntu/+source/ufw/+bug/573461

โดยเฉพาะในส่วนนี้: "ขั้นตอนสุดท้ายคือการปิดการใช้งาน netfilter บนสะพาน:

# 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

qemu-kvmเหล่านี้เป็นสองสคริปต์ที่ผมใช้ในการสร้างสะพานสำหรับ

ก่อนอื่นให้โฮสต์กลายเป็นเราเตอร์ IP

สคริปต์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:

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

สุดท้ายคุณสามารถเปิดใช้งานสคริปต์หลัก (ในฐานะผู้ใช้ปกติ):

#> create-qemu-bridged-tuntap.sh eth0
Set 'tap0' persistent and owned by uid 0
Enabling IP forward and setting up masquerade NAT on interface eth0

การรัน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งานคุณเพียงแค่ตั้งค่าแขกของคุณเพื่อใช้br0เป็นส่วนต่อประสานทางกายภาพ

virt ผู้จัดการ-br0-Nic

ข้างในguestคุณเพียงแค่ต้องให้ที่eth0อยู่ IP ของ192.168.1.95และทุกอย่างควรทำงานได้ดี

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

แม้ว่าคุณกำลังใช้บริดจ์เพื่อทำดูเหมือนว่าฉันกำลังสร้างสิ่งอำนวยความสะดวกการส่งต่อ NAT อย่างไรก็ตามหากคุณสามารถส่งต่อพอร์ตโฮสต์บางแห่งมันอาจจะทำในสิ่งที่ EApubs ต้องการ คำตอบที่น่าสนใจมากและมีประโยชน์มากโดยไม่คำนึงถึง
John S Gruber

ขอบคุณมันทำงานได้อย่างไร้ที่ติสำหรับจุดประสงค์ของฉัน แต่ตามความเป็นจริงแล้วฉันไม่ต้องการการเข้าถึงระยะไกลไปยัง VM ของฉันและฉันคิดว่า EApubs เพียงแค่พยายามที่จะเข้าถึงอินเทอร์เน็ตบน VM ของมัน
Avio

@Avio ไม่ใช่เพื่อนของฉันฉันต้องการเข้าถึงเครื่องของฉันจากระยะไกล ถ้าฉันตั้ง NAT และสร้าง VM มันทำงานได้
THpubs

มีเงื่อนงำที่นี่เพื่อปัญหาที่ผมมีการส่งต่อ IP ถูกปิดที่ถูกคือให้cat /proc/sys/net/ipv4/ip_forward 0เปิดใช้งานและยืนยันว่าจะแก้ไขปัญหาให้ฉันได้คำแนะนำในโพสต์นี้
Jake Cobb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.