我看到很多帖子都在过滤,iptables
例如:
-A INPUT -p tcp -m tcp --dport xxxxx -j ACCEPT
这应该相当于我的行:
--append INPUT --protocol tcp --match tcp --destination-port xxxxx --jump ACCEPT
我对这一行的问题是--匹配 TCP和我们一样应该已经知道协议是 TCP,或者这会触发进一步的事情吗?我只是不明白它在这种情况下的含义。
答案1
请注意,在下面的解释中,模块意味着用户态 iptables 命令模块,而不是内核模块(当然有关系,但不需要解释)。
iptables
涉及 IPv4。每一个IPv4数据包有一个协议场地。--protocol tcp
使用内置的iptables代码将其与给定值进行比较。基地iptables命令本身对基础 IPv4 层的了解并不多。如果没有其他需要,例如检查特定的 TCP 端口,iptables没有更进一步。例如:
iptables -A INPUT -p tcp -j ACCEPT
不会加载模块传输控制协议。而且以后就再也见不到了-m tcp
。
基地iptables命令不知道端口。当测试协议后指定未知选项时,出于礼貌,iptables自动加载具有协议名称的模块,这就是该-m
选项的作用。因此,在幕后,iptables -A INPUT -p tcp --dport 5555
找不到--dport
选项,会自动在-m tcp
前面插入一个。现在--dport
再次检查该选项传输控制协议模块,并且该模块知道一个--dport
选项并处理它。这就是为什么当你这样做时:
iptables -A INPUT -p tcp --dport 5555
并转储规则,iptables-save
您将在结果中看到:
-A INPUT -p tcp -m tcp --dport 5555
通常人们不会键入-m tcp
,而是复制规则转储中的任何结果,因为这样更容易,并且意味着命令不会出现语法错误。
如果你想确信这一点,请看下面发生的事情斯特雷斯--dport
在指定-p icmp
ICMP 协议(没有端口概念)的选项后给出或不给出选项的示例:
# strace iptables -A INPUT -p icmp 2>&1 |egrep 'icmp|write'
execve("/usr/sbin/iptables", ["iptables", "-A", "INPUT", "-p", "icmp"], [/* 15 vars */]) = 0
和
# strace iptables -A INPUT -p icmp --dport 5555 2>&1 |egrep 'icmp|write'
execve("/usr/sbin/iptables", ["iptables", "-A", "INPUT", "-p", "icmp", "--dport", "5555"], [/* 15 vars */]) = 0
stat("/usr/lib/x86_64-linux-gnu/xtables/libipt_icmp.so", {st_mode=S_IFREG|0644, st_size=14464, ...}) = 0
open("/usr/lib/x86_64-linux-gnu/xtables/libipt_icmp.so", O_RDONLY|O_CLOEXEC) = 3
getsockopt(3, SOL_IP, IPT_SO_GET_REVISION_MATCH, "icmp\0\177\0\0\207\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0!\0\0\0\0\0", [30]) = 0
write(2, "iptables v1.8.3 (legacy): ", 26iptables v1.8.3 (legacy): ) = 26
write(2, "unknown option \"--dport\"", 24unknown option "--dport") = 24
write(2, "\n", 1
write(2, "Try `iptables -h' or 'iptables -"..., 61Try `iptables -h' or 'iptables --help' for more information.
iptables 未知的选项的存在触发了模块的加载ICMP(文件libipt_icmp.so
)因为协议ICMP被指定。该模块也无法处理该选项--dport
,因此iptables该命令失败。