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


14

ホストには使用可能な外部IPが1つしかないため、KVMゲストをNATで設定します。

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

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


外部-インターネットIPを意味しますか?それともLAN(VMの外部)だけですか?それらの外部アドレスをVMに割り当てて、ブリッジネットワークをセットアップできますか?
アートシェイデロフ

インターネットIPアドレスは1つしか取得できません。そのため、ブリッジネットワークモードを使用しませんでした。
i

回答:


12

フックスクリプト(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

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

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


1
Trustyには/etc/libvirt/hooks/** rmix,デフォルトでapparmor構成ファイルに行があり、同じ効果があるようです。apparmorの構成を変更せずにスクリプトを実行できました。
アミールアリアクバリ

2

私は同じような状況にいます。インターフェイスvirbr0を介してホストに接続されているプラ​​イベートNATネットワークのKVMでWindows Serverを実行しています。リモートデスクトップ経由で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

もちろん、HOST-IP、VM-IP、およびVM-NETを採用する必要があります。ただし、iptablesとlibvirtをいじるのは難しいです。今、私は、VMでインターネットにアクセスするための解決策を探していますが、iptableルールをいじって失ったものです:-(


私はそれが数年前だと知っていますが、この答えは私のために働いた。ありがとう!
mttdbrd

1

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


0

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

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


はっきり言ってなかったと思う。ホストはNATではなく、外部IPアドレスを持っています。残念ながら、ゲストネットワーキングはlibvirtによって設定されたNATの背後にあります。
i

ああ、それは別の問題です。基本的に、libvirtは独自のNATソリューションを管理し、編集可能です。
dyasny

ええ、それは私が言われたことです、それは編集することができます。しかし、私はそれについての参照を見つけることができません。nwfilterxml構成ファイルは私にとって奇妙なように見えます。libvirtウェブサイトのドキュメントもあまり役に立ちません。

ネットワークをブリッジしている場合は、デフォルトのlibvirt NATを放棄して、必要なものをセットアップできます。dyasnyが言ったように、VMは物理マシンと同じように扱います。KVMホストがあり、外部IPとのインターフェイスがゲートウェイとして構成されているVMに割り当てられています。必要に応じて、構成を投稿できます(ubuntuスタイル)。
アートシェイデロフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.