服务器交付时,只配置了一个 IPv4 地址,其余的都留给你。这是有意为之,本页就是教你如何完成剩下的工作。有三种方法,都不费时:让虚拟机直接接入网络、拥有自己的地址;让流量经由宿主机转发;或者把一批机器藏在你已有的地址后面。我们在撰写本文之前,在自己的网络上对这三种方法都做了测试。
先读前两步。之后,第三、四、五步是三种可选方案 — 选择与你正在搭建的环境相匹配的那一个。
找一封标题为 Dedicated Server Setup 的邮件,是机器创建当天发出的。里面列出了分配给服务器的所有内容:先是 IPv4 地址,然后是 IPv6。同样的列表也在你的账户里,在服务器页面上,位于 Access, Networking & rDNS 面板中。
在 Proxmox 服务器上,这封邮件在列表下方多加了一行,告诉你宿主机只配置了第一个地址,其余的由你自行分配 — 给虚拟机,或者如果你想让宿主机持有多个地址,也可以给宿主机。我们只配置一个地址,让机器启动后就能连通,然后就不再动了。如果你把全部地址都配在宿主机上,它就会为所有地址应答,你的虚拟机就没什么可认领的了。
每次输入地址时,有两个数字至关重要。子网掩码是 /24,即 255.255.255.0。网关是该地址所在网段的 .1 — 所以 203.0.113.0/24 网段里的地址,网关就是 203.0.113.1。一起发放的地址彼此相邻,共用一个网关。几个月后给服务器追加的地址可能来自我们的另一个网段,那时它们就用各自的 .1。搞错这一点,是新建虚拟机无法连通任何东西的最常见原因,会让人白白耗掉一个下午。
DNS 方面,我们在宿主机上配置了 209.244.0.3。你的虚拟机想指向哪里都行。
通过 SSH 以 root 登录,查看一下:
ip -br addr cat /etc/network/interfaces
在我们刚建好的机器上,这个文件大致如下,接口名和第一个地址会换成你自己的:
auto lo
iface lo inet loopback
iface eno1 inet manual
auto vmbr0
iface vmbr0 inet static
address 203.0.113.10/24
gateway 203.0.113.1
bridge-ports eno1
bridge-stp off
bridge-fd 0 值得注意的一点是,vmbr0 已经是一个网桥,网卡也已经插在上面了。第三步不需要其他任何东西,所以第三步要求你在这里什么都不用改。
Proxmox VE 9 基于 Debian 13,使用 ifupdown2,所以网络变更无需重启机器即可生效。保存文件后运行:
ifreload -a
如果改用 Proxmox 网页界面编辑,你的更改会写入 /etc/network/interfaces.new,直到你点击 Apply Configuration 才会生效。无论用哪种方式,都请先从账户里打开控制台。这个文件里一个拼写错误,机器就会从网络掉线;控制台走的是另一条路,仍然能用。
从这里开始。你的虚拟机就像一台独立的电脑,插在同一个交换机上,自己与我们的路由器通信,宿主机完全不需要任何改动。
在 Proxmox 中,给虚拟机添加一个网络设备,网桥设为 vmbr0,MAC 地址保留 Proxmox 自动填写的。然后在虚拟机内部设置地址。Debian 或 Ubuntu 的经典配置:
auto lo
iface lo inet loopback
auto ens18
iface ens18 inet static
address 203.0.113.58/24
gateway 203.0.113.1
dns-nameservers 209.244.0.3 1.1.1.1 Ubuntu 使用 netplan,在 /etc/netplan/01-netcfg.yaml 中:
network:
version: 2
ethernets:
ens18:
addresses: [203.0.113.58/24]
routes:
- to: default
via: 203.0.113.1
nameservers:
addresses: [209.244.0.3, 1.1.1.1] 在 Windows 上,同样的三个值填入网卡的 IPv4 设置。虚拟机跑什么系统真的无所谓;对我们来说,它就是网线上多了一台电脑。
不需要事先通知我们。 你不必把每台虚拟机的 MAC 地址发给我们,我们也不限制你的端口能使用多少个。不少托管商有这种要求,他们的教程让你为每台新机器填表。我们核实过而不是想当然:你服务器所在的端口没有设置 MAC 数量限制,端口安全也是关闭的,而且在发布本文之前,我们在一台员工机器的客户端口上加了第二个地址和 MAC,从公网成功访问到了它。
有三件事值得做对:
• 每台机器都需要自己的 MAC 地址。两台机器共用一个,或者复制宿主机的,两台都工作不正常。
• 使用该地址所在网段对应的网关,见第一步。
• 只使用你账户上的地址。 这个网桥面对的是一个真实网络,上面还有其他人的机器。一个不属于你的地址,会把别人的流量也带走。
同理:任何分发地址的东西都不该放在 vmbr0 上。不要 DHCP 服务器,不要路由器通告。如果你想自动给自家机器分配地址,用第五步,那个网桥没有出口,够不到任何人。
当你希望宿主机看到每一个数据包、让它的防火墙能够处理,或者你更愿意让机器完全不出现在共享网络上时,选这个方案。它们仍然从你的账户获得真实的公网地址;只是路径变了。
公网地址从网桥上拿下来,放到网卡上,宿主机被告知要转发,并代表它后面的机器应答。在宿主机上:
auto lo
iface lo inet loopback
auto eno1
iface eno1 inet static
address 203.0.113.10/24
gateway 203.0.113.1
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp
auto vmbr0
iface vmbr0 inet manual
bridge-ports none
bridge-stp off
bridge-fd 0
up ip route add 203.0.113.58/32 dev vmbr0
down ip route del 203.0.113.58/32 dev vmbr0 每个用这种方式路由的地址,都要有一行 up 和一行 down。在虚拟机内部,地址是 /32,而且必须先有一条显式路由指向宿主机,再走默认路由:
auto lo
iface lo inet loopback
auto ens18
iface ens18 inet static
address 203.0.113.58/32
post-up ip route add 203.0.113.10 dev ens18
post-up ip route add default via 203.0.113.10
dns-nameservers 209.244.0.3 1.1.1.1 不要漏掉 proxy_arp 那一行。我们的路由器会向网络询问谁持有每个地址,正是这一行让宿主机替它后面的机器应答。漏掉它,那些机器就完全不可见了。两行 post-up echo 是 Proxmox 自己的写法。要永久设置,可以往 /etc/sysctl.d/ 里放一个文件,内容为:
net.ipv4.ip_forward=1 net.ipv4.conf.eno1.proxy_arp=1
多花这些功夫换来的是,宿主机能够过滤和记录每一个数据包。如果你不需要这些,第三步出错的机会更少。
很多机器只会主动发起连接:构建执行器、队列工作者、外部不该碰的数据库。给它们在一个没有出口的网桥上分配私有地址,让宿主机在流量经过时把它转换到自己的地址上。这不会占用你的任何配额,所以硬件能承载多少,你就能跑多少。
添加第二个网桥,vmbr0 保持原样不动:
auto vmbr1
iface vmbr1 inet static
address 10.10.10.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE 把机器放到 vmbr1 上,给每台一个该网段内的地址,网关设为 10.10.10.1,它们就能上网了。在互联网的其他部分看来,它们就是你的服务器。除非你主动要求,外部无法访问它们;而所谓要求,就是在第一条规则旁边再加一条,用宿主机尚未占用的端口:
post-up iptables -t nat -A PREROUTING -i eno1 -p tcp --dport 8443 -j DNAT --to 10.10.10.2:443 post-down iptables -t nat -D PREROUTING -i eno1 -p tcp --dport 8443 -j DNAT --to 10.10.10.2:443
这个网桥没有物理端口,所以在上面跑 DHCP 服务器是安全的,也是给后面机器分配地址的整洁方式。
你拥有的是若干个独立的 IPv6 地址,而不是一个可以再划分的地址块。 它们在同一封开通邮件的底部,放置方式与 IPv4 完全一样,一次一个:想让宿主机通过 IPv6 可达,就在宿主机上放一个;其余的放在需要它们的机器上。安装程序不会配置其中任何一个,所以这些都要你自己加。
每个地址末尾写上 /64,网关是 前缀后面跟 ::1 — 2001:db8:1234::/64 内的地址,网关就是 2001:db8:1234::1。在宿主机上,紧挨着已有的网桥:
iface vmbr0 inet6 static
address 2001:db8:1234::2/64
gateway 2001:db8:1234::1 在网桥上的虚拟机里:
iface ens18 inet6 static
address 2001:db8:1234::5/64
gateway 2001:db8:1234::1 然后照旧 ifreload -a。因为这些是独立地址,而不是你自己的地址块,所以不要通告路由,也不要分发没给你的地址。觉得不够用?找我们。
反向 DNS 你自己就能设置,任何地址都行,不用问任何人。登录后打开服务器,找到 Access, Networking & rDNS 面板。每个地址都列出了它当前应答的名称,旁边有一个 Edit rDNS 按钮。IPv6 地址也一样。
输入框要的是主机名:字母、数字、连字符和点,每段 1 到 63 个字符,至少两段,末尾的点会自动补上。等几分钟生效。
如果机器要发邮件,要命名的地址是邮件实际发出的那个 — 用第五步的话,是宿主机的地址,不是虚拟机的 — 你还需要在 DNS 提供商那里配上对应的正向记录。对端的邮件服务器会检查两者是否一致,不一致就拒收。
大家看完本页后常问的问题。