核心概念:反向代理

在 RouterOS 上发布网站,我们通常不直接让 RouterOS 运行一个完整的 Web 服务器(如 Apache/Nginx),而是让 RouterOS 充当一个“反向代理”。

routeros 发布网站
(图片来源网络,侵删)

工作流程如下:

  1. 用户在浏览器中输入你的公网 IP 地址或域名(your.public.ip)。
  2. 请求到达你的 RouterOS 设备。
  3. RouterOS 根据你配置的规则,将这个请求转发到局域网内的一台真实的服务器(一台运行着 Nginx 或 Apache 的 Linux 机器,或者一个 Docker 容器)。
  4. 内部服务器处理请求,生成网页内容。
  5. 内部服务器将网页内容返回给 RouterOS。
  6. RouterOS 再将内容转发给用户的浏览器。

这样做的好处是:

  • 安全性:内部服务器不直接暴露在公网上,只有 RouterOS 的防火墙端口是开放的。
  • 灵活性:你可以将任何内部 Web 服务(如 WordPress, GitLab, 简单的 HTML 页面)发布出去。
  • 统一入口:RouterOS 可以管理多个不同内部服务的发布,通过不同的路径(如 /site1, /site2)来区分。

使用 /ip service/ip proxy 发布网站(推荐)

这是最直接、最简单的方法,适用于发布单个网站或服务,它利用了 RouterOS 的 Web Proxy 功能。

场景假设

  • RouterOS 公网 IP: 0.113.10
  • 内部 Web 服务器 IP: 168.88.20
  • 内部 Web 服务器端口: 8080 (假设这台服务器上运行着一个非 80 端口的服务)
  • 希望用户访问的 URL: http://203.0.113.10

详细步骤

第一步:确保 RouterOS 可以访问内部服务器

routeros 发布网站
(图片来源网络,侵删)

在 RouterOS 的终端中 ping 一下内部服务器 IP,确保网络连通。

[admin@MikroTik] > ping 192.168.88.20
  192.168.88.20: 80 byte packet, id=0, seq=1/0, ttl=64 time=1.200 ms
  192.168.88.20: 80 byte packet, id=0, seq=2/0, ttl=64 time=0.900 ms
...

ping 不通,请检查你的网络配置(如 /ip firewall filter 规则是否阻止了 ICMP)。

第二步:启用 Web Proxy 服务

这个服务是反向代理功能的基础。

routeros 发布网站
(图片来源网络,侵删)
[admin@MikroTik] /ip service
[admin@MikroTik] /ip service> enable www-proxy
[admin@MikroTik] /ip service> print
Flags: X - disabled, S - static
 #   SERVICE            PORT ADDRESS
 0   S ftp               21
 1   S ssh               22
 2   S www               80
 3   S www-ssl           443
 4   S api               8728
 5   S winbox            8291
 6 XS www-proxy         8080   ; <-- 确保这一行是 enabled 状态

我们默认启用 www (端口 80) 和 www-ssl (端口 443) 来让外部访问,而 www-proxy 是 RouterOS 内部用来做代理的,它监听在 8080 端口。

第三步:创建反向代理规则

这是最关键的一步,我们需要告诉 RouterOS,当收到发往 www (80端口) 的请求时,应该把它转发到哪里。

[admin@MikroTik] /ip proxy
[admin@MikroTik] /ip proxy> add action=redirect dst-host=192.168.88.20 dst-port=8080 src-address=0.0.0.0/0

参数解释:

  • action=redirect: 表示将请求重定向(转发)到另一个地址。
  • dst-host=192.168.88.20: 目标内部服务器的 IP 地址。
  • dst-port=8080: 目标内部服务器的端口号。
  • src-address=0.0.0.0/0: 对所有来源的 IP 地址都应用此规则,你可以限制为特定的 IP 地址段,168.88.0/24,这样只有你的内网用户才能访问。

第四步:配置防火墙(NAT)

为了让外网用户能够访问,你必须配置 NAT(网络地址转换),将外网请求的端口转发到 RouterOS 自身的代理服务端口。

注意: 这里有一个常见的误区,我们不是将端口直接转发到内部服务器,而是转发到 RouterOS 的 www-proxy 服务端口。

[admin@MikroTik] /ip firewall nat
[admin@MikroTik] /ip firewall nat> add chain=dst-nat action=dst-nat to-addresses=0.0.0.0 to-ports=8080 protocol=tcp dst-port=80 in-interface=your_wan_interface

参数解释:

  • chain=dst-nat: 目标链,用于修改目标地址/端口。
  • action=dst-nat: 动作为目标地址转换。
  • to-addresses=0.0.0.0: 转发到本机(RouterOS 自己)。
  • to-ports=8080: 转发到本机的 8080 端口(即我们启用的 www-proxy 服务)。
  • protocol=tcp: 针对 TCP 协议。
  • dst-port=80: 匹配来自外网的、目标端口为 80 的请求。
  • in-interface=your_wan_interface: 请替换为你的外网接口名称ether1, pppoe-out1 等。

第五步:验证

从外网任何一台电脑上,打开浏览器,访问你的 RouterOS 的公网 IP 地址 http://203.0.113.10,你应该能看到你内部服务器 168.88.20:8080 上提供的网站内容。


使用 /ip firewall nat 的 dst-nat 直接转发

这种方法更接近传统路由器的“端口转发”,它不使用 RouterOS 的 Web Proxy 功能,而是直接将外网请求的端口完整地转发到内部服务器。

场景假设(同上)

  • RouterOS 公网 IP: 0.113.10
  • 内部 Web 服务器 IP: 168.88.20
  • 内部 Web 服务器端口: 80
  • 希望用户访问的 URL: http://203.0.113.10

详细步骤

第一步:确保网络连通 同上,ping 内部服务器。

第二步:配置防火墙(NAT)直接转发

[admin@MikroTik] /ip firewall nat
[admin@MikroTik] /ip firewall nat> add chain=dst-nat action=dst-nat to-addresses=192.168.88.20 protocol=tcp dst-port=80 in-interface=your_wan_interface

参数解释:

  • chain=dst-nat: 目标链。
  • action=dst-nat: 动作为目标地址转换。
  • to-addresses=192.168.88.20: 直接将目标地址修改为内部服务器的 IP
  • protocol=tcp: 针对 TCP 协议。
  • dst-port=80: 匹配来自外网的、目标端口为 80 的请求。
  • in-interface=your_wan_interface: 请替换为你的外网接口名称

第三步:验证 从外网访问 http://203.0.113.10,你应该能看到内部服务器的内容。


两种方法的对比与选择

特性 方法一 (/ip proxy) 方法二 (/ip firewall nat 直接转发)
工作原理 反向代理 端口转发
安全性 更高,内部服务器完全隔离,不直接与公网通信。 较低,内部服务器直接暴露在公网(虽然经过 NAT,但攻击者可以直接尝试攻击其 IP)。
灵活性 更高,可以轻松添加代理头信息、缓存等高级功能。 较低,功能单一,只做简单的端口映射。
适用场景 发布复杂的 Web 应用、需要增强安全性、作为多个内部服务的统一入口。 发布简单的、非关键性的服务、快速测试、对 RouterOS 资源要求极低。
资源消耗 稍高,因为 RouterOS 需要处理和应用代理逻辑。 极低,几乎是纯粹的二层数据包转发。
HTTPS 支持 相对简单,可以结合 /ip servicewww-ssl/ip proxyssl 参数实现 HTTPS 终止。 复杂,需要在内部服务器上配置 HTTPS 证书,并将 443 端口也转发过去。

推荐: 对于绝大多数情况,强烈推荐使用方法一 (/ip proxy),它更安全、更灵活,也更符合 RouterOS 的设计哲学,方法二虽然在某些简单场景下更直接,但牺牲了安全性。


重要注意事项

  1. 动态公网 IP:如果你的公网 IP 是动态变化的,你需要使用 DDNS(动态域名解析)服务,将一个域名(如 myhome.ddns.net)指向你的动态 IP,然后在 RouterOS 中配置 ddns-client 实现自动更新。
  2. 防火墙规则:确保你的 /ip firewall filter 规则没有阻止外网访问你的 www (80) 和 www-ssl (443) 端口,默认的 input 链规则通常是允许的,但如果你做过修改,需要检查。
  3. HTTPS (SSL/TLS):对于生产环境,强烈建议使用 HTTPS。
    • 最佳实践:在内部服务器上配置好 HTTPS(例如使用 Let's Encrypt 获取免费证书),然后将 443 端口通过方法一或方法二转发过去。
    • RouterOS 终止 HTTPS:RouterOS 也可以自己处理 HTTPS(作为 SSL 终止点),然后将纯 HTTP 流量转发到内部服务器,这需要配置 /ip servicewww-ssl/ip proxyssl 证书,配置稍复杂,但可以减轻内部服务器的 SSL 解密负担。
  4. 性能:RouterOS 的 CPU 和内存资源有限,如果你要发布高流量的网站,其性能可能会成为瓶颈,对于大型网站,专业的 Web 服务器(如 Nginx, Apache)仍然是更好的选择。
  5. 备份:在进行任何配置更改前,请务必备份你的配置,以防配置错误导致设备无法访问。
    [admin@MikroTik] /system backup save name=my-website-config

希望这份详细的指南能帮助你在 RouterOS 上成功发布你的网站!