先把入站和出站拆開
一臺機器上放多個站台,位址怎麼分配是另一件事。這一篇只處理兩件:請求進來時落在列表的哪一行,以及機器自己向外發起連接時從哪一行出去。
控制台把位址拆成多行。第一行用於 SSH 或 RDP。其餘每一行都是單獨買下的 IPv4,不是一段子網裡的空位。行如何加到網卡上、如何在重新開機後還在,按 把單個額外位址加進網卡 做完,再來分給站台。
入站看 DNS 和監聽位址。域名的 A 記錄指向哪一行,客戶端就連哪一行。程式若只監聽第一行,連到其它行的同一埠沒有進程應答。
出站看這條連接是誰發起的。別人連到某一行之後,這條會話的應答從那一行回去。機器自己新開的連接,例如更新、接口調用、向外發信,在程式沒有指定本地位址時,源位址是持有預設路由的第一行。
多個站台共用第一行
站台都是網頁,埠都是 80 和 443,用域名就能分開時,全部解析到第一行。不需要為每個域名再買一個位址。
DNS 裡每個域名一條 A 記錄,值都寫第一行。Web 服務監聽 0.0.0.0 的 443,或只監聽第一行的 443。按收到的主機名選擇站台目錄和證書。證書按域名簽發,和位址行數無關。共用一行時,SNI 在同一埠上把證書分開。
server {
listen 443 ssl;
server_name a.example;
}
server {
listen 443 ssl;
server_name b.example;
}
兩段都沒有寫死位址,表示聽在這張網卡的全部位址上,再由 server_name 區分。若改成 listen 203.0.113.10:443 ssl,就只有第一行的 443 會進入這兩段。額外位址上的 443 不會落到這裡。
IIS 用主機頭做同樣的區分:綁定的 IP 選第一行或「全部未分配」,主機名分別填每個域名,埠都是 443。新增一個站台,是新增一條綁定和一條 A 記錄,不是新增一行位址。
這種方式下,兩個程式不能同時獨佔同一行上的同一個埠。第二個進程綁定失敗。若業務必須獨佔這個埠,改到下一節,把其中一個放到另一行。
一個站台佔用一行
下面幾種情況按行分開。判斷依據是埠和來源位址,不是站台數量本身。
兩個進程都要監聽同一個埠,又不能靠主機名區分,例如兩套都要獨佔 25 或都要獨佔某個自定義埠。一行上這個埠只能有一個監聽者,第二個放到下一行。
某個服務的 A 記錄必須是它自己的位址,和其它站台的位址不同。把該域名指到清單裡的另一行,並讓進程監聽這一行,或者監聽 0.0.0.0 從而包含這一行。
對外發信、回調或接口希望來源顯示成某一行,而不是第一行。這一行要已經在網卡上,並且這個程式把本地位址綁到它。只把 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 是文檔位址,換成清單上的兩行。第一段只接第一行,第二段只接額外那一行。兩行都要已經按 /32 加在網卡上。b.example 的 A 記錄寫 203.0.113.21,不要仍寫第一行。
監聽 0.0.0.0 的程式會同時應答新加上的行。若某個站台必須只出現在一行上,把 listen 寫成那一行,不要留著 0.0.0.0。反過來,只監聽第一行的程式,不會應答後來加上的行。
位址分給虛擬機時,這一行只出現在虛機網卡上。宿主機的橋或物理口不要再配置同一行。網頁放在宿主機上時,行就留在宿主機已經持有第一行的那個接口。
按這個表決定買幾個
已含的第一行算一個可以分出去的位址。每個還要單獨佔用的位址,再買 1 個額外 IPv4。共用第一行的那些域名不增加個數。
| 要做的事 | 位址怎麼放 | 額外購買 |
|---|---|---|
| 多個網站都用 80/443,靠域名分開 | A 記錄都指向第一行 | 0 |
| 4 個網站各自一條 A 記錄、各佔一行 | 第一行給其中一個,其餘各一行 | 3 |
| 網站共用第一行,另有 2 個服務要獨立位址 | 網站留在第一行,兩個服務各一行 | 2 |
| 同一埠兩個進程,不能靠域名分 | 各聽一行 | 至少 1 |
四個網站若可以共用,額外個數是 0。四個網站若必須各佔一行,額外個數是 3,加上已含的 1 個,清單裡是 4 行。不要按「四個站大約要一段 /29」去買。/29 是 8 個位址的網段寫法,這裡不按網段賣,也沒有網路位址和廣播位址可以配置。
額外位址每個每月 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 各自直連,無硬體 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 仍是第一行。
要讓某一個程式的新連接從額外行出去,在那個程式裡綁定本地位址。郵件、反代和接口客戶端通常有 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 的包。其它程式仍走主表,從第一行出去。這兩行要寫進啟動配置,否則重新開機後規則消失,綁定過的程式會找不到原來的出口。把主表預設路由的 src 改成額外位址,整臺機器的新連接都會改源,包括系統更新,這一步不做。
Windows 上,額外位址按單主機遮罩追加,並且 SkipAsSource 為 true 時,新連接同樣從第一行出去。某一程式需要從那一行發起時,在程式裡指定本地位址,或把該位址的 SkipAsSource 設為 false 後再單獨驗證 src。不要在適配器上增加第二條預設閘道。
發信、DNS 和證書分開核對
郵件最容易把兩件事混在一起。MX 或郵件域名的 A 記錄可以指向額外那一行,收信進程也監聽那一行,別人發進來的信就落在這一行。本機向外投遞的新連接,在郵件程式沒有綁定本地位址時,對方看到的源位址仍是第一行。
SPF 裡發布的位址,要和對方實際看到的源位址一致。收信用額外行、發信仍從第一行出去時,SPF 寫第一行。發信已經綁定到額外行時,SPF 寫那一行。不要按一段 /29 去發布整段。
核對按這個順序做。
- 01 清單行數等於 1 加上額外購買個數。每一行都在重新開機後的網卡上。
- 02 每個域名的 A 記錄指向它應該落在的那一行。共用的域名都指向第一行。
- 03 監聽位址覆蓋這條 A 記錄。只監聽第一行的程式,不會應答其它行。
- 04 從外面臨時訪問該域名的業務埠,確認進的是預期的那一行。
- 05 在機器上執行 ip route get 192.0.2.1,確認未綁定的新連接 src 仍是第一行。要改源位址的程式,在程式裡綁定清單上的那一行。
- 06 SSH 或 RDP 仍使用第一行。管理服務不要改成只監聽額外位址,否則控制台裡的連接命令對不上。
證書跟在域名後面。共用一行時,同一埠靠 SNI 選擇證書。各佔一行時,監聽位址不同,證書仍按訪問時的主機名選擇。換位址不必換一套與位址綁定的證書名稱。
防火牆放行的是埠。位址已經在網卡上、A 記錄也指向它,埠沒有放行時,連接仍會超時。先完成上面六步,再看防火牆。六步都符合,站台用域名分在第一行,或各佔清單裡的一行,出站預設仍從第一行離開。