入ってくる接続と、自分から開く接続を分ける
1 台に複数のサイトを置くことと、アドレスの割り当ては別の話です。このノートが扱うのは 2 つです。リクエストが一覧のどの行に着くか。マシンが自分で接続を開くとき、どの行から出るか。
コンソールはアドレスを行に分けます。先頭行は SSH または RDP 用です。残りの各行は 1 個ずつ買った IPv4 で、サブネットの空きではありません。行を NIC に足し、再起動後も残す手順は 追加 IPv4 を NIC に足す のとおりです。そのあとでサイトへ割り当てます。
入ってくる側は DNS と待受アドレスです。クライアントは A レコードが指す行へ接続します。先頭行だけを待受しているプログラムは、ほかの行の同じポートには答えません。
出ていく側は、その接続を誰が開いたかです。誰かが特定の行へ接続したあと、そのセッションの応答はその行から戻ります。マシンが自分で開く接続、たとえば更新、API 呼び出し、送信メールは、プログラムがローカルアドレスを指定しなければ、デフォルトルートを持つ先頭行が送信元です。
複数のサイトが先頭行を共有する
サイトがどれも 80 と 443 のウェブサイトで、ホスト名だけで分けられるなら、すべて先頭行を指します。ドメインを増やすたびにアドレスは要りません。
名前ごとに A レコードを 1 本作り、値はすべて先頭行です。Web サービスは 0.0.0.0 の 443、または先頭行の 443 だけを待受します。ホスト名でサイトのディレクトリと証明書を選びます。証明書は名前に従い、アドレスの行数には従いません。1 行を共有するときは、SNI が同じポートで証明書を分けます。
server {
listen 443 ssl;
server_name a.example;
}
server {
listen 443 ssl;
server_name b.example;
}
どちらのブロックもアドレスを固定していないので、この NIC のすべてのアドレスで待受し、server_name で分けます。listen 203.0.113.10:443 ssl に変えると、先頭行の 443 だけが入ります。追加アドレスの 443 はこのブロックに入りません。
IIS はホストヘッダーで同じ分け方をします。IP は先頭行か「すべての未割り当て」にし、ホスト名に各ドメインを書き、ポートは 443 のままです。サイトを足すのはバインドと A レコードを足すことで、アドレスの行を足すことではありません。
同じ行の同じポートを、2 つのプログラムが同時に専有することはできません。2 つ目のバインドは失敗します。そのポートを専有する必要があるときは、次の節のとおり片方を別の行へ移します。
1 つのサイトが 1 行を使う
次の場合は行で分けます。判断はポートと送信元アドレスであり、サイトの数そのものではありません。
2 つのプロセスが同じポートを必要とし、ホスト名では分けられない場合です。どちらも 25 番、または同じ独自ポートを専有する待受が典型です。1 行のそのポートに待受は 1 つだけです。2 つ目は次の行へ置きます。
あるサービスの A レコードが、ほかのサイトとは別の自分のアドレスでなければならない場合、その名前を一覧の別の行へ向けます。プロセスはその行を待受するか、0.0.0.0 を待受してその行を含めます。
送信メール、コールバック、API 呼び出しを先頭行ではなく特定の行として見せる場合、その行はすでに NIC にあり、プログラムがローカルアドレスをその行へ束縛します。A レコードだけを変えても、プログラムが自分で開く接続の送信元は変わりません。
server {
listen 203.0.113.10:443 ssl;
server_name a.example;
}
server {
listen 203.0.113.21:443 ssl;
server_name b.example;
}
203.0.113.10 と 203.0.113.21 は文書用です。一覧の 2 行に置き換えます。1 つ目は先頭行だけ、2 つ目は追加の行だけを受けます。どちらも NIC 上で /32 になっている必要があります。b.example の A レコードは 203.0.113.21 で、先頭行のままにはしません。
0.0.0.0 を待受するプログラムは、あとから足した行にも応答します。サイトを 1 行だけに出すなら、listen にその行を書き、0.0.0.0 は残しません。逆に、先頭行だけを待受するプログラムは、あとから足した行には応答しません。
アドレスを仮想マシンへ渡すとき、その行はゲストの NIC にだけあります。ホストのブリッジや物理ポートに同じ行を書きません。サイトがホスト上で動くなら、先頭アドレスがすでにあるインターフェースに行を残します。
この表で購入数を決める
含まれている先頭行は、割り当てられるアドレス 1 個として数えます。それ以外に単独で使うアドレスが 1 個増えるごとに、追加 IPv4 を 1 個買います。先頭行を共有する名前は個数を増やしません。
| 必要なこと | アドレスの置き方 | 追加購入 |
|---|---|---|
| 複数のウェブサイトが 80/443 で、名前で分ける | A レコードはすべて先頭行 | 0 |
| 4 つのウェブサイトが、それぞれ自分の A レコードと自分の行を持つ | 先頭行を 1 つに、残りは 1 行ずつ | 3 |
| ウェブサイトは先頭行を共有し、別の 2 サービスが独立したアドレスを必要とする | ウェブサイトは先頭行、サービスは 1 行ずつ | 2 |
| 同じポートの 2 プロセスを名前で分けられない | それぞれ別の行で待受 | 少なくとも 1 |
共有できる 4 サイトなら追加は 0 です。それぞれが 1 行を必要とする 4 サイトなら追加は 3 です。含まれる 1 個と合わせて一覧は 4 行です。サイトが 4 つだから /29 相当を買う、にはしません。/29 は 8 アドレスのブロックの書き方です。ここではブロックでは売らず、設定するネットワークアドレスやブロードキャストもありません。
追加アドレスは 1 個あたり月額 $1.6、最大 255 個の追加で、含まれる 1 個と合わせて 256 個までです。5 個の追加は月額 $8.0 です。これを月額に足してから、期間の月数を掛けます。月払いは 1、四半期は 3、半年は 6、年払いは 12 です。どの期間にも割引はありません。
128GB は月額 $454.8、256GB は月額 $612.7 です。メモリは DDR4-3200 ECC RDIMM で、注文後に増設できません。プロセッサは AMD EPYC 7543P、32 コア 64 スレッド、2.8 から 3.7 GHz です。標準は 1TB NVMe が 2 枚、それぞれ直結、ハードウェア RAID はなく、使える容量は合計で約 2TB です。帯域は 250 Mbps からで転送量の上限はありません。1 Gbps は月額 $245.0、2 Gbps は月額 $742.7 です。初期費用はありません。マシンは日本の東京に設置されます。Linux は SSH、Windows は RDP で、どちらも先頭行だけを書きます。
構成ページにはこの表の個数を入れます。0 は、共有するサイトがすべて含まれている行を使うという意味です。サイトのディレクトリだけが増え、ポートも送信元アドレスも変わらないなら、追加個数は増やしません。
新しい接続は先頭行から出る
デフォルトルートはインストール時に先頭行と一緒に書かれます。あとから /32 で足したアドレスは、Linux では同じインターフェースの secondary です。プログラムがソケットを作り、ローカルアドレスを選ばなければ、カーネルはデフォルトルートに沿って送信元を選びます。選ばれるのはプライマリアドレス、つまり先頭行です。
マシン上で経路を尋ねます。相手へ実際に接続する必要はありません。192.0.2.1 は、外向けのデフォルトルートと、そのときの送信元の行をシステムに示させるためだけに使います。
ip route get 192.0.2.1
出力の src は一覧の先頭行です。via は元のゲートウェイです。src があとから足した行になっているなら、デフォルトルートが変わったか、先頭行がこのインターフェースのプライマリではなくなっています。デフォルトルートをインストール時のものに戻し、追加アドレスは /32 のままインターフェースに残します。
すでに開いている入ってくるセッションはこの規則の外です。203.0.113.21 へ接続したクライアントのソケットは、ローカルアドレスが 203.0.113.21 であり、応答の送信元もそれです。ブラウザで追加アドレス上のサイトを開くと、見えるのはその行です。同時に、apt、スケジュールされたジョブ、アドレスを束縛しない HTTP クライアントの src は先頭行のままです。
特定のプログラムの新しい接続を追加行から出すには、そのプログラムの中でローカルアドレスを束縛します。メール、リバースプロキシ、API クライアントには bind や interface があることが普通です。一覧の行をそこに書きます。次のコマンドは確認だけです。送信元がすでに追加行だと仮定し、デフォルトゲートウェイがまだ届くかを見ます。システムの既定は変えず、プログラム内の束縛の代わりにもなりません。
ip route get 192.0.2.1 from 203.0.113.21
from のあとを、確認する行に置き換えます。このとき src はその行です。from を書かなければ、src は先頭行のままです。
ポリシールーティングが扱うのは、送信元がすでに追加行であるパケットです。プログラムがその行を束縛しなければ規則は当たらず、新しい接続は先頭行から出続けます。束縛したあとで出口のゲートウェイが違う場合に、その送信元を別テーブルへ送ります。ゲートウェイとデバイスは ip route show default から写します。メインテーブルのデフォルトルートは動かしません。
ip rule add from 203.0.113.21 table 121
ip route add default via 203.0.113.1 dev eno1 src 203.0.113.21 table 121
table 121 は、送信元がすでに 203.0.113.21 のパケットだけに一致します。ほかのプログラムはメインテーブルのまま、先頭行から出ます。この 2 行も起動設定に書きます。書かないと再起動で規則が消え、追加行を束縛したプログラムはそれまでの出口を失います。メインのデフォルトルートの src を追加アドレスに変えると、更新を含むマシン全体の新しい接続の送信元が変わります。その変更はしません。
Windows でも、ホスト単位のマスクで足し、SkipAsSource が true の追加アドレスは、新しい接続を先頭行から出します。あるプログラムがその行から発信する必要があるときは、プログラムでローカルアドレスを指定するか、そのアドレスの SkipAsSource を false にしてから src を確認します。アダプターに 2 本目のデフォルトゲートウェイは足しません。
メール、DNS、証明書は別々に確認する
メールは 2 つの経路が混ざりやすい場所です。MX、またはメール名の A レコードは追加行を指せ、受信プロセスもそこで待受できるので、入ってくるメールはその行に着きます。マシンが自分で開く新しい配送は、メールプログラムがローカルアドレスを束縛していなければ、相手から見える送信元は先頭行のままです。
SPF に書くアドレスは、相手が実際に見る送信元と一致させます。受信は追加行、送信は先頭行のままなら、SPF には先頭行を書きます。送信がすでに追加行へ束縛されているなら、SPF にはその行を書きます。/29 をまとめて公開しません。
確認はこの順です。
- 01 行数は 1 に追加購入数を足した数です。再起動後も各行が NIC にあります。
- 02 各名前の A レコードは、着くべき行を指します。共有する名前はすべて先頭行です。
- 03 待受アドレスがその A レコードを覆います。先頭行だけを待受するプログラムは、ほかの行に答えません。
- 04 外からその名前のサービスポートを開き、想定した行に着くことを確認します。
- 05 マシンで ip route get 192.0.2.1 を実行し、束縛しない新しい接続の src が先頭行であることを確認します。別の送信元が必要なプログラムは、自分でその行を束縛します。
- 06 SSH または RDP は先頭行のままです。管理を追加アドレスだけに移すと、コンソールの接続コマンドと一致しなくなります。
証明書はホスト名に従います。共有する 1 行では、SNI が 1 つのポートで証明書を選びます。行を分けると待受アドレスは違いますが、証明書は訪問時の名前で選ばれます。アドレスを移しても、名前がアドレスそのものである証明書は要りません。
ファイアウォールが許可するのはポートです。アドレスが NIC にあり、A レコードがそこを指していても、ポートが閉じていればタイムアウトします。6 項目を終えてからファイアウォールを見ます。6 項目が揃えば、サイトは名前で先頭行を共有するか、一覧の行を 1 つずつ使い、束縛しない外向き通信は先頭行から出ます。