web-dev-qa-db-ja.com

libvirt 0.8.3を使用したホストからゲストへのポート転送(UbuntuでKVMを使用)

ホストは単一の外部IPを使用できるため、KVMゲストをNATでセットアップしました。

一部のリクエストを外部からゲストに転送するようにポート転送を設定するにはどうすればよいですか?

これに関するドキュメントは見つかりませんでした。最も近い答えはおそらく この答え ですが、libvirt 0.8.3でこれを行う簡単な方法があることも言及されています。これを行うためのより現在の方法を知っている人はいますか?

14
wei

フックスクリプト( source )を使用してポート転送を設定するより良い方法を次に示します。

/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

Libvirtのセットアップに合わせて、上部にある4つの変数を設定する必要があります。

Libvirt-binを再起動する必要があります。ubuntuでは、次のように実行します。

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

その後、ゲストを再起動する必要があります。 Ubuntuでは、フックスクリプトを実行できるように/etc/apparmor.d/usr.sbin.libvirtdを調整する必要があります。

の隣に

/usr/sbin/* PUx,

追加する

/etc/libvirt/hooks/* PUx,

次にapparmorをリロードします:

Sudo service apparmor reload

Virsh/dumpxml/iface-dumpxmlを使用して$GUEST_IPADDRを自動設定する方法はおそらくあるのですが、見つかりません。または、ネットワークxmlで静的にIPを設定することもできます: documentation

私の知る限り、ネットワークフィルターは、仮想ネットワークで発生することを制限するためにのみ使用でき、ポート転送には役立ちません。

13
Tobu

私も同じような状況です。 KVMインターフェイスvirbr0を介してホストに接続されているプラ​​イベートNATネットワークでWindowsサーバーを実行しています。アクセスしたいVMリモートデスクトップなので、ポート3389(RDP)のトラフィックをVMポート3389に転送する必要があります。これは、いくつかのiptableルールで実現しています。

/ sbin/iptables -t nat -A PREROUTING -p tcp -d Host-IP --dport 3389 -j DNAT --to-destination VM-IP:3389

/ sbin/iptables -I FORWARD -m state -d VM-NET/24 --state NEW、RELATED、ESTABLISHED -j ACCEPT

もちろん、ホストIP、VM-IP、VM-NETを採用する必要があります。ただし、iptablesとlibvirtをいじるのは注意が必要です。現在、私はインターネットでインターネットにアクセスするためのソリューションを探していますVMこれは、iptableルールの乱用により失われました:-(

2
spa

私はあなたが参照する答えはまだ適切なiptablesルールを示していると思います。ただし、仮想マシンの起動時と停止時に スクリプトフック を使用してルールを作成および破棄できるようになりました。アイザックが前の回答で言ったように、現在のlibvirtにも ネットワークフィルター がありますが、NATされたゲストのポートを開くためにそれらをどのように使用できるかはわかりません。

1
sciurus

ssh tcp forwardingを使用して、実行中のVMへの一時的なアクセスを自分に許可できます。

たとえば、Windows VMがあり、そのRDPポートにアクセスしたい場合:

ホストIP:10.10.10.10

vm ip:192.168.180.5

rDPポート:3389

最初のステップ:ssh -f 10.10.10.10 -L 3389:192.168.180.5:3389 -N

2番目のステップ:RDPクライアントを使用してlocalhost:3389に接続する

それでおしまい。

0
Sergey Papyan

ゲストネットワークはどのように設定されますか?ブリッジされている場合は、ポートをゲストのIPに転送するだけです。ゲストがさらに別のNATの背後にある場合、1つのlibvirtがセットアップすると、複雑になります

いずれにせよ、ここでは単にVMを物理マシンと同じように扱います

0
dyasny