我看到很多帖子都在过滤iptables
,比如:
-A INPUT -p tcp -m tcp --dport xxxxx -j ACCEPT
这应该相当于我的台词:
--append INPUT --protocol tcp --match tcp --destination-port xxxxx --jump ACCEPT
我对这一行的问题是-匹配tcp的含义,因为我们应该知道协议是TCP,还是触发了更多的东西?我只是不明白它在这个背景下的意义。
发布于 2019-10-25 06:33:27
注意,在下面的解释中,模块意味着userland命令模块,而不是内核模块(当然有关系,但不需要解释)。
iptables
与IPv4打交道。每个IPv4 4包都有一个协议字段。--protocol tcp
使用内置iptable代码将其与给定值进行比较。基本iptables命令本身在基本IPv4层上不知道多少。如果没有其他任何要求,比如检查特定的TCP端口,iptables就不会更进一步。例:
iptables -A INPUT -p tcp -j ACCEPT
将不会加载模块tcp。以后也不会看到任何-m tcp
。
基本iptables命令不知道端口。在测试协议之后指定未知选项时,出于礼貌,iptables自动加载具有协议名称的模块,这就是-m
选项的作用。因此,在遮罩下,iptables -A INPUT -p tcp --dport 5555
查找不存在--dport
选项,自动插入一个-m tcp
。现在,将再次对照tcp模块检查--dport
选项,该模块知道并处理--dport
选项。所以当你这么做的时候:
iptables -A INPUT -p tcp --dport 5555
然后用iptables-save
转储规则,您将在结果中看到以下结果:
-A INPUT -p tcp -m tcp --dport 5555
通常,人们不键入-m tcp
,而是复制规则转储的任何结果,因为这样更容易,这意味着命令不会出现语法错误。
如果您想要确信这一点,下面是在为ICMP协议指定了--dport
选项(它没有端口的概念)之后给出或不给出一个-p 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在此命令中失败。
https://unix.stackexchange.com/questions/548652
复制相似问题