我在 iptables 中添加了这条规则
iptables -A INPUT -s 192.168.0.100/24 -p tcp --dport 27 -j ACCEPT
令我惊讶的是,当我列出 iptables 规则时,我看到:源值变成了
192.168.0.0/24
为什么?
答案1
192.168.0.100/24
可以是一个速记对于 192.168.100/255.255.255.0 - 使用 IP 地址 192.168.0.100 和网络掩码 255.255.255.0 配置设备。这可能就是您所期待的;但这不是 iptables 使用它的方式。如果您只想接受该特定主机,而不是整个网络,请省略掩码(或使用/32
,这是同一件事)。
严格来说,根据手册页,它可能会抛出一个错误:
[!] -s, --source address[/mask][,...] Source specification. Address can be either a network name, a hostname, a network IP address (with /mask), or a plain IP address. Hostnames will be resolved once ⋮
掩码只能与“网络 IP 地址”一起使用,而 192.168.0.100 不是其中之一(对于 /24 网络)。网络地址就是它返回给您的地址 - 192.168.0.0/24。
这就提出了一个问题:什么是网络IP地址?
设备/计算机需要知道另一个地址是否在同一网络上(因此它可以直接通信)或者是否在不同的网络上(因此它需要通过网关)。其工作方式是根据网络地址、网络掩码和一些二进制算术来考虑同一网络上的一系列 IP 地址。要查找给定 IP 地址所在的网络,您需要执行二进制操作并对照网络掩码(将两个地址以二进制形式排列,如果两者都是 1,则写下 1;否则写下 0)。由于网络掩码总是由一堆 1 后面跟着一些 0,因此我们通过计算 1 的数量来缩写它们。 /24 表示 24 个 1 和 8 个 0(IPv4 的长度为 32 位)。
(192) (168) (0) (100)
11000000 10101000 00000000 01100100
& 11111111 11111111 11111111 00000000
= 11000000 10101000 00000000 00000000 = 192.168.0.0
您会注意到,如果您尝试使用 192.168.0.1–255,它们都会得到相同的答案:这就是为什么它们被视为位于同一网络上。