25G DAC在同型号FortiSwitch之间能起链路,FS2048到FS648之间却不行
我们正在把两排汇聚层收编到FortiSwitch上,最后一块拼图是相邻机架里一台FS2048和一台FS648之间的25G互联。设计里其他所有部分都一次成功,唯独这条链路死活不通。
- FortiSwitch 2048,25G前面板端口
- FortiSwitch 648,25G前面板端口
- Fortinet FN-CABLE-SFP28-5无源DAC,原厂线缆,不是第三方
- 除了VLAN配置之外,两端端口都没动过别的
我看到的现象:
FS2048 port: down, no rx/tx counters moving
FS648 port: down, no rx/tx counters moving
same FN-CABLE-SFP28-5 between two FS648 units: up at 25G, stable
已经做过的:
- 换了同一个包装盒里的第二根FN-CABLE-SFP28-5,没有变化
- 把两端都换到各自机箱上不同的25G端口,没有变化
- 把这根线接在两台相同的FS648之间验证过没问题,立刻就能起链路
所以线缆没问题,端口也没问题,就是这个组合不行。这两款型号的25G端口之间是不是有什么参数必须一致,链路才能完成训练?
Comments 6
就是这个问题。这两款机箱基于不同代际的ASIC和PHY,各自在25G下自行选定的纠错方式并不一样,所以链路永远无法完成训练。你看到的就是干干净净的down/down,日志里也没什么可查的线索。
在两端手动把FEC模式锁定成一致:
在FS2048和FS648上都要做,各自用自己的端口名称。CL91是里德-所罗门码变体,比CL74这个firecode选项能纠正更多的错误,但选哪一个其实远没有"两边选一样的"重要:两个PHY必须用完全相同的方案来编码和解码,否则训练永远完不成,而在两种不同的PHY家族上都设成"auto"并不等于用了同一种方案。
第二端配置提交之后端口应该马上就能起来。如果以后再往这个环境里混入第三种型号,也要在那边显式设置,不要以为默认值会自动继承下来。
同一根线在相同型号之间能用、在不同型号之间就断掉,这是物理层没能就某件事达成一致,而在25G铜缆上,这几乎总是FEC的问题。
先别急着动手,贴一下两个端口目前配置的fec-state是什么。不同代际的FortiSwitch默认值并不相同,而你要互联的这两个型号又不是同一个ASIC/PHY家族,所以"两边都是出厂设置"不等于"两边设置相同"。
如果这两个端口读出来的值不一样,答案在你动其他任何东西之前就已经出来了。
两边都没动过,所以两个端口跑的都是镜像默认设置的值。FS2048这边是空的:
FS648那边也一样。速率和自动协商也都没动过,我只把端口划进了正确的VLAN。如果不同型号的默认值不一样,那正好能解释为什么同一根线在两台相同的设备之间毫无问题。
顺便说一句,这类问题完全不局限于Fortinet。我有一根25G SFP28无源DAC,在UniFi USW-Pro-Aggregation和一台装着Intel SFP28网卡的服务器之间用得好好的,插到MikroTik CCR2004-1G-12S+2XS的sfp28-2上却什么反应都没有——两边都没报错,就是不起链路。换了一根Ubiquiti UACC-DAC-SFP28-3M和一根Lenovo 7Z57A03558,结果一样。有一次端口确实起来了,大约两秒后又掉了,这提示的是训练失败,而不是线缆本身坏了。
还是FEC:Ubiquiti那边一直开着FEC,也没有支持的方式去改;而RouterOS从6.49开始把默认值从fec91改成了不用FEC。对我有效的做法是升级到RouterOS 7.4,那里FEC选项是开放的,执行
然后把端口设置成fec74,自动协商关闭,两个方向的流控都关闭,25 Gbps全双工,同时在UniFi那边通过端口配置文件覆盖,强制锁定25G全双工。这是我自己这套硬件和固件的经验,具体配方仅供参考,请在你自己的环境里验证。
值得补充一点:同一个旋钮在不同厂商的CLI里叫法完全不同,这也是为什么一旦机架里混了不止一个厂商,这类问题就特别磨人。在Cisco的25G链路上,Catalyst 9300堆叠和Catalyst 9500那一对之间,是两端都设成fec cl108才通的;而在那对9500和一台Nexus 9000之间的100G链路上,起作用的是两端都设成fec off。同样的决定,不同的关键字。
而且FEC也不总是该打开的东西。在一台Nexus 93180YC-EX上,插着SFP-H25GB-SR连到一块Cavium的25G网卡,交换机端口停在FEC auto、因为光模块的关系期望使用FEC,而网卡那边报告完全不支持FEC,于是两端始终谈不拢,接口一直是down,模块倒是能被识别出来。那次的解决办法是在交换机接口上设fec off,show interface也确认模式从Auto变成了Off。
所以规律不是"用cl91",而是"先决定用哪种模式,然后在两端都显式设置成一样的"。
确认有效。单独在FS2048端口上set fec-state cl91并没有变化,然后在FS648端口上也做同样的设置,链路几秒钟内就起来了。两边计数器都在动,两台机箱各自重启一次也都能挺过来。
从现在开始,这对设备的每个25G端口都会显式设置这个参数,不再信任默认值。折腾了两个晚上换那些本来就没问题的线缆,结果就是一行配置的事。