星期二, 一月 08, 2008

一个 iptables 的奇怪需求和 TCP/IP netmask 问题

前几天 xuni 说能不能设置 iptables 控制某个网段,比如 192.168.0.10-100 的 IP 禁止掉,因为如果一个一个去增加,似乎效率太低,无论是对人还是对机器来说。

但似乎不太容易实现,首先是如何划分网段,另外这样划分和实际的网段设置(192.168.0.0/24)不同,是不是能够有效,特别是,中间作为网络地址和广播地址的 IP 能否生效?

首先解决第二个问题。随便找个计算子网及其掩码的工具,可以得到划分子网的网络地址和掩码,例如:192.168.0.96/255.255.255.224,也就是 192.168.0.96/28,则主机 IP 范围是 192.168.0.97-126,广播地址是 192.168.0.127,因为我自己的主机是 192.168.0.125,在这个网段之内。我在 iptables 中禁掉这个网段,发现有效,所以虽然网络配置是 192.168.0.0/24,但 iptables 并不受此影响。

再查看边界,将自己的 IP 改为 192.168.0.96 和 192.168.0.127,发现都可以有效的被禁止,所以不存在空洞的问题。

know IP/netmask, ask for net address 中讨论过从 IP/netmask 计算网络地址的问题,但这里第一个问题涉及到划分子网段时能否使用向 192.168.0.96/255.255.255.249 这样的掩码。这比较难于理解,所以考虑一个比较极端的例子,在《TCP/IP 详解 卷一 协议》中关于 TCP/IP 有一个这样的习题,即 255.255.0.255 这样的子网掩码是否合法。

答案是合法的,不过不符合习惯,因为难于理解,最主要的问题是其主机地址被分割在不连续的空间中了。例如:192.168.0.2/255.255.0.255,其结果是主机地址的范围是:192.168.[1-254].2。

所以如果按照习惯用法分配在一个连续地址空间中,则 10-100 这样的需求不可能直接实现,因为子网划分总是固定的,只能间接地通过若干子网和 IP 组合来实现。

但习题上说有 16 位的主机地址空间,但不是只有 8 位吗?

没有评论: