Port Forwarding dari Host ke Guest dengan libvirt 0.8.3 Menggunakan KVM di Ubuntu

14

Tuan rumah memiliki IP eksternal tunggal yang tersedia, jadi saya mengatur tamu KVM saya dengan NAT.

Bagaimana cara mengatur penerusan port untuk meneruskan beberapa permintaan dari luar ke tamu?

Saya tidak dapat menemukan dokumentasi tentang ini. Jawaban terdekat mungkin adalah jawaban ini , tetapi kemudian disebutkan juga bahwa ada cara yang lebih mudah untuk melakukan ini di libvirt 0.8.3. Adakah yang tahu cara terkini untuk melakukan ini?

wei
sumber
eksternal - maksud Anda IP internet? atau hanya LAN Anda (eksternal ke VM)? Bisakah Anda mengalokasikan alamat eksternal itu ke VM Anda untuk mengatur jaringan yang dijembatani?
Seni Shayderov
Saya hanya bisa mendapatkan satu alamat IP Internet, itu sebabnya saya tidak menggunakan mode jaringan yang dijembatani.
wei

Jawaban:

12

Berikut adalah cara yang lebih baik untuk mengatur penerusan port, menggunakan skrip kait ( sumber ).

Dalam /etc/libvirt/hooks/qemu:

#!/bin/sh

GUEST_NAME=
HOST_PORT=
GUEST_IPADDR=
GUEST_PORT=

if [ "$1" = "$GUEST_NAME" ]; then
  if [ "$2" = start ]; then
    iptables -t nat -A PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -I FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  elif [ "$2" = stopped ]; then
    iptables -t nat -D PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -D FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  fi
fi

Anda harus mengatur empat variabel di bagian atas agar sesuai dengan pengaturan libvirt Anda.

Anda perlu me-restart libvirt-bin, yang di ubuntu dilakukan dengan:

sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'

maka Anda perlu me-restart tamu. Di Ubuntu, Anda perlu menyesuaikan /etc/apparmor.d/usr.sbin.libvirtduntuk memungkinkan skrip kait dijalankan:

Di samping

/usr/sbin/* PUx,

menambahkan

/etc/libvirt/hooks/* PUx,

Kemudian muat ulang apparmor:

sudo service apparmor reload

Mungkin ada cara untuk melakukan konfigurasi otomatis $GUEST_IPADDRmenggunakan virsh / dumpxml / iface-dumpxml, tapi saya belum menemukannya. Atau, IP dapat diatur secara statis di jaringan xml: dokumentasi .

Sejauh yang saya tahu, filter jaringan hanya dapat digunakan untuk membatasi apa yang terjadi pada jaringan virtual, dan mereka tidak berguna untuk penerusan porta.

Tobu
sumber
1
Trusty memiliki baris /etc/libvirt/hooks/** rmix,dalam file konfigurasi apparmor secara default, dan tampaknya memiliki efek yang sama. Saya dapat menjalankan skrip tanpa mengubah konfigurasi apparmor.
Amir Ali Akbari
2

Saya dalam situasi yang sama. Saya memiliki Windows Server yang berjalan di KVM di jaringan NATed pribadi yang terhubung pada host melalui antarmuka virbr0. Saya ingin mengakses VM melalui desktop jarak jauh. Jadi saya harus meneruskan lalu lintas ke port 3389 (RDP) ke port VM 3389. Saya telah mencapai ini dengan beberapa aturan iptable.

/ sbin / iptables -t nat -A PREROUTING -p tcp -d HOST-IP --port 3389 -j DNAT - ke tujuan VM-IP: 3389

/ sbin / iptables -SAYA MAJU -m state -d VM-NET / 24 --state BARU, TERKAIT, DIDIRIKAN -j MENERIMA

HOST-IP, VM-IP, dan VM-NET harus diadopsi tentu saja. Namun mengacaukan iptables dan libvirt itu sulit. Saat ini saya sedang mencari solusi untuk mendapatkan akses internet di VM saya yang telah hilang karena mengacaukan aturan iptable :-(

spa
sumber
Saya tahu ini berumur beberapa tahun tetapi jawaban ini berhasil untuk saya. Terima kasih!
mttdbrd
1

Saya percaya bahwa jawaban yang Anda referensi masih menunjukkan aturan iptables yang sesuai. Namun, sekarang Anda bisa menggunakan kait skrip untuk membuat dan menghancurkan aturan ketika mesin virtual dimulai dan dihentikan. Seperti kata Isaac dalam jawaban sebelumnya, ada juga filter jaringan di libvirt saat ini, tetapi saya tidak yakin bagaimana atau bahkan jika mereka dapat digunakan untuk membuka port untuk tamu NATed.

sciurus
sumber
0

bagaimana pengaturan jaringan tamu? jika sudah dijembatani, yang perlu Anda lakukan hanyalah meneruskan port ke IP tamu. Jika tamu Anda berada di belakang NAT lain, satu libvirt diatur, maka itu menjadi rumit

tetapi bagaimanapun, di sini Anda hanya memperlakukan VM seperti yang Anda lakukan pada mesin fisik

dyasny
sumber
Saya kira saya tidak mengatakannya dengan jelas. Tuan rumah tidak dalam NAT, ia memiliki alamat IP eksternal. Sayangnya, jaringan tamu berada di belakang NAT yang didirikan oleh libvirt.
wei
ah, maka itu masalah lain. pada dasarnya libvirt mengelola sendiri solusi NAT-nya, yang dapat diedit.
dyasny
ya, itu yang saya diberitahu, itu bisa diedit. Tapi saya tidak dapat menemukan referensi tentang itu, file konfigurasi xml nwfilter sepertinya aneh bagi saya, dokumentasi di situs web libvirt juga tidak sangat membantu.
wei
Jika Anda telah menjembatani jaringan, Anda dapat mengabaikan NAT libvirt default dan mengatur apa pun yang Anda inginkan. Seperti kata dyasny, perlakukan VM seperti yang Anda lakukan pada mesin fisik. Saya memiliki host KVM dan antarmuka dengan IP eksternal ditugaskan ke VM yang dikonfigurasi sebagai gateway. Jika itu sesuai dengan kebutuhan Anda, saya dapat memposting konfigurasi (gaya ubuntu).
Seni Shayderov