防火墙控制了某一目标IP的那些端口可以被用户IP访问,然而防火墙并没有用一条规则直接限定某一用户IP所能访问的目标IP及其端口,而是在配置中设置了一组访问控制规则,这些规则中既有允许访问的目标IP及端口范围,又有不允许访问的目标IP及端口范围。就某一目标IP而言,如何才能确定用户IP能访问该目标IP的端口呢?解决方案其实很简单,下面来看看具体步骤:
1.对于某一IP,假定0到65535之间的每一个端口都不允许访问,即可以创建一个大小为65536的Array数组,初始时每一个数组元素置为0,表示防火墙默认不允许访问该端口(注:所有端口默认不允许访问,只有控制规则显示说明允许时才能访问,且按配置中的规则条目从上到下一条一条检查访问控制情况。如果对于某个端口,前面有一条规则是不允许,那么就表示该端口不允许访问,即使后面有访问规则显示说明允许访问该端口,那么该端口依然不能访问。也就是说对于任意端口,都保持第一次匹配上的那条规则的端口访问情况);
2.检查当前防火墙访问控制规则,如果针对上面IP的访问控制规则为允许,其所允许的端口范围为A到B(注:0 <= A <= B <= 65535),那么检查Array数组从下标A到下标B对应位置的元素值,对于A到B中的某一端口X,如果Array[X]为0,那么将0改成1,表示允许访问该端口,如果Array[X]为1,那么不做处理,表示之前已经有规则允许访问该端口,如果Array[X]为-1,那么也不做处理,表示之前已经有规则禁止访问该端口。同样的,如果针对上面IP的访问控制规则为不允许,那么对于该规则A到B中某一端口Y,如果Array[Y]为0,那么将0改成-1,表示不允许访问该端口,如果Array[Y]为1,那么不做处理,表示之前已经有规则允许访问该端口,如果Array[Y]为-1,那么也不做处理,表示之前已经有规则禁止访问该端口。
3.经过上面的处理之后本来全部存储0的Array数组,在任何一个位置N要么是0、要么是1、要么是-1,这样一来我们就能很清晰的知道哪些端口可以访问、哪些端口不能访问。
端口访问范围解决方案其实蕴含着Bitmap算法思想,至于Bitmap算法是什么就需要自己了解了,按理说,只要是去操作有限范围内的数据特征(例如上面的端口访问重叠处理),那么就可以借鉴Bitmap算法思想。