我有一个要求添加一个 iptable 规则,假设源 IP 为 10.10.10.20/any 目标 IP any。
iptables -t filter -A FORWARD_0_IN -p all --ipv4 --source 10.10.10.1/any --destination 10.10.10.2/any -j DROP
上述命令失败并出现错误:iptables v1.8.6 (legacy): 指定了无效掩码“any”
这/any
意味着所有可能的子网掩码/0 to /32
。我想避免为每个子网掩码添加单独的 33 条规则。有什么更好的方法可以实现这一点?
到那时,让我从需求团队那里得到澄清,对/任何的期望是什么。
答案1
我想避免为每个子网掩码添加单独的 33 条规则。
您不太可能需要这样做。而且我认为您不太了解子网掩码的含义或作用。
这是一个非常长的问答:IPv4 子网划分如何工作?
但非常简单:
当您添加没有任何子网掩码或带有 /32 子网掩码的 IPv4 IP 地址时,这意味着“这个特定的 IP 地址”。
当您使用 IPv4 IP 地址时任何除此之外的其他子网掩码/32
意味着:“这CIDR 子网范围包含此 IP 地址”。
换句话说10.10.10.1/24
就是:“包含的 /24 子网范围10.10.10.1
”
即子网范围从10.10.10.0
到10.10.10.255
,更常见的是指定为10.10.10.0/24
随后的 10.10.10.1/8
意思是:“包括的 /8 范围10.10.10.1
”
即子网范围从10.0.0.0
到10.255.255.255
;通常指定为10.0.0.0/8
但10.10.10.1/8
等效。
请注意,这样的范围包括10.10.10.1/9
,, ....以及所有子网,10.10.10.1/10
直到10.10.10.1/11
10.10.10.1/32
意思是10.10.10.1/0
:“包含的 /0 范围10.10.10.1
” - 即从0.0.0.0
到255.255.255.255
,换句话说 任何 IPv4 地址。
答案2
IP 地址不具有“子网掩码”属性。(在遥远的分类寻址时代,它曾经具有子网掩码,但这个时代早已一去不复返了 — 30 多年前,随着 CIDR 的出现。您应该忘记这一点,假装从未发生过这种情况。此外,即使在分类寻址的情况下,答案的其余部分仍然有效)。
因此,IP 地址只是 32 位数字,仅通过查看 IP 地址,您无法知道它在分配它的系统上配置了什么掩码。掩码仅对该系统有意义 - 它旨在告诉该系统哪些地址可以“立即”访问,哪些地址需要通过网关访问。网络掩码是路由功能;它唯一的作用就是定义某些“连接”类型的路线。
这是无意义的要求“允许具有任何掩码的某些 IP”。
您的要求中的这个符号可能不是掩码,而是端口号?那么它需要指定一个具有端口号概念的 L4 协议(TCP、UDP 等)。或者,这可能是协议本身,这意味着应该允许来自该主机的“任何”IP 协议号。