Press "Enter" to skip to content

OVH 单公网 IP:PVE 部署 CHR,并让 RouterOS 接管公网

这次在一台 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"

本次早期还遇到两个独立问题:

  1. 没有默认路由,CHR 自身无法访问公网。
  2. 没有 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 都不用改。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注