Hello World

MikroTik RouterOS 配置端口回流的具体步骤

详细讨论 MikroTik RouterOS 配置端口回流(Port Hairpinning 或 NAT Loopback),以及它的作用、解决的问题和具体配置步骤。

什么是端口回流(Port Hairpinning / NAT Loopback)?

端口回流是指当内部网络(LAN)中的设备尝试通过外部公共 IP 地址访问内部网络中的另一个服务时,路由器能够正确地将流量路由回内部网络,而不是将其发送到外部互联网。

简单来说,就是内部设备可以像外部设备一样,使用公共 IP 地址访问内部服务器。

端口回流的作用和解决的问题

作用:

  1. 统一访问方式: 允许内部和外部用户使用同一个域名或公共 IP 地址访问内部服务。这样,当员工在公司内部时,可以直接使用 www.yourcompany.com 访问内部网站,而不需要记住或切换到内部 IP 地址。当他们在外部时,这个地址也能正常工作。
  2. 简化管理: 对于需要发布到互联网上的服务(如网站、FTP、VPN 服务器等),只需配置一次域名解析和端口转发规则,无论用户从内部还是外部访问,都保持一致。
  3. 兼容性: 某些应用程序或服务可能被设计为通过公共 IP 地址或域名进行访问,如果不支持回流,内部用户将无法使用这些服务。

解决的问题:

当没有配置端口回流时,内部用户尝试通过公共 IP 地址访问内部服务器时,会遇到以下问题:

  1. 流量去向问题:

    • 内部客户端发送到公共 IP 地址的请求到达路由器。
    • 路由器通常会识别这个公共 IP 地址是它自己的 WAN 接口地址。
    • 如果没有回流配置,路由器会尝试将这个请求发送到外部互联网,因为它认为目标是一个外部地址。
    • 这个请求永远不会到达内部服务器,因为内部服务器并不在互联网上,它在路由器后面。
  2. NAT 转换问题:

    • 正常的端口转发(DNAT)只处理从外部进入路由器的流量。当流量从内部网络发出时,源地址 NAT (SNAT) 或 masquerade 会将内部源 IP 地址转换为路由器的 WAN IP 地址,然后发送到互联网。
    • 在回流场景下,流量的源和目标都在内部网络,但目标是公共 IP。如果路由器只进行 DNAT 而不处理内部流量的 SNAT,那么服务器收到的请求源 IP 可能是内部客户端的 IP。当服务器尝试回复时,它会直接回复给客户端的内部 IP,而不会再经过路由器进行反向 NAT,这可能导致流量不对称,客户端无法收到响应。

总结: 端口回流解决了内部网络设备无法通过公共 IP 地址访问内部服务器的问题,确保了访问的统一性和服务的可用性。

MikroTik RouterOS 配置端口回流的具体步骤

假设你的网络环境如下:

我们将配置:当外部用户和内部用户都通过 203.0.113.10:80 访问时,流量都转发到 192.168.88.200:80

核心思想:

  1. DNAT 规则: 将目标为公共 IP 和指定端口的流量转发到内部服务器(无论是来自外部还是内部)。
  2. SNAT / Masquerade 规则: 对于来自内部网络、目标为公共 IP 但实际转发到内部服务器的流量,需要进行源地址转换,使服务器认为请求来自路由器,而不是客户端。这样服务器才能将响应正确发回路由器,再由路由器转发给客户端。

方法一:使用 dst-natsrc-nat 组合(推荐,更清晰)

这种方法通过两条规则明确地定义了端口转发和源地址转换。

步骤 1:配置端口转发 (DNAT)

这条规则将所有到达路由器 WAN 接口公共 IP 地址 203.0.113.1080 端口流量,重定向到内部服务器 192.168.88.20080 端口。这条规则对内部和外部流量都有效。

/ip firewall nat
add chain=dstnat protocol=tcp dst-address=203.0.113.10 dst-port=80 action=dst-nat to-addresses=192.168.88.200 to-ports=80 comment="Port Forward HTTP to Internal Server"

(请将 203.0.113.10 替换为你的实际公共 IP 地址,192.168.88.200 替换为你的实际服务器内部 IP 地址。)

步骤 2:配置源地址转换 (SNAT) 用于回流

这是回流的关键。当内部网络 (192.168.88.0/24) 的设备访问公共 IP 地址 203.0.113.10 并最终被转发到内部服务器 192.168.88.200 时,我们将源 IP 地址改为路由器的内部接口 IP 地址 (192.168.88.1)。

/ip firewall nat
add chain=srcnat protocol=tcp src-address=192.168.88.0/24 dst-address=192.168.88.200 dst-port=80 action=src-nat to-addresses=192.168.88.1 comment="Hairpin NAT for HTTP"

(请将 192.168.88.0/24 替换为你的实际内网网段,192.168.88.200 替换为你的实际服务器内部 IP 地址,192.168.88.1 替换为你的路由器 LAN 接口 IP 地址。)

解释第二条 SNAT 规则:

为什么需要这个 SNAT?

如果没有这个 SNAT 规则:

  1. 内部客户端 192.168.88.100 访问 203.0.113.10:80
  2. 路由器执行 dst-nat,将目标地址改为 192.168.88.200:80
  3. 服务器 192.168.88.200 收到一个来自 192.168.88.100 访问其 80 端口的请求。
  4. 服务器直接响应给 192.168.88.100。由于 192.168.88.100192.168.88.200 都在同一个局域网内,响应流量不会经过路由器。
  5. 客户端 192.168.88.100 收到响应,但它发送请求的目标是 203.0.113.10,而收到响应的源是 192.168.88.200。这在 TCP/IP 协议栈中会被认为是无效连接,导致连接中断或无法建立。

有了这个 SNAT:

  1. 内部客户端 192.168.88.100 访问 203.0.113.10:80
  2. 路由器执行 dst-nat,将目标地址改为 192.168.88.200:80
  3. 路由器执行 src-nat,将源地址改为 192.168.88.1
  4. 服务器 192.168.88.200 收到一个来自 192.168.88.1 访问其 80 端口的请求。
  5. 服务器响应给 192.168.88.1。这个响应会发送回路由器。
  6. 路由器进行反向 src-natdst-nat,将响应转发给原始客户端 192.168.88.100
  7. 客户端 192.168.88.100 收到来自 203.0.113.10 的响应(在客户端看来)。一切正常工作。

方法二:使用 Masquerade(更简洁,但可能不如 SNAT 精确控制)

Masquerade 是一种特殊的 SNAT 形式,它会自动将源 IP 转换为出接口的 IP 地址。

步骤 1:配置端口转发 (DNAT)

与方法一相同。

/ip firewall nat
add chain=dstnat protocol=tcp dst-address=203.0.113.10 dst-port=80 action=dst-nat to-addresses=192.168.88.200 to-ports=80 comment="Port Forward HTTP to Internal Server"

步骤 2:配置 Masquerade 用于回流

这条规则将来自内部网络 (192.168.88.0/24)、目标是内部服务器 (192.168.88.200) 的流量进行源地址伪装。

/ip firewall nat
add chain=srcnat protocol=tcp src-address=192.168.88.0/24 dst-address=192.168.88.200 dst-port=80 action=masquerade comment="Hairpin Masquerade for HTTP"

(同样,请替换为你的实际 IP 地址和网段。)

解释:
src-nat to-addresses=LAN_IP 类似,action=masquerade 会将源 IP 转换为流量离开路由器时所使用的接口的 IP 地址。在这个场景中,流量是从路由器的内部接口 192.168.88.1 到达服务器 192.168.88.200 的,所以源 IP 会被伪装成 192.168.88.1。效果与方法一的 SNAT 规则相同。


示例:添加 HTTPS (443) 服务的端口回流

如果你还需要转发 HTTPS (端口 443),只需添加类似的规则:

使用方法一(SNAT):

/ip firewall nat
# HTTPS Port Forward
add chain=dstnat protocol=tcp dst-address=203.0.113.10 dst-port=443 action=dst-nat to-addresses=192.168.88.200 to-ports=443 comment="Port Forward HTTPS to Internal Server"

# HTTPS Hairpin NAT
add chain=srcnat protocol=tcp src-address=192.168.88.0/24 dst-address=192.168.88.200 dst-port=443 action=src-nat to-addresses=192.168.88.1 comment="Hairpin NAT for HTTPS"

使用方法二(Masquerade):

/ip firewall nat
# HTTPS Port Forward
add chain=dstnat protocol=tcp dst-address=203.0.113.10 dst-port=443 action=dst-nat to-addresses=192.168.88.200 to-ports=443 comment="Port Forward HTTPS to Internal Server"

# HTTPS Hairpin Masquerade
add chain=srcnat protocol=tcp src-address=192.168.88.0/24 dst-address=192.168.88.200 dst-port=443 action=masquerade comment="Hairpin Masquerade for HTTPS"

重要的考虑事项

  1. 规则顺序: 在 MikroTik 的 NAT 规则中,规则的顺序非常重要。通常,dst-nat 规则应该放在 src-nat 规则之前。在 Winbox 中,你可以拖动规则来改变顺序。如果你使用命令行,新添加的规则会默认追加到末尾。如果遇到问题,请检查规则的顺序。
  2. 防火墙过滤规则: 确保你的 filter 规则没有阻止这些流量。默认情况下,MikroTik 路由器的 inputforward 链可能有一些默认规则。你需要确保允许从 WAN 接口进入的流量(DNAT 之后的流量),以及允许内部流量(回流流量)。

    • 通常,DNAT 规则会在 forward 链的 prerouting 阶段处理。
    • SNAT 规则会在 forward 链的 postrouting 阶段处理。
    • 确保你的 forward 链没有 dropreject 规则阻止了这些流量。
  3. 服务监听地址: 确保你的内部服务器上的服务监听在所有可用的 IP 地址上(通常是 0.0.0.0),或者至少监听在它的内部 IP 地址 192.168.88.200 上。
  4. DNS 解析: 如果你使用域名访问服务,建议在内部 DNS 服务器上为该域名配置解析,将其解析到服务器的内部 IP 地址 (192.168.88.200)。这样,内部设备将直接访问服务器,而不是经过路由器进行回流,可以减轻路由器负担并稍微提高效率。然而,如果出于某种原因必须使用公共 IP/域名,那么端口回流是必要的。

总结

端口回流是确保内部网络设备能够通过公共 IP 地址访问内部服务器的关键功能,它通过 DNAT 和 SNAT(或 Masquerade)组合来实现。理解其原理和正确配置对于提供稳定、统一的网络服务至关重要。

请根据你的实际网络环境替换上面示例中的 IP 地址和端口,并仔细检查规则,以确保它们符合你的需求。