web-dev-qa-db-ja.com

2つのKVMゲストに複数のパブリックIPアドレスを割り当てる方法

私はこのトピック全体に不慣れで、KVMホストを介してKVMゲストに複数のパブリックIPアドレスを割り当てる方法を理解しようとしています。そのような方法を取得する方法の例がたくさん見つかりました。 1つのパブリックIPが実行されているセットアップ。

これが私のセットアップです。サーバーにはNIC/MACが1つしかなく、Apache(およびその他のもの)で2つのKVMゲストを実行します。両方のゲスト環境はubuntuサーバー11.10であり、別々のVMで実行する必要があります。 5つのパブリックIPアドレスは、SSL証明書などの処理に使用されます。最初のVMは5つのアドレス/証明書のうち3つを使用する必要があります。2番目のVMは残りを取得します。Apacheのものは正しく構成されています。

ホストNICからゲストNICにトラフィックをルーティングするために、iptablesを介していくつかの異なる方法を試しました。一方の方法は正しい方法でしたが、実装が間違っていただけでしたが、詳細については言わないでおくと、思いがけないままになってしまいます。問題は次のとおりです。

次の条件を満たす必要があります。

  • Apacheは訪問者の元のIPアドレスを取得する必要があります
  • Apacheは、適切なssl-vhostを使用するためにどのpublic-ipアドレスが使用されたかを知っている必要があります
  • 他のVMゲストにはパブリックからアクセスできる他の2つの非httpサービスがあるため、トラフィックはホスト上の(リバース)プロキシを介してルーティングされないようにする必要があります。そして:sshdだけがホストで直接リッスンする必要があります-他には何もありません
  • 各VMはインターネットに直接アクセスできる必要があります。
  • データセンターのネットワークは、MACベースに切り替えられます。私が理解したように、インターネットと通信する唯一の方法は、eth0とそのMACアドレスを使用することです。

Apacheが特定のIPアドレスから直接リクエストを取得するため、仮想化に関するものをすべて破棄する場合、これは完全に簡単です。

私はどんな解決策に対してもオープンです。

Diagram

4
Ron

Dom0(例:KVM Host)WANインターフェースでブリッジを使用します。これには_bridge-utils_パッケージのインストールが必要です。これはDebianベースのディストリビューションであるため、_/etc/network/interfaces_で構成できます。

_iface eth0 inet manual

auto br_wan
iface br_wan inet dhcp
    # Assuming DHCP to get address, otherwise migrate all WAN connection options here
    #address 192.168.122.0
    bridge_ports eth0 tap_guest1
    bridge_stp      off
    bridge_maxwait  0
    bridge_fd       0
    pre-up ip tuntap add dev tap_guest1 user guest1 mode tap
    # This command is required if your ISP allocates static IPs depending on MAC address
    # You shouldn't use this but might be handy some time
    #pre-up sysctl -q -w net/ipv4/conf/tap_guest1/proxy_arp=1
    post-down ip tuntap del tap_guest1 mode tap
_

事前設定コマンドは、KVMゲストをブリッジに接続するためのTAPインターフェイスを設定します。このセットアップでは、非特権ユーザーguest1からkvmを実行できることに注意してください。 sysctlで_net.ipv4.ip_forward = 1_を設定することも役立つかもしれないことに注意してください。

_ip tuntap_パッケージから_iproute2_コマンドを使用しました。 Debianパッケージにはまだ文書化されていませんが、すぐにアップストリームのマニュアルページで利用できるようになります。このパッケージはすべてのDebianベースのサーバーにインストールされるため、これらのインターフェースを作成するだけのために_uml-utilities_またはopenvpnパッケージをインストールする必要はありません。

_tap_guest1_インターフェイスの場合と同様のプリアップとポストダウンの行を作成する必要があるため、このアプローチには、多くのタップインターフェイスを管理するための優雅さが欠けています。これは、_/etc/network/pre-up.d_および_/etc/network/post-down.d_に追加のスクリプトを記述することで修正できます。 KVMゲストの実行中に_br_wan_インターフェイスをifdown/ifupスクリプトで再構成する場合も問題になります。_eth0_を除くすべてのインターフェイスをから削除する必要があります。ブリッジ構成を行い、手動でブリッジから切り離すか(ブリッジの再構成後にそれらを接続し直すことを忘れないでください)、ブリッジで実行されているすべてのKVMインスタンスをシャットダウンします。

別の方法、おそらくよりクリーンな方法は、KVM自体のカスタムifupスクリプトを記述し、それをNICのscriptオプションで使用することです。 _/etc/qemu-ifup_で例を取得できます。詳細は kvmマニュアルページ を参照してください。

次に、次のようにKVMボックスを実行できます。

_kvm -net nic,model=virtio,macaddr=12:34:56:78:9a:bc \
    -net tap,ifname=tap_guest1,script=no,downscript=no \
    -boot c -nographic -display none -daemonize \
    guest1-drive.qcow2
_

KVMゲストの1つのインターフェースに複数のIPアドレスを設定するには、コマンドを使用して手動で行います

_ip address add aaa.bbb.ccc.101/24 dev eth0
_

または恒久的に_/etc/network/interfaces_のように:

_auto eth0 eth0:1
iface eth0 inet static
    address aaa.bbb.ccc.100
    network aaa.bbb.ccc.0
    netmask 255.255.255.0
    broadcast aaa.bbb.ccc.255
    gateway aaa.bbb.ccc.1

iface eth0:1 inet static
    address aaa.bbb.ccc.101
    network aaa.bbb.ccc.0
    netmask 255.255.255.0
    broadcast aaa.bbb.ccc.255
    gateway aaa.bbb.ccc.1
_

データセンター/プロバイダーが同じネット上の追加のボックスを公開することを期待していない場合、彼はそれらを構成しない可能性があり、それらは使用できなくなります。この場合、内部ブリッジを作成し、iptablesを使用して、DNATとSNATを使用してWANインターフェイスとこのブリッジの間でパケットを転送することができます。ローカル仮想ブリッジネットワークが10.0.0.0/8であるとすると、guest1は10.0.0.2であり、次のものが必要になります。

_iptables -t nat -A PREROUTING --dst aaa.bbb.ccc.100 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2
iptables -t nat -A PREROUTING --dst aaa.bbb.ccc.101 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2
...
iptables -t nat -A POSTROUTING -p tcp --dst 10.0.0.2 -j SNAT --to-source aaa.bbb.ccc.100
_

KVMゲストごとに外部IPと同じ数のDNATコマンドが必要ですが、インターネットへのアクセスを許可するSNATルールは1つだけであることに注意してください。また、必要なポートのみを許可することにより、HTTP/HTTPS/SSHトラフィックのみを許可できます。 _--dport_ステートメントを省略すると、すべてのポートが転送されます。 KVMゲストは、DHCPサーバーをホストする意思がない限り、デフォルトゲートウェイとしてKVMホストを使用した静的ネットワーク設定を持っている必要があります。

5
jollyroger

Iptablesでパケットを転送する代わりにブリッジを使用します。ゲストを開始した後、ゲストのNIC(複数の仮想NICがある場合)へのIPを構成するだけです。

これを参照してください ドキュメント

2
Lucas Kauffman

@jollyroger:包括的なガイドをありがとうございます。残念ながら、私の場合は、うまくいきませんでした。しかし、あなたのガイドはKVMと一緒にlinux-networking/bridgingの機能をよりよく理解するのに役立ちました。

だから私はすべてを元に戻し、私のホスティング会社から直接いくつかの助けを得ました。シナリオは、カスタムネットワーク構成を追加するためにvirt-managerおよびvirshを使用するのと同じくらい簡単でした。これが最終的に私のために働いた解決策です:

/ 29サブネット(+ホスト上のssh用の別の異なるIP)があります。データセンター内のネットワークはMacベースのスイッチなので、すべてのトラフィックはローカルゲートウェイを経由する必要があります(私が理解している限り)。私のプロバイダーはドイツのヘッツナーです。 http://www.subnet-calculator.com/subnet.php?net_class=A を使用して、network-configuration-xmlに必要なすべての設定を計算しました。

<network>
        <name>{some systemwide unique name. e.g.: subnet1}</name>
        <uuid>{> call uuidgen from Shell to generate a uuid}</uuid>
        <forward dev="{interface e.g.: eth0}" mode="route" />
        <bridge name="{name of a _new_ virtual interface e.g.: virbr2}" stp="off" forwardDelay="0" />
        <ip address="{subnet-calc: Host Address Range Start Address}" netmask="subnet-calc: Subnet Mask">
                <dhcp>
                        <range start="{subnet-calc: Host Address Range Start Address+1}" end="{subnet-calc: Host Address Range End Address}" />
                </dhcp>
        </ip>
</network>

このxmlデータを/ tmp/subnet1.xmlのようなものに保存し、次を使用してこの新しい仮想ネットワークを適用しました。

Sudo virsh net-define /tmp/subnet1.xml

virt-manager0.9.0(x11経由-WindowsマシンのPuTTY経由で転送)を使用して、すべてのVMを作成および編集します。したがって、私の2つのパブリックVMは両方ともこの新しい仮想ネットワークを取得します。各VMで、public-ipごとに新しい仮想ネットワークインターフェイスを作成しました。どのパブリックIPにどのMACアドレスを使用したかをメモしました。したがって、パブリックIPアドレスを別のVMに移動する場合は、仮想を削除するだけですNIC in VM A and create it in = VM B同じMACアドレスを使用します。

もう1つ、このシナリオを再現しようとする場合は、VMを起動する前に、仮想ネットワーク「subnet1」(s.a。)がアクティブであることを確認してください。 virt-managerのメインウィンドウで編集>接続の詳細に移動し、タブ仮想ネットワークにジャンプします。ネットワーク「subnet1」がグレー表示されている場合は、マークを付けて再生ボタンをクリックするだけです。

ここで、VMを開始し、ifconfigと入力します。私の場合、すべてが直接機能しました。

このレポートで見逃したものがあれば、質問してください。誰かがより良い解決策を持っているなら、ここにそれを自由に追加してください。

2
Ron