路由拓扑说明
公司原有线路是双光纤,一条主线【联通80M】,另一条是辅助线路【鹏博士20M】。联通80M为默认路由,鹏博士20M为策略路由(即指定的部分IP上网才能使用鹏博士流量)。 没有做流量从那条线进来就从哪条线出去的相关规则,NAT配置在了鹏博士光纤上,一切正常,就这样运行了1年。
可是今年由于光纤质量原因,联通80M更换为了电信150M光纤,但切换默认路由到电信上面之后,故障发生了...原来绑定在鹏博士线路上的NAT设置全部失效。从外网访问不了我们公司的服务器NAT映射。为了这个问题,我把两家公司的技术全都请来了,都说自家网没有问题...好吧,在和电信技术沟通画拓扑的时候,灵感一现,问题解决了...
解决步骤
1. 配置两条线的策略路由
即,流量从哪儿来,就从哪儿出去
2. 配置NAT流量走向
让需要映射的内网服务器IP到公网映射端口的流量,走鹏博士
配置两条线的流量策略路由
从哪儿进来就从哪儿出去,即:流量从电信过来就从电信线路接口出去;从鹏博士进来的流量,就从鹏博士线路接口出去
说明:Ether3: 电信接口 ; Ether1: 鹏博士接口
/ip firewall mangle
##电信-进来的流量标记,名称: dianxin_conn
chain=input action=mark-connection new-connection-mark=dianxin_conn passthrough=yes in-interface=ether3 log=no
log-prefix=""
##电信-出去的路由标记, 名称: dianxin_routing
chain=output action=mark-routing new-routing-mark=dianxin_markrouting passthrough=yes connection-mark=dianxin_conn
log=no log-prefix=""
##鹏博士-进来的流量标记, 名称: pengboshi_conn
chain=input action=mark-connection new-connection-mark=pengboshi_conn passthrough=yes connection-state=new
in-interface=ether1
##鹏博士-出去的路由标记, 名称: pengboshi_routing
chain=output action=mark-routing new-routing-mark=pengboshi_routing passthrough=yes connection-mark=pengboshi_conn
注意:Mangle里面有严格的前后关系,务必把这四条策略,放到mangle列表的最顶端。
做完上面的标记后,接下来应用路由策略,流量各走各的,如下:
/ip route
##电信进出流量
dst-address=0.0.0.0/0 gateway=电信网关IP routing-mark=dianxin_routing
##鹏博士进出流量
dst-address=0.0.0.0/0 gateway=鹏博士网关IP routing-mark=pengboshi_routing
配置NAT端口映射流量走向
##到Ros的端口为TCP22且通过鹏博士接口进来的流量标记一个连接,名字为Gitlab22_conn
chain=prerouting action=mark-connection new-connection-mark=Gitlab22_conn passthrough=yes protocol=tcp in-interface=ether1 dst-port=22
##192.168.10.10内网服务器IP的22端口到鹏博士线路的流量做一个路由标记,名字为:Gitlab22_routing
chain=prerouting action=mark-routing new-routing-mark=Gitlab22_routing passthrough=no src-address=192.168.10.10 connection-mark=Gitlab22_conn
注:这里一定要填写内网IP,让这个服务器出Ros的数据被标记出来,由鹏博士线路出去,形成往来数据流向环。否则就会出现无法访问NAT端口映射了,这就是为什么内网服务器只能主线电信访问(默认路由),而辅助线路鹏博士(策略路由)无法访问。上面这两条规则解决了这个问题。
## 应用这个NAT策略路由
dst-address=0.0.0.0/0 gateway=鹏博士网关IP routing-mark=Gitlab22_routing
OK,到这里,NAT公网映射两条线都可以从外网进来访问服务器了,当然,你如果有其他NAT映射,也需要重复上面3条命令
文档参考:完美解决Ros多线NAT映射问题
思考
我们回归问题本身,为什么联通【默认路由主线】和电信通【策略路由辅助线路】,当初没有出现这个问题呢?为什么把主线从联通切换到电信NAT就出现了故障?
笔者分析如下:
一个大胆的猜测,鹏博士光纤的上层链路与联通链路有关联,当外部访问内网NAT映射时,首先到达且使用联通流量,联通判断该请求目的地是鹏博士公网IP,对此请求进行了转发。而电信这么过来的时候,直接把这个数据包给丢弃了,所以就无法访问。我们无法求证具体原因,但上面的操作绝对是最正确的,尤其是出现在双线或者多线的企业网络环境中。
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2017/06/05/RouterOS多线NAT问题处理/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!