ホストには使用可能な外部IPが1つしかないため、KVMゲストをNATで設定します。
外部からの要求の一部をゲストに転送するポート転送を設定するにはどうすればよいですか?
これに関するドキュメントが見つかりませんでした。最も近い答えはおそらくこの答えですが、libvirt 0.8.3でこれを行う簡単な方法もあると述べています。誰でもこれを行うための最新の方法を知っていますか?
ホストには使用可能な外部IPが1つしかないため、KVMゲストをNATで設定します。
外部からの要求の一部をゲストに転送するポート転送を設定するにはどうすればよいですか?
これに関するドキュメントが見つかりませんでした。最も近い答えはおそらくこの答えですが、libvirt 0.8.3でこれを行う簡単な方法もあると述べています。誰でもこれを行うための最新の方法を知っていますか?
回答:
フックスクリプト(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_IPADDR
virsh / dumpxml / iface-dumpxmlを使用して自動構成する方法がありますが、見つかりませんでした。または、ネットワークxml:documentationでIPを静的に設定できます。
私の知る限り、ネットワークフィルターは、仮想ネットワークで発生することを制限するためにのみ使用でき、ポートフォワーディングには役立ちません。
/etc/libvirt/hooks/** rmix,
デフォルトでapparmor構成ファイルに行があり、同じ効果があるようです。apparmorの構成を変更せずにスクリプトを実行できました。
私は同じような状況にいます。インターフェイス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ルールをいじって失ったものです:-(
あなたが参照する答えは、まだ適切なiptablesルールを示していると思います。ただし、仮想マシンの起動時と停止時に、スクリプトフックを使用してルールを作成および破棄できるようになりました。Isaacが前の回答で述べたように、現在のlibvirt にはネットワークフィルターもありますが、NATされたゲストのポートを開くためにどのように使用できるか、または使用できるかどうかはわかりません。
ゲストネットワーキングはどのように設定されていますか?ブリッジされている場合は、ポートをゲストのIPに転送するだけです。ゲストがさらに別のNATの背後にいる場合、libvirtがセットアップされ、複雑になります
しかし、いずれにせよ、ここでは単に物理マシンと同じようにVMを扱います