libvirt / KVMのゲストへのポートの転送


33

NATを使用している場合、libvirt / KVMを実行しているサーバーのポートをVMの指定されたポートに転送するにはどうすればよいですか?

たとえば、ホストのパブリックIPは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を使用するのですか?ipはifconfigの後継です。;)
マヌエルフェイク

5
質問233760は、libvirtの決してないバージョンでこれに対処しています。 serverfault.com/questions/233760
akaihola

回答:


37

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構成では、上記の3番目と同様のルールが提供されますが、着信接続を受け入れるために不可欠な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
現在のlibvirtでこれを行う方法を説明できますか?
マヌエルフェイク

1
libvirtがネットワークを初期化した後にフックスクリプトの1つが実行される場合、ハックされたwhileループおよびスリープコマンドは必要ありません。/ etc / libvirt / hooks / daemonスクリプトがネットワークの初期化の前後に実行されるかどうかはわかりませんが、/ etc / libvirt / hooks / qemuを使用すると、適切な仮想マシンの起動時にルールを作成および破棄できます。やめる。ネットワークフィルターを使用する方法(あるとしても)はわかりませんがlibvirt.org / firewall.htmlの例の一部は、iptablesルールの作成を自動化するために変更できるような匂いがします。
アイザックサザーランド

グレートは、私は、しかし、私は...私は、サーバーを再起動するとどうなるか試していませんが、それが動作を確認することができます
アロンLorincz

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

完了、SFの評判が1より高くなるのをお気軽にご遠慮ください;
アダムスパイアーズ

このアプローチでは、ユーザーモードでネットワークを使用する必要があります。これにより、興味深い制限がいくつか発生する可能性があります。linux-kvm.org/page/Networking#User_Networkingを参照してください。別の参考文献:topic.alibabacloud.com/a/...snippets.webaware.com.au/howto/... ]
エドゥアルド・ルシオ

5

これを行う「公式」[1]方法は、libvirt Webサイトで説明されているようにフックスクリプトを作成することです。

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

...基本的に、このスクリプトはKVMゲストが起動されるときに呼び出されます。スクリプト自体は適切なiptableルールを追加し(上記のIsaac Sutherlandの回答と同様)、「新しい」接続状態が正しく追加されます。ホストとポートの正しい値でスクリプトを変更する必要があることに注意してください。

[1] libvirtのドキュメント自体には、これは一種のハックであると書かれていますが、


0

「デフォルトネットワーク」(virbr0)でKVM(libvirt)を使用してポートを転送できる「唯一の」方法は、@ Antony Nguyenから通知されたハック/回避策を使用することです。または、より簡単にlibvirt-hook-qemuを使用できます。

このスレッドは、libvirt-hook-qemuを使用してCentOS 7(および他のディストリビューション)でこの問題を解決する方法の完全な説明があります:https : //superuser.com/a/1475915/195840


-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
このいただきありがとうございますが、KVMと特異的にそれは同様にNEW状態フラグを必要
steveh7
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.