vmbr0 のブリッジか NAT かは、アドレスの数で決まる
検索で先に出るのは、ゲストを vmbr0 に載せるやり方と、ホストで NAT するやり方です。どちらもゲストは起動します。このマシンでは、先にアドレスを数えます。コンソールの文字列は、カンマ、空白、セミコロンで複数のアドレスを含むことがあります。分けたあと、先頭が管理アドレスで、SSH はそれだけを使います。後ろにあるものが、ゲストへ渡せる追加アドレスです。
含まれる 1 個を、ホストのログイン先とゲスト唯一の公開アドレスの両方にはできません。vmbr0 から外してゲストへ移すと、ホストへの SSH も消えます。追加アドレスはゲスト 1 台に 1 個です。追加が無いとき、ゲストはプライベートアドレスだけを持ち、外からは管理アドレスの指定ポートで入ります。これが NAT です。追加があるときは、存在しないプレフィックスを vmbr0 上で共有させません。物理ポートの無い内部ブリッジを作り、そのアドレスを /32 で渡します。
| 手元のアドレス | ゲストの接続先 | 外への出方 |
|---|---|---|
| 管理アドレスのみ | 内部ブリッジ vmbr1 | プライベートアドレス。ホストがポートを転送 |
| 1 個ずつ買った IPv4 | 同じ vmbr1 | 公開アドレス 1 個、マスク /32 |
| 解説どおりの /28 や /29 | そのようには接続しない | この注文にそのプレフィックスは無い |
どのサイトや証明書へアドレスを割り当てるかは別のノートです。追加アドレスを業務ごとに分けるを参照してください。ここでは Proxmox ゲストへの経路だけを扱います。
管理アドレスはホストに残す
注文では Proxmox VE 8 または Proxmox VE 9 を選びます。どちらもシステムイメージにあります。引き渡し後は管理アドレスへ SSH します。USB で入れ直す手順は要りません。インストーラで NIC を選び直す必要もありません。
ファイルを変える前に現状を見ます。ip -4 addr で、SSH に使ったアドレスは vmbr0 上にあります。ip route show default の via がゲートウェイ、dev は vmbr0 です。この組はイメージが既に書いた管理設定です。プレフィックスは /32 とは限りません。解説の /24 や /28 に書き換えません。物理 NIC の名前は /etc/network/interfaces の vmbr0 にある bridge-ports が正です。ip link に無い eth0 や ens3 へは変えません。
追加アドレスは、同じブリッジのエイリアスとして既に見えることも、引き渡しメモにだけ書いてあることもあります。グローバルな IPv4 の個数は、1 に注文の追加数を足した数です。足りなければそこで止め、チケットで照合します。他のマシンのアドレスは使いません。個数が合ったら、ゲストへ渡すアドレスをホストの設定から外し、管理アドレスだけを残します。同じアドレスをホストのエイリアスとゲスト NIC の両方に書くと、入ってくる通信は先にホストへ着き、ゲストのサービスは受けられません。
vmbr0 のアドレス、プレフィックス、ゲートウェイは変えないでください。管理アドレスを誤ると、この SSH は切れます。コンソールのグラフィカル接続はこの SSH に依存しないので、壊したファイルはそこから戻せます。以下の手順は vmbr0 の管理アドレスを編集しません。サブネットの解説どおりだと、起動しても外へ出ない
一般的な解説は、施設がプレフィックス全体を vmbr0 に置き、ゲートウェイがその先頭アドレスである前提です。ゲストは残りのアドレスを 1 つ取り、マスクをホストと同じにします。アドレスがインタフェースに載るので、NIC は up に見えます。出るときゲストはマスクからゲートウェイを同一リンクと判断し、ARP を送ります。そのプレフィックスはこのマシンに無いので ARP は返りません。デフォルトルートは使えません。外から見るとゲストは電源が入っていて、ポートにはサービスがありません。
別の書き方は、ゲストを vmbr0 に接続し、追加 IPv4 を入れ、ゲートウェイはホストのものを写し、マスクは /24 や /28 のままにします。追加アドレスは 1 個ずつの提供で、さらに分割するプレフィックスではありません。上流はこれらのアドレスをこのマシンへ届けます。ゲストの MAC がゲートウェイを取りに行く形ではありません。vmbr0 上の ARP は本来の次ホップに届かず、戻りはホストの古いエイリアスに落ちます。アドレスは見えます。ping は出ません。
もう一つは、ホストが送信元 NAT を掛けたまま、ゲストが公開アドレスを持っていると思い込む重ね方です。出ていくパケットは管理アドレスに書き換わり、戻りはゲストのセッションと合いません。独立した公開アドレスには送信元 NAT を掛けません。ポート転送で届けるゲストには公開アドレスを載せません。同じアドレスに両方は重ねません。
追加アドレスは内部ブリッジへ /32 で渡す
内部ブリッジの名前は vmbr1 です。物理ポートは付けず、ホストとゲストの間だけに使います。/etc/network/interfaces の末尾に足します。プライベートの範囲は変えて構いませんが、ホストとゲストは同じ範囲です。10.10.10.0/24 が既にあれば別のプライベート範囲にします。以下の 203.0.113.20 は文書用の例です。注文の追加アドレスに置き換え、1 アドレスにつき 1 行です。
ホスト側には auto vmbr1、address 10.10.10.1/24、bridge-ports none、bridge-stp off、bridge-fd 0 が要ります。追加アドレスごとに post-up ip route add 203.0.113.20/32 dev vmbr1 を足します。まだ無いゲストアドレスへ via してはいけません。経路がブリッジ自体を向くと、その /32 を持つゲストがブリッジ上で ARP に答えます。
転送と逆経路は /etc/sysctl.d/99-guest-route.conf に書き、sysctl --system を実行します。行は net.ipv4.ip_forward=1、net.ipv4.conf.all.rp_filter=2、そして vmbr0 と vmbr1 でも rp_filter=2 です。転送がオフだと、ホストからゲストへは届いても、ゲストと外の間は通りません。逆経路が厳密モードのままだと、カーネルはこのパケットを捨てます。追加アドレスはゲストにあり、戻りは vmbr0 から出るため、厳密検査は送信元がその出口に属さないと判断します。緩いモードはこの検査だけを解きます。ファイアウォールの代わりにはなりません。
ifreload -a でインタフェースファイルを適用します。適用後、元の SSH でもう一度コマンドを打ち、管理アドレスが vmbr0 に残っていることを確認します。ip route get 203.0.113.20 は dev vmbr1 を示すはずです。ファイルに書かず現在のシェルだけで ip route add すると、再起動で経路が消え、ゲストは再び外へ出られません。
Proxmox ではゲスト NIC のブリッジを vmbr1、モデルを VirtIO にします。この NIC に NAT のスイッチはありません。ゲスト OS では公開アドレスを /32 にし、対向とデフォルトゲートウェイをどちらも 10.10.10.1 にします。Debian 系の interfaces は address 203.0.113.20/32、pointopoint 10.10.10.1、gateway 10.10.10.1 です。Ubuntu の netplan もアドレスは /32、デフォルトルートの via は 10.10.10.1、on-link: true を付けます。Proxmox の Cloud-Init 欄に /32 とゲートウェイだけを入れると、このオンリンク経路が欠けることが多く、ゲストはリンク上に無いゲートウェイへ ARP します。ゲスト自身のネットワークファイルへ書き、ゲストを再起動してから ip route を見ます。
独立した公開アドレスが要るゲストは追加アドレスを 1 個使います。次のゲストは次の追加アドレスを使い、やはり vmbr1 に接続し、/32 の経路を 1 本足します。架空の /28 に複数のゲストを入れてはいけません。ゲストで ip route get 1.1.1.1 を実行し、src がその公開アドレスであること、10.10.10.2 ではないことを確認します。送信元がプライベートのままだと、外から見えるのは管理アドレスで、この段階は終わっていません。
追加アドレスが無いときはポート転送だけ
追加数が 0 のとき、ゲストに公開アドレスは設定しません。vmbr1 は引き続き 10.10.10.1/24 です。ゲストはその範囲のプライベートアドレス、たとえば 10.10.10.2/24 を持ち、ゲートウェイは 10.10.10.1 です。ゲストに独立した公開の身元はありません。ゲスト上のサービスへ外から入るには、管理アドレスのポートをこのプライベートアドレスへ転送します。
規則はホストの vmbr1 の post-up に書き、再起動後も残します。入る例は iptables -t nat -A PREROUTING -d 管理アドレス -p tcp --dport 443 -j DNAT --to-destination 10.10.10.2:443 です。出る例は iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE です。Proxmox VE 8 と 9 では、これらは iptables-nft を経由して効きます。先に -C で確認し、既にある規則は -A しません。そうしないと ifreload のたびに同じ規則が積まれます。
管理アドレスの TCP 22 は転送しません。それはホストの SSH です。サイト、API、ゲスト自身のリモートデスクトップは別の外部ポートを使います。Windows ゲストの RDP が要るときは、管理アドレス上で選んだポートをそのゲストの 3389 へ転送し、ホストの 22 はそのままにします。ゲストのサービスはプライベートアドレスか全アドレスで待ち受けます。設定していない公開アドレスだけを待ち受けていると、転送先に受け取るプロセスがありません。
ポート転送はアドレスを増やさず、帯域も上げません。250M、1G、2G は別項目で、いずれも転送量の上限はありません。10 台のゲストが管理アドレスから出ても、外から見える送信元はその 1 個です。相手の許可リストがサービスごとに別の送信元を求めるなら、前の節へ戻り、追加アドレスを 1 個ずつ買います。転送規則でサブネットは作れません。
施設の外から三度確かめる
管理アドレスでまだ入れる
オフィスか自宅のネットワークから、先頭のアドレスへ SSH します。セッションはホストに着地し、ゲストには着地しません。コンソールのアドレス文字列をそのまま SSH に貼り付けません。
追加アドレスは該当ゲストに着く
使う予定の追加アドレスごとに、実際のサービスへ一度アクセスします。ホストの
ip route getはvmbr1を指します。ゲストのip -4 addrにその /32 が見えます。ホスト上で自分のアドレスへcurlするとローカルループに留まることが多く、外の経路は分かりません。追加が無いときはポートを見る
外から転送後のポートへアクセスし、応答はゲストからです。ホストの 22 へのアクセスは、応答がホストのままです。両方が通って、転送がログイン口を置き換えていないことになります。
再起動しても残る
ホストを再起動します。管理アドレス、内部ブリッジ、/32 の経路、またはポート転送が残っています。
sysctl net.ipv4.ip_forwardは 1 です。欠けていればインタフェースファイルへ戻ります。このセッションだけでコマンドを足し直してはいけません。
アドレスと経路が正しく、外からまだ通らないときはファイアウォールを見ます。データセンターまたはノードのファイアウォールが有効だと、転送チェーンが既定ポリシーで捨てられることがあります。切り分けのあいだは、そのゲスト NIC のファイアウォールだけを切って構いません。経路が通ったら、ポートごとに許可を書きます。ホスト全体のフィルタを長く空にはしません。
ゲスト内部の NIC 名は ens18 や eth0 のことがあります。そのゲストの ip link を正とします。名前が違うとアドレスは現れず、経路コマンドも「サブネットが無い」とは言いません。先にインタフェースが up か、次にデフォルトルートの次ホップが 10.10.10.1 かを見ます。
個数と月額は一緒に積む
追加 IPv4 は 1 個あたり月額 $2 です。注文に書くのは個数で、プレフィックス長ではありません。4 個なら月額 $8、20 個なら月額 $40 です。含まれる 1 個と合わせて 256 個を超えません。これらのアドレスはホスト、ディスク、帯域、システムと同じ月額に足し、そのあと月数を掛けます。四半期は月額の 3 倍、半年は 6 倍、年は 12 倍で、さらに割引はありません。初期費用はありません。
128GB の月額は $455 で、IPv4 が 1 個と 250M を含みます。256GB の月額は $612 で、アドレスの規則は同じです。どちらも AMD EPYC 7543P、32 コア 64 スレッド、メモリは DDR4-3200 ECC RDIMM です。256GB はそのモデルを選ぶのであり、128GB のマシンへメモリを足すのではありません。メモリの段はアドレスを増やしません。帯域を 1G にすると月額 $248 が足されますが、アドレスの個数は変わりません。
マシンは日本の東京に置かれます。ホストへのログインは SSH で、管理アドレスはコンソールにあります。Windows を選んだゲストは RDP を使います。それはゲスト自身の接続で、ホストの管理アドレスを置き換えません。Proxmox VE 8 と 9 は無料のシステム一覧にあり、イメージとして渡されます。別のインストール媒体にはしません。