先把入站和出站拆开
一台机器上放多个站点,地址怎么分配是另一件事。这一篇只处理两件:请求进来时落在列表的哪一行,以及机器自己向外发起连接时从哪一行出去。
控制台把地址拆成多行。第一行用于 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 记录也指向它,端口没有放行时,连接仍会超时。先完成上面六步,再看防火墙。六步都符合,站点用域名分在第一行,或各占清单里的一行,出站默认仍从第一行离开。