最近我遇到一个包含多个模块的网站,每个模块都在转发数据包。最糟糕的情况是每2秒左右就转发一次。 你可能会说这速度并不快,但一天有86,400秒——这意味着单日该模块可能从"安全"服务器向外转发63兆字节(86,400 / 2 * 1472)1的数据,或是向你的安全网络注入63兆字节的黑客工具。
然而,在大多数情况下,转发数据包表明存在配置问题,而非安全漏洞。例如,假设某个模块拥有两个IP接口。
enet1 10.1.1.1 255.255.0.0
enet2 192.168.1.1 255.255.255.0
我们还假设默认路由器是 192.168.1.254
第一网络上的所有主机都应采用10.1.X.Y格式的IP地址,子网掩码为255.255.0.0。但若服务器server_17(IP地址为10.1.1.17)配置了更高位数的子网掩码(例如255.255.255.0)会怎样? 它仍能与任何IP地址为10.1.1.X格式的主机通信,因此可能不会察觉异常。但当它发送IP广播数据包时,会将目标地址设为10.1.1.255而非10.1.255.255。 封装该数据包的以太网帧将以太网广播地址设为目标地址,因此模块的以太网驱动程序读取帧后将数据包传递给IP驱动程序。IP驱动程序检查IP地址后判定:该地址既非发送至enet1或enet2,也非广播地址10.1.255.255。 若转发功能开启,IP驱动程序将尝试将数据包转发至IP地址为10.1.1.255的主机。若模块的ARP缓存中未存有10.1.1.255的条目,则会发送ARP请求。 若收到响应(或已存在条目),则将数据包转发至10.1.1.255;若未收到响应则丢弃帧。模块还可能发送ICMP路由重定向消息,指示该主机的IP地址即为"路由器"。
如果 server_17 使用位数更少的子网掩码(例如 255.0.0.0),会发生什么情况?此时它使用的 IP 广播地址为 10.255.255.255。 IP驱动程序判定该地址不属于其连接的网络,于是将数据包转发至默认路由器192.168.1.254。这不仅浪费了模块资源,也消耗了路由器的资源。若在同一广播域内存在两个子网,同样的情况也会发生。
最后,让我们重新审视安全问题。假设安全服务器 server_S 的 IP 地址为 10.1.1.100,子网掩码正确设置为 255.255.0.0。 由于10.1.0.0网络中不存在路由器,工业间谍伊芙如何将服务器_S的数据发送给位于互联网上的雇主5.6.7.8?方法很简单:她在服务器_S上配置主机路由,使所有发往5.6.7.8的数据包都被转发至10.1.1.1。仅此而已。 该模块会将数据包转发至默认路由器。若默认路由器未实施IP地址过滤,数据包将持续转发至下一跳路由器,直至抵达5.6.7.8。虽然5.6.7.8无法向10.1.1.100发送响应,但这并不影响伊芙——她另有手段确认数据已送达雇主处。
如何判断您的模块是否正在转发数据包,或者至少已配置为转发数据包?通过执行“
netstat -statistics将向您展示您所需的一切。
netstat -statistics . . .ip: . . . 1 ipforwarding (ON) . . . 3117 ipForwDatagrams . . . |
如果模块配置为转发数据包,则
ipforwarding 变量将为1,标签将附加(ON)后缀。若模块实际转发数据包,则 ipForwDatagrams 计数器将递增。请注意,即使数据包实际上并未发送(因为没有ARP缓存条目),计数器也会递增。
要关闭IP转发,请执行命令“
>system>stcp>command_library>IP_forwarding off是的,IP地址是全大写的。此时执行 netstat -statistics 命令将显示
ipforwarding 该变量值为2,标签后将附加(OFF)。请注意, ipForwDatagrams 该变量不会被重置;它仍将显示一个正值。遗憾的是,没有办法清除该值。
netstat -statistics . . .ip: . . . 2 ipforwarding (OFF) . . . 3117 ipForwDatagrams . . . |
最后提醒一句:如果转发功能开启后被关闭,而此时有人(除Eve之外)正在将该模块用作路由器,则会中断其当前操作。我认为这并非坏事——STCP本就不是为路由器设计的,但请做好应对投诉的准备。
————-
注释
1 以太网传输的ICMP回显数据包中,最大可容纳1472 字节的数据。
