私はこのトピック全体に不慣れで、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アドレスから直接リクエストを取得するため、仮想化に関するものをすべて破棄する場合、これは完全に簡単です。
私はどんな解決策に対してもオープンです。
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ホストを使用した静的ネットワーク設定を持っている必要があります。
Iptablesでパケットを転送する代わりにブリッジを使用します。ゲストを開始した後、ゲストのNIC(複数の仮想NICがある場合)へのIPを構成するだけです。
これを参照してください ドキュメント 。
@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と入力します。私の場合、すべてが直接機能しました。
このレポートで見逃したものがあれば、質問してください。誰かがより良い解決策を持っているなら、ここにそれを自由に追加してください。