Libvirt / KVM में मेहमानों को अग्रेषित पोर्ट


33

मैं NAT का उपयोग करते समय VM के निर्दिष्ट पोर्ट पर libvirt / KVM चलाने वाले सर्वर पर पोर्ट कैसे अग्रेषित कर सकता हूं?

उदाहरण के लिए, मेजबान के पास 1.2.3.4 का सार्वजनिक आईपी है। मैं पोर्ट 80 से 10.0.0.1 और पोर्ट 22 से 10.0.0.2 आगे करना चाहता हूं।

मुझे लगता है कि मुझे iptables नियमों को जोड़ने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि उपयुक्त कहां है और वास्तव में क्या निर्दिष्ट किया जाना चाहिए।

Iptables -L का आउटपुट

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         

Ifconfig का आउटपुट

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 का उपयोग कर रहा हूं।


1
क्यों ifconfig का उपयोग कर रहा है? आईपी ​​ifconfig का उत्तराधिकारी है। ;)
मैनुअल फाक्स

5
प्रश्न २३३irt६० यह एफिलिएंट के कभी संस्करणों पर नहीं है। serverfault.com/questions/233760
akaihola

जवाबों:


36

Ubuntu के लिए libvirt के लिए नवीनतम स्थिर रिलीज़ संस्करण 0.7.5 है, जिसमें कुछ नई सुविधाएँ नहीं हैं (यानी स्क्रिप्ट हुक और नेटवर्क फ़िल्टर) जो स्वचालित नेटवर्क कॉन्फ़िगरेशन को आसान बनाते हैं। उस ने कहा, यहाँ Ubuntu 10.04 Lucid Lynx पर libvirt 0.7.5 के लिए पोर्ट अग्रेषण सक्षम करने का तरीका बताया गया है।

इन iptables नियमों को करना चाहिए चाल:

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

डिफ़ॉल्ट KVM NAT कॉन्फ़िगरेशन, ऊपर दिए गए 3rd के समान एक नियम प्रदान करता है, लेकिन यह NEW स्थिति को छोड़ देता है, जो आने वाले कनेक्शनों को स्वीकार करने के लिए आवश्यक है।

यदि आप इन नियमों को जोड़ने के लिए एक स्टार्टअप स्क्रिप्ट लिखते हैं और आप सावधान नहीं हैं, तो libvirt 0.7.5 इसे स्वयं डालकर ओवरराइड करता है। इसलिए, यह सुनिश्चित करने के लिए कि इन नियमों को स्टार्टअप पर ठीक से लागू किया गया है, आपको यह सुनिश्चित करने की आवश्यकता है कि आपके नियमों को सम्मिलित करने से पहले libvirt को आरंभीकृत किया गया हो ।

लाइन से पहले /etc/rc.local में निम्न पंक्तियाँ जोड़ें 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 10इसके बाद के संस्करण बनाने के लिए एक हैक यकीन libvirt डेमॉन अपने iptables नियम प्रारंभ करने में हम अपने खुद के जोड़ने से पहले का अवसर मिल सके है। मैं तब तक इंतजार नहीं कर सकता जब तक वे Ubuntu के लिए libvirt संस्करण 0.8.3 जारी नहीं करते।


3
क्या आप बता सकते हैं कि आप मौजूदा कामचोरी के साथ ऐसा कैसे करेंगे?
मैनुअल फॉक्स

1
यदि लूप और स्लीप कमांड में से एक को हैक करने की जरूरत नहीं है, अगर एक हुक स्क्रिप्ट काम के बाद चलती है तो इसकी नेटवर्किंग शुरू हो जाती है। मुझे यकीन नहीं है कि / etc / libvirt / हुक / डेमन स्क्रिप्ट नेटवर्क इनिशियलाइज़ेशन से पहले या बाद में चलाई जाती है, लेकिन यदि आप उपयुक्त वर्चुअल मशीन शुरू करते हैं तो आप / etc / libvirt / हुक / qemu का उपयोग करते हैं और नियम बना सकते हैं और नष्ट कर सकते हैं रूक जा। मुझे यकीन नहीं है कि आप नेटवर्क फ़िल्टर का उपयोग कैसे करेंगे (यदि बिल्कुल भी), लेकिन libvirt.org/firewall.html पर कुछ उदाहरण ऐसे हैं जैसे कि वे iptables नियमों के निर्माण को स्वचालित करने के लिए संशोधित किए जा सकते हैं।
इसहाक सदरलैंड

महान, मैं इसकी पुष्टि कर सकता है कि यह काम करता है, हालांकि मैंने कोशिश नहीं की है कि क्या होगा अगर मैं सर्वर को पुनः आरंभ करूं ...
एरन लोरिंज़

18

जब उपयोगकर्ता उपयोगकर्ता-मोड नेटवर्किंग का उपयोग कर रहा है, तो फ्लाई पर पोर्ट पुनर्निर्देशन स्थापित करने का एक तरीका है , मैंने यहां इसके बारे में ब्लॉग किया है:

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

आप वहां विवरण देख सकते हैं, लेकिन सुविधा के लिए, यहां वह समाधान है जो मैंने सोचा है:

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

यह वन-लाइनर अन्य उत्तरों की तुलना में बहुत आसान है, लेकिन केवल कुछ परिदृश्यों (उपयोगकर्ता मोड नेटवर्क स्टैक) में काम करता है।


3
आपका समाधान काफी दिलचस्प है - क्या आप अपने जवाब में कुछ मुख्य विवरण (या कम से कम कैसे-कैसे बिट्स) शामिल कर सकते हैं ताकि यह अभी भी उपयोगी हो अगर आपका ब्लॉग कभी रखरखाव के लिए नीचे है? :)
voretaq7

हो गया, मेरी एस एफ प्रतिष्ठा 1 से अधिक जाने में मदद करने के लिए स्वतंत्र महसूस
;;

इस दृष्टिकोण को उपयोगकर्ता मोड में एक नेटवर्क के उपयोग की आवश्यकता होती है जो हमें कुछ निर्बाध सीमाएं ला सकता है। देखें: linux-kvm.org/page/Networking#User_Networking । एक और संदर्भ: topic.alibabacloud.com/a/… , snippets.webaware.com.au/howto/… ]
एडुआर्डो लुसियो

5

ऐसा करने का एक और "आधिकारिक" [1] तरीका यह है कि एक स्क्रिप्ट को बनाने के लिए, जैसा कि libvirt वेबसाइट पर वर्णित है:

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

... जब केवीएम अतिथि को बूट-अप किया जाता है तो मूल रूप से यह स्क्रिप्ट मंगाया जाएगा। स्क्रिप्ट खुद ही उपयुक्त iptable नियमों को जोड़ देगा (इसहाक सदरलैंड के जवाब के समान) 'नई' कनेक्शन स्थिति के साथ सही ढंग से जोड़ा गया है। ध्यान दें कि आपको अपने मेजबानों और बंदरगाहों के लिए सही मानों के साथ स्क्रिप्ट को संशोधित करना होगा।

[१] हालाँकि लिबरविर्ट डॉक्यूमेंट खुद कहता है कि यह एक हैक, गो फिगर है


0

"केवल" जिस तरह से हम KVM (libvirt) का उपयोग कर "डिफ़ॉल्ट नेटवर्क" (virbr0) के साथ पोर्ट फॉरवर्ड कर सकते हैं, @Antony Nguyen द्वारा सूचित हैक / वर्कअराउंड का उपयोग कर रहा है। या अधिक बस आप libvirt-Hook-qemu का उपयोग कर सकते हैं ।

इस धागे में libvirt-Hook-qemu: https://superuser.com/a/1475915/195840 का उपयोग करके CentOS 7 (और निश्चित रूप से अन्य डिस्ट्रो के लिए) इस समस्या को कैसे हल किया जाए, इसकी पूरी व्याख्या है ।


-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
इसके लिए धन्यवाद, लेकिन केवीएम के साथ विशेष रूप से इसे नए राज्य के झंडे की आवश्यकता थी
steveh7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.