这次在一台 OVH 独立服务器上安装 PVE,再运行 MikroTik CHR。服务器只有一个主公网 IPv4,没有 Additional IP,最终由 RouterOS 接管公网,PVE 通过内网访问互联网,并通过端口映射提供管理入口。
过程中最关键的问题是:把服务器物理网口的 MAC 交给 CHR 后,必须同时处理 PVE 物理网口和网桥的 MAC,否则 Linux 网桥可能把发往 CHR 的流量当成本机流量。
本文公网 IPv4 使用文档示例地址
203.0.113.10,网关使用203.0.113.254,MAC 也已替换。不能直接照抄用于实际部署。
一、最终网络结构
OVH 公网
│
eno1
│
vmbr0:公网桥,无公网 IP
│
CHR WAN:203.0.113.10/24
│ 默认网关:203.0.113.254
│
CHR lan:192.168.88.1/24
│
vmbr1:内部桥
│
PVE:192.168.88.2/24
默认网关:192.168.88.1
公网 IP 只配置在 CHR 上,不同时配置在 PVE 上。
CHR 使用两张 VirtIO 网卡:
| 网卡 | PVE 网桥 | RouterOS 接口 |
|---|---|---|
| net0 | vmbr1 | lan |
| net1 | vmbr0 | WAN |
二、先搭内网,再迁移公网
安装 CHR 时,先只连接 vmbr1,保留 PVE 原有公网配置。
PVE 内部桥配置:
auto vmbr1
iface vmbr1 inet static
address 192.168.88.2/24
bridge-ports none
bridge-stp off
bridge-fd 2
CHR 配置内网地址:
/interface ethernet set [find default-name=ether1] name=lan
/ip address add address=192.168.88.1/24 interface=lan
在 PVE 上验证:
ping -c 3 192.168.88.1
ssh admin@192.168.88.1
先保证 PVE 能通过 SSH 管理 CHR,再继续公网切换。 相比在虚拟机控制台里操作,SSH 更方便复制命令、查看输出和排查问题。
注意接口名称区分大小写。本次实际接口名是 lan,之前使用 LAN 的命令未能正确执行,造成部分配置缺失。
三、MAC 冲突是本次最大的坑
为了让 CHR 使用服务器原来的公网 MAC,本次把 CHR WAN 设置为物理网口的原 MAC。
示例:
| 接口 | 最终 MAC |
|---|---|
| CHR WAN | 00:11:22:33:44:55,服务器原 MAC |
| PVE eno1 | 02:11:22:33:44:56 |
| PVE vmbr0 | 02:11:22:33:44:57 |
这里的两个 02: 地址是本地管理 MAC,需要确保在所在二层网络中唯一。
最初只修改了 vmbr0 的 MAC,没有修改 eno1,出现了日志:
vmbr0: received packet on tap100i1 with own address as source address
此时 CHR 的表现是:
- WAN 显示运行中。
- 公网地址配置正确。
- 默认路由已经激活。
- 网关和公网地址均 ping 不通。
- 网关 ARP 状态为
failed。
在 PVE 查看:
bridge fdb show br vmbr0
发现物理网口仍有原 MAC 的本地永久条目:
00:11:22:33:44:55 dev eno1 master vmbr0 permanent
因此,仅修改网桥 MAC 不够,物理网口仍会让网桥将该 MAC 视为本机地址。
在切换后的网络状态下,给物理网口设置不同的 MAC:
ip link set dev eno1 address 02:11:22:33:44:56
ip link set dev vmbr0 address 02:11:22:33:44:57
处理后,CHR 恢复公网连通。
这一步是在本机配置和抓包结果基础上采用的方案,不应把克隆物理 MAC 当成所有 OVH 产品的通用要求。
四、更换虚拟网卡 MAC 后,要检查 RouterOS 接口引用
在 PVE 修改 CHR 虚拟网卡 MAC 后,RouterOS 将它识别成了新接口,名称重新变成 ether2。
原先绑定 WAN 的配置出现:
interface=*3
out-interface=*3
*3 表示原来的接口引用已经失效。把新接口重新命名为 WAN,并不会自动恢复旧引用。
修复方式:
/interface ethernet set [find default-name=ether2] name=WAN
/ip address set [find address="203.0.113.10/24"] interface=WAN
/ip firewall filter set [find comment="Allow LAN to Internet"]
in-interface=lan out-interface=WAN
/ip firewall nat set [find comment="LAN Internet NAT"]
action=masquerade out-interface=WAN
更稳妥的顺序是:先确定虚拟网卡 MAC,再配置 RouterOS 地址和防火墙。
五、PVE 最终网络配置
下面是脱敏后的 IPv4 配置示例:
auto lo
iface lo inet loopback
auto eno1
iface eno1 inet manual
hwaddress 02:11:22:33:44:56
iface eno2 inet manual
auto vmbr0
iface vmbr0 inet manual
bridge-ports eno1
bridge-stp off
bridge-fd 2
hwaddress 02:11:22:33:44:57
auto vmbr1
iface vmbr1 inet static
address 192.168.88.2/24
gateway 192.168.88.1
bridge-ports none
bridge-stp off
bridge-fd 2
source /etc/network/interfaces.d/*
这次没有继续迁移公网 IPv6,而是移除了 PVE 原来的静态公网 IPv6 配置。
应用之前检查语法:
ifreload -a -s
本次安装的工具对 bridge-fd 0 给出范围警告:
valid attribute range: 2-255
改为 bridge-fd 2 后通过检查。这里关闭了 STP。
另外,配置文件中的 MAC 不等于运行中的 MAC。应用后必须检查实际状态:
ip -br link show eno1
ip -br link show vmbr0
ip -br addr
ip route
六、CHR 的公网路由与内网 NAT
公网地址和默认路由示例:
/ip address add address=203.0.113.10/24 interface=WAN
/ip route add dst-address=0.0.0.0/0 gateway=203.0.113.254
内网出站 NAT:
/ip firewall nat add chain=srcnat out-interface=WAN
action=masquerade comment="LAN Internet NAT"
本次早期还遇到两个独立问题:
- 没有默认路由,CHR 自身无法访问公网。
- 没有 LAN 到 WAN 的放行规则,PVE 的转发流量被丢弃。
因此要分两层测试:
# 在 CHR 中
/ping 203.0.113.254 count=3
/ping 1.1.1.1 count=3
# 在 PVE 中
ping -c 3 192.168.88.1
ping -c 3 1.1.1.1
CHR 能上网,只证明路由器出口正常;PVE 也能上网,才说明内部路由、转发和 NAT 都正常。
七、防火墙允许端口映射,避免每次重复加规则
最初采用默认拒绝的转发策略,每增加一个 NAT 映射,都需要添加对应的放行规则,维护起来比较麻烦。
后来增加一条通用规则:允许从 WAN 进入、已经匹配目标 NAT 的转发流量。
/ip firewall filter add chain=forward action=accept
in-interface=WAN connection-nat-state=dstnat
place-before=[find comment="Drop other forwarding"]
comment="Allow WAN port forwards"
这条规则必须放在最终的转发丢弃规则之前。
之后新增端口映射,只需要添加 NAT 规则,不必再为每个映射单独放行。
这里要区分:
| 流量 | 防火墙链 |
|---|---|
| 访问 ROS 自身的 SSH、WinBox | input |
| 通过 ROS 访问后面的 PVE 或虚拟机 | forward |
八、通过公网 8006 访问 PVE
添加目标 NAT:
/ip firewall nat add chain=dstnat in-interface=WAN
protocol=tcp dst-port=8006 action=dst-nat
to-addresses=192.168.88.2 to-ports=8006
comment="Forward PVE HTTPS"
配合上一节的通用端口映射放行规则,即可从外部访问:
https://203.0.113.10:8006
登录使用 PVE 账号,不是 RouterOS 账号。
本例是外部网络访问。内网通过同一公网地址访问,可能还需要单独处理 hairpin NAT 或内部 DNS。
九、ROS 公网管理需要同时放开服务和防火墙
公网 ping 通,不代表 SSH 或 WinBox 可以登录。
服务本身的访问范围和 input 防火墙都要允许。本次按使用需求,将 SSH、WinBox 对公网开放:
/ip service set ssh disabled=no address=0.0.0.0/0
/ip service set winbox disabled=no address=0.0.0.0/0
/ip firewall filter add chain=input action=accept
in-interface=WAN protocol=tcp dst-port=22,8291
place-before=[find comment="Drop other input"]
comment="Allow public SSH and WinBox"
这只开放指定管理端口,并没有清空整个防火墙。公网开放后会收到扫描和登录尝试,账号密码与系统更新仍需维护。
十、远程改网络,必须准备回滚
本次所有切换都通过 IPMI 执行,避免公网断开后无法恢复。
操作前备份:
cp -a /etc/network/interfaces /root/interfaces.pre-cutover
回滚脚本要同时恢复:
- CHR WAN 断开状态。
- PVE 物理网口原 MAC。
- PVE 原网络配置。
回滚时不要更换 CHR 虚拟网卡 MAC,否则 RouterOS 可能再次生成新接口,导致原有引用失效。
还可以用定时任务安排自动回滚:
systemd-run --unit=chr-net-rollback --on-active=10m
/bin/bash /root/rollback-chr-network.sh
确认 CHR、PVE 都能访问公网后,再取消:
systemctl stop chr-net-rollback.timer
本次完成了公网接管、ROS 公网管理和 PVE 8006 映射。最后还应核对 MAC 配置已经持久化,并在有 IPMI 的情况下安排重启验证,确认启动顺序、网络配置和管理入口都能恢复。
如果想要改动内网网段
需要同步修改 ROS 的 LAN 地址、PVE 管理地址和默认网关,以及引用旧网段的规则。
以迁移到 192.168.50.0/24 为例:
| 项目 | 原配置 | 新配置 |
|---|---|---|
| ROS lan | 192.168.88.1/24 |
192.168.50.1/24 |
| PVE vmbr1 | 192.168.88.2/24 |
192.168.50.2/24 |
| PVE 默认网关 | 192.168.88.1 |
192.168.50.1 |
| PVE 8006 映射目标 | 192.168.88.2 |
192.168.50.2 |
建议采用先加新地址、测试后删除旧地址的方式,全程保留 IPMI。
1. ROS 先添加新 LAN 地址,暂时保留旧地址
/ip address add address=192.168.50.1/24 interface=lan
2. PVE 临时添加新地址,验证内网
在 PVE 执行:
ip address add 192.168.50.2/24 dev vmbr1
ping -c 3 192.168.50.1
3. 修改 PVE 持久配置
编辑 /etc/network/interfaces,将 vmbr1 改为:
auto vmbr1
iface vmbr1 inet static
address 192.168.50.2/24
gateway 192.168.50.1
bridge-ports none
bridge-stp off
bridge-fd 2
其他接口和 MAC 保持原配置。通过 IPMI 检查并应用:
ifreload -a -s
ifreload -a
ip -br addr show vmbr1
ip route
ping -c 3 1.1.1.1
检查 /etc/hosts:如果 PVE 主机名仍对应旧内网地址或原公网地址,应将它更新为新的管理地址,保留原主机名和域名。
4. 修改 ROS 中指向 PVE 的端口映射
/ip firewall nat set [find comment="Forward PVE HTTPS"] to-addresses=192.168.50.2
如果还保留之前的专用 8006 放行规则,也要修改:
/ip firewall filter set [find comment="Allow PVE HTTPS"] dst-address=192.168.50.2
已经删除这条专用规则、使用通用 Allow WAN port forwards 的话,跳过第二条。
以下规则按接口匹配,不需要修改:
in-interface=lan的内网管理规则。lan → WAN的转发规则。out-interface=WAN的 masquerade。- 通用端口映射放行规则。
另外检查这些可能引用旧地址的地方:
- SSH、WinBox 的
address访问范围;目前若为0.0.0.0/0,无需修改。 - 防火墙中的
src-address、dst-address和地址列表。 - 若启用了 DHCP:地址池、DHCP network 的网段、网关和 DNS。
- 其他虚拟机的静态地址、网关,以及 PVE 防火墙中配置的旧网段。
5. 验证后清理旧地址
确认 PVE 能上网、外部能访问 8006,以及下面的 SSH 能连接:
ssh admin@192.168.50.1
再在 ROS 删除旧地址:
/ip address remove [find address="192.168.88.1/24"]
如果 PVE 还残留旧地址,再删除:
ip address del 192.168.88.2/24 dev vmbr1
最后更新回滚脚本和备份,避免以后回滚时恢复成旧网段。公网 IP、WAN 网关和这次处理好的 MAC 都不用改。