用RouterOS做端口映射时遇到的回流问题

以前一直都是用的OpenWRT做的端口映射,非常简单在网络-防火墙-端口转发里就可以设置。后来换了RouterOS,做端口转发也是在IP-Firewall-NAT里添加一条dstnat。配置好后,我在外网通过访问厂里的外网IP可以正常访问厂里内网的服务,但是厂里内网无法通过访问厂里的外网IP来访问内网的服务。我就网上查了一下,有人说应该是回流问题。结果很多所谓带有回流的设置,其实就是把通过网口筛选数据包来dstnat改为通过筛选数据包的目标IP来dstnat,跟回流一点关系都没有。

后来发现一篇说是在NAT里添加一条srcnat,就可以正常回流了。

add action=masquerade chain=srcnat comment="" disabled=no

这个不就是源IP伪装吗?内网要上外网肯定要做NAT,也就是替换数据包的源IP为路由器的外网IP。于是我检查了一下我的srcnat配置,结果发现我的多了Out. Interface List: WAN。我的配置只对从WAN口发出的数据包做源IP伪装,而上面的配置是对所有经过路由器的数据包都做源IP伪装。这样问题就找到了,其实就是内网访问路由器外网IP时,数据包并没有从WAN口发出,也就没有做源IP伪装,而dstnat已经工作,替换了数据包的目标IP为内网服务的IP。

由于数据包没有经过源IP伪装,内网服务收到这个数据包后,返回的数据包直接发给了内网的那台机器,并没有经过路由器。而内网的请求服务的那台机器收到这个数据包只会丢弃(收到的数据包的源IP与发送的数据包的目标IP不一致会直接丢弃)

现在的路由器包括OpenWRT基本做到了一键配置,这种网络问题已经很长时间没有遇到了。对于普通用户没有必要了解这些,但是对于我们这种从事网络工作的人还是很有必要弄清楚的。于是就做一个记录,方便自己备查,以及其他人遇到困惑时能帮上忙。

类似文章

发表回复

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