Limanları libvirt / KVM'deki konuklara yönlendirme


33

NAT kullanırken, libvirt / KVM çalıştıran bir sunucudaki bağlantı noktalarını VM'lerde belirtilen bağlantı noktalarına nasıl iletebilirim?

Örneğin, ev sahibi 1.2.3.4'lük bir kamu IP'sine sahiptir. 80 - 10.0.0.1 bağlantı noktasını ve 22 - 10.0.0.2 bağlantı noktasını iletmek istiyorum.

Iptables kuralları eklemem gerektiğini düşünüyorum, fakat uygun olanın ve tam olarak ne belirtilmesi gerektiğinden emin değilim.

Iptables -L çıktısı

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             10.0.0.0/24         state RELATED,ESTABLISHED 
ACCEPT     all  --  10.0.0.0/24          anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

İfconfig çıktısı

eth0      Link encap:Ethernet  HWaddr 00:1b:fc:46:73:b9  
          inet addr:192.168.1.14  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::21b:fcff:fe46:73b9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:201 errors:0 dropped:0 overruns:0 frame:0
          TX packets:85 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:31161 (31.1 KB)  TX bytes:12090 (12.0 KB)
          Interrupt:17 

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)

virbr1    Link encap:Ethernet  HWaddr ca:70:d1:77:b2:48  
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::c870:d1ff:fe77:b248/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:468 (468.0 B)

Ubuntu 10.04 kullanıyorum.


1
neden ifconfig kullanıyorsunuz? ip, ifconfig'in halefidir. ;)
Manuel Faux

5
Soru 233760, hiçbir zaman libvirt sürümlerinde bu konuyu ele almamaktadır. serverfault.com/questions/233760
akaihola

Yanıtlar:


36

Ubuntu için libvirt'in son kararlı sürümü, otomatik ağ yapılandırmasını kolaylaştıran bazı yeni özelliklere sahip olmayan (örn. Script kancaları ve ağ filtreleri) sürüm 0.7.5'tir. Bununla birlikte, Ubuntu 10.04 Lucid Lynx'te libvirt 0.7.5 için bağlantı noktası iletmenin nasıl etkinleştirileceğini söyledi.

Bu iptables kuralları hile yapmalı:

iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 10.0.0.1:80
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 22 -j DNAT --to-destination 10.0.0.2:22
iptables -I FORWARD -m state -d 10.0.0.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

Varsayılan KVM NAT config yukarıda verilen 3'e benzer bir kural sağlar, ancak gelen bağlantıları kabul etmek için gerekli olan YENİ durumunu çıkarır.

Bu kuralları eklemek için bir başlangıç ​​betiği yazarsanız ve dikkatli değilseniz, libvirt 0.7.5 kendi kurallarını ekleyerek bunları geçersiz kılar. Bu nedenle, başlangıçta bu kuralların doğru uygulandığından emin olmak için kurallarınızı eklemeden önce libvirt'in başlatıldığından emin olmanız gerekir .

Aşağıdaki satırları /etc/rc.local dosyasına, satırdan önce ekleyin exit 0:

(
# Make sure the libvirt has started and has initialized its network.
while [ `ps -e | grep -c libvirtd` -lt 1 ]; do
        sleep 1
done
sleep 10
# Set up custom iptables rules.
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 10.0.0.1:80
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 22 -j DNAT --to-destination 10.0.0.2:22
iptables -I FORWARD -m state -d 10.0.0.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
) &

sleep 10Yukarıda emin libvirt cini biz kendi eklemeden önce onun iptables kuralları başlatmak için bir şans olmuştur yapmak için kesmek. Ubuntu için libvirt versiyon 0.8.3'ü piyasaya sürene kadar bekleyemem.


3
Bunu mevcut libvirt ile nasıl yapacağınızı açıklayabilir misiniz?
Manuel Faux

1
Eğer libvirt ağını başlattıktan sonra kanca komut dosyalarından biri çalışıyorsa döngü ve uyku komutları sırasında hacklenmiş olmanıza gerek yoktur. / Etc / libvirt / hooks / daemon betiğinin ağ başlatılmasından önce mi yoksa sonra mı çalıştırıldığından emin değilim, ancak / etc / libvirt / hooks / qemu kullanıyorsanız, uygun sanal makineler başladığında kuralları oluşturabilir ve yok edebilirsiniz. durdurmak. Ağ filtrelerini nasıl kullanacağınızdan emin değilim (eğer varsa), ancak libvirt.org/firewall.html adresindeki örneklerden bazıları iptables kurallarının oluşturulmasını otomatikleştirmek için değiştirilebilecek gibi kokuyor.
Isaac Sutherland

Harika, çalıştığını doğrulayabilirim, ancak sunucuyu yeniden
başlatırsam

18

Misafir kullanıcı modu ağı kullanırken anında bağlantı noktası yönlendirmesi ayarlamanın bir yolu var, burada blog yazdım:

http://blog.adamspiers.org/2012/01/23/port-redirection-from-kvm-host-to-guest/

Ayrıntıları orada görebilirsiniz, ancak kolaylık sağlamak için işte çözdüğüm çözüm:

virsh qemu-monitor-command --hmp sles11 'hostfwd_add ::2222-:22'

Bu tek astar, diğer yanıtlardan çok daha kolaydır, ancak yalnızca bazı senaryolarda çalışır (kullanıcı modu ağ yığını).


3
Çözümünüz oldukça ilginç - Blogunuza hiç bakılmamışsa hala yararlı olması için cevabınıza bazı ayrıntıların (veya en azından nasıl yapıldığını) ekleyebilir misiniz? :)
voretaq7

Tamam, SF itibarımın 1'den yüksek olmasına yardımcı olmaktan çekinmeyin ;-)
Adam Spiers

Bu yaklaşım, bir ağın kullanıcı modunda, bize ilginç olmayan bazı sınırlamalar getirebilecek şekilde kullanılmasını gerektirir. Bakınız: linux-kvm.org/page/Networking#User_Networking . Başka referanslar: topic.alibabacloud.com/a/... , snippets.webaware.com.au/howto/... ]
Eduardo Lucio

5

Bunu yapmanın daha "resmi" bir yolu [1], libvirt web sitesinde açıklandığı gibi bir kanca betiği oluşturmaktır:

http://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections

... temel olarak, bu komut dosyası bir KVM konuğu başlatıldığında çağrılır. Betik, 'YENİ' bağlantı durumu doğru bir şekilde eklendiğinde uygun iptable kuralları (yukarıdaki Isaac Sutherland'ın cevabına benzer) ekleyecektir. Komut dosyasını, ana bilgisayarlarınız ve bağlantı noktalarınız için doğru değerlerle değiştirmeniz gerektiğini unutmayın.

[1] libvirt belgelerinin kendisi bunun bir tür hack olduğunu söylese de, git


0

"Varsayılan ağ" (virbr0) ile KVM (libvirt) kullanarak bağlantı kurabilmemizin "tek" yolu @Antony Nguyen tarafından bildirilen hack / geçici çözümü kullanmaktır. Veya daha basit bir ifadeyle libvirt-hook-qemu'yu kullanabilirsiniz .

Bu konu, libvirt-hook-qemu kullanarak https://superuser.com/a/1475915/195840 , CentOS 7 için (ve kesinlikle diğer dağıtımlar için) bu sorunun nasıl çözüleceği konusunda tam bir açıklama yaptı .


-1
iptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1
 iptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 22 -j DNAT --to-destination 10.0.0.1

1
Bunun için teşekkür ederim, ama KVM ile özellikle YENİ devlet bayrağına da ihtiyacı vardı
steveh7
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.