没有子网时,额外 IPv4 怎么桥到 Proxmox 来宾?

每台机器包含 1 个 IPv4,这个地址留在宿主机上,用来登录。还要让虚拟机自己对外,就按个增加地址,每个每月 $2,最多再加 255 个。这些地址不是一段可以再切分的子网。来宾使用其中某一个地址的 /32。一个额外地址都没有时,只做端口转发。

vmbr0 桥接还是 NAT,先看有没有额外地址

检索结果里常见两种做法:把虚拟机接到 vmbr0,或者在宿主机上做 NAT。两种都能在实验环境里把系统装起来。接到这台机器上时,要先数地址。控制台里的地址可能写在同一串里,用逗号、空格或分号隔开。切开之后,第一个是管理地址,SSH 只用这一个。后面的才是可以交给来宾的额外地址。

已含的那 1 个不能既当宿主机的登录地址,又当来宾唯一的公网地址。把它从 vmbr0 上拿下来配进虚拟机,宿主机的 SSH 会跟着消失。额外地址按个购买,一个来宾用一个。没有购买额外地址时,来宾只持有私网地址,外部访问走管理地址上的指定端口。这就是 NAT。有额外地址时,不要把来宾直接接到 vmbr0 去共享一段并不存在的前缀,而是另建一条没有物理网卡的内部桥,把该地址以 /32 交出来宾。

vmbr0只留管理地址
/32每个额外地址
端口转发没有额外地址时
手里的地址来宾接在来宾怎么对外
只有管理地址内部桥 vmbr1私网地址,由宿主机按端口转发
另外买了若干个 IPv4同一条 vmbr1其中一个公网地址,掩码 /32
教程里的 /28 或 /29不要这么接这张订单没有这段前缀

地址怎样分到站点、证书或白名单,是另一件事,见额外地址按个分到业务。这一篇只处理 Proxmox 来宾的进出。

管理地址留在宿主机

下单时选择 Proxmox VE 8 或 Proxmox VE 9。这两份系统已经在镜像列表里,机器交付后直接 SSH 到管理地址。不需要再用 U 盘安装一遍,也不需要在安装向导里重选网卡。

登录后先看现状,再改文件。ip -4 addr 里,用来 SSH 的那个地址应出现在 vmbr0 上。ip route show default 里 via 后面是网关,dev 后面应是 vmbr0。这两行是镜像已经写好的管理配置。前缀可能不是 /32,保持原样,不要改成某篇教程里的 /24 或 /28。物理网卡的名字写在 vmbr0 的 bridge-ports 里,以 /etc/network/interfaces 的现有内容为准,不要改成 eth0 或 ens3,除非 ip link 里确实是这个名字。

额外地址有时已经以别名出现在同一块桥上,有时只写在交付说明里。用全局范围的 IPv4 个数核对:应等于 1 加上订单里的额外个数。少了就先停,用工单核对,不要拿别的机器的地址来填。个数对了之后,把准备交给来宾的那些地址从宿主机配置里去掉,只留下管理地址。同一个地址不能同时写在宿主机别名和来宾网卡上,否则入站先到宿主机,来宾侧的服务收不到连接。

改 vmbr0 的地址、前缀或网关之前先停。管理地址一旦写错,这次 SSH 会断。控制台里的图形接入不依赖这次 SSH,改坏时可以从那里改回文件。这一篇的步骤不需要改 vmbr0 上的管理地址。

照着子网教程做,为什么出不去

通用教程默认机房已经把一整段前缀交到 vmbr0,网关是这段里的第一个地址,来宾从剩下的地址里挑一个,掩码和宿主机相同。来宾的网卡能显示为已启动,因为地址已经写进接口。出站时,来宾按那段掩码判断网关在同一链路,于是发送 ARP。这段前缀在这台机器上并不存在,ARP 没有应答,默认路由不会生效。从外面看,虚拟机已经开机,端口却没有服务。

另一种写法则把来宾接到 vmbr0,地址填成额外 IPv4,网关抄宿主机的网关,掩码仍写成 /24 或 /28。额外地址是按个提供的,不是一段可以再划分的前缀。上游把这些地址送到这台机器,而不是送到虚拟机自己的 MAC 去抢网关。来宾在 vmbr0 上发出的 ARP 到不了应有的下一跳,或者回包仍落到宿主机原来的别名上。界面里看得到地址,ping 出不去。

还有一种叠法:宿主机开了源地址转换,来宾又以为自己持有公网地址。出去的包被改写成管理地址,回来的连接对不上来宾上的会话。要独立公网地址时,这个额外地址不能再做源地址转换。要端口转发时,来宾就不要再配置公网地址。两种做法不要叠在同一个地址上。

额外地址以 /32 交到内部桥

内部桥的名字用 vmbr1。它不接物理网卡,只给来宾和宿主机之间用。在 /etc/network/interfaces 末尾增加这一段,私网地址可以改,但宿主机和来宾必须在同一段。若 10.10.10.0/24 已经有人使用,换成另一段私网。下面的 203.0.113.20 是文档用例,换成订单里的某一个额外地址,一个地址一行。

宿主机这一段要有: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 里选择桥接 vmbr1,型号用 VirtIO。这里没有 NAT 开关。来宾系统里把该公网地址写成 /32,对端和默认网关都是 10.10.10.1。Debian 系的接口文件写成 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。

一台需要独立公网地址的来宾使用一个额外地址。第二台来宾使用下一个额外地址,仍接在 vmbr1,再加一条 /32 路由。不要把几个来宾配进同一个虚构的 /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 生效。把 -A 先换成 -C 做一次检查,已存在就不要重复追加,否则 ifreload 几次之后会出现一串相同规则。

不要把管理地址的 TCP 22 转走,那是宿主机的 SSH。网站、接口或来宾自己的远程桌面使用别的外部端口。Windows 来宾需要 RDP 时,可以把管理地址上一个选定的端口转到该来宾的 3389,宿主机的 22 保持不动。来宾上的服务要监听私网地址或所有地址,只监听一个并不存在的公网地址时,转发过去也没有进程接收。

端口转发不增加地址,也不提高带宽。250M、1G、2G 是另一项,三档都不限流量。十个来宾若都从管理地址出去,外面看到的源地址仍是这一个。对方白名单若要求每个服务一个来源,就回到上一节,按个购买额外地址,而不是在转发规则里假装有一段子网。

从机房以外核对三次

  1. 管理地址仍能登录

    从办公室或家里的网络 SSH 到第一个地址。会话应落在宿主机,而不是某一台来宾。控制台里的地址串不要整段贴进 SSH。

  2. 额外地址落在对应来宾

    对每个准备启用的额外地址访问一次实际服务。宿主机上 ip route get 指向 vmbr1。来宾上 ip -4 addr 能看到这个 /32。只在宿主机上 curl 自己的地址,常常走本地回环,看不出外部路径。

  3. 没有额外地址时核对端口

    从外部访问转发后的端口,响应应来自来宾。再访问宿主机的 22,响应应仍是宿主机。两条都通,才算转发没有把登录入口换掉。

  4. 重启后再看一遍

    重启宿主机。管理地址、内部桥、/32 路由或端口转发都应还在。sysctl net.ipv4.ip_forward 应为 1。缺任何一项,就回到接口文件,不要只在这次会话里补命令。

若地址和路由都对,外部仍不通,再看防火墙。数据中心或节点的防火墙打开时,转发链可能被默认策略丢掉。排查时可以先在这一张来宾网卡上关闭防火墙,路径通了之后再按端口写允许规则。不要为了省事把整台宿主机的过滤长期清空。

来宾网卡名在虚拟机里面可能是 ens18 或 eth0,以该来宾里的 ip link 为准。配置写错网卡名时,地址不会出现,路由命令也不会报出“子网不存在”。先看接口是否起来,再看默认路由的下一跳是不是 10.10.10.1。

个数和月租一起算

额外 IPv4 每个每月 $2,填写的是个数,不是前缀长度。4 个是每月 $8,20 个是每月 $40。加上已含的 1 个,合计不超过 256 个。这些地址和主机、硬盘、带宽、系统加在同一个月租里,再乘周期月数。季付是月租的 3 倍,半年付 6 倍,年付 12 倍,不另打折。无安装费。

128GB 这一档月租 $455,已含 1 个 IPv4 和 250M。256GB 这一档月租 $612,地址规则相同。两档都是 AMD EPYC 7543P,32 核 64 线程,内存是 DDR4-3200 ECC RDIMM。要 256GB 就选那一档,不能在 128GB 的机器上再加内存条。内存档不附带更多地址。带宽升到 1G 每月加 $248,地址个数不变。

机器部署在日本东京。宿主机登录用 SSH,管理地址在控制台。选了 Windows 的来宾使用 RDP,那是来宾自己的接入,不替换宿主机的管理地址。Proxmox VE 8 和 9 都在免费系统列表里,按镜像交付,不另做安装介质。

额外地址按个桥进来宾。

$455 / 月起