首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iptables:--协议tcp与-匹配tcp,澄清?

iptables:--协议tcp与-匹配tcp,澄清?
EN

Unix & Linux用户
提问于 2019-10-25 05:25:14
回答 1查看 1.5K关注 0票数 3

我看到很多帖子都在过滤iptables,比如:

代码语言:javascript
运行
复制
-A INPUT -p tcp -m tcp --dport xxxxx -j ACCEPT

这应该相当于我的台词:

代码语言:javascript
运行
复制
--append INPUT --protocol tcp --match tcp --destination-port xxxxx --jump ACCEPT

我对这一行的问题是-匹配tcp的含义,因为我们应该知道协议是TCP,还是触发了更多的东西?我只是不明白它在这个背景下的意义。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-10-25 06:33:27

注意,在下面的解释中,模块意味着userland命令模块,而不是内核模块(当然有关系,但不需要解释)。

iptables与IPv4打交道。每个IPv4 4包都有一个协议字段。--protocol tcp使用内置iptable代码将其与给定值进行比较。基本iptables命令本身在基本IPv4层上不知道多少。如果没有其他任何要求,比如检查特定的TCP端口,iptables就不会更进一步。例:

代码语言:javascript
运行
复制
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选项。所以当你这么做的时候:

代码语言:javascript
运行
复制
iptables -A INPUT -p tcp --dport 5555

然后用iptables-save转储规则,您将在结果中看到以下结果:

代码语言:javascript
运行
复制
-A INPUT -p tcp -m tcp --dport 5555

通常,人们不键入-m tcp,而是复制规则转储的任何结果,因为这样更容易,这意味着命令不会出现语法错误。

如果您想要确信这一点,下面是在为ICMP协议指定了--dport选项(它没有端口的概念)之后给出或不给出一个-p icmp选项时发生的情况:

代码语言:javascript
运行
复制
# strace iptables -A INPUT -p icmp 2>&1 |egrep 'icmp|write'
execve("/usr/sbin/iptables", ["iptables", "-A", "INPUT", "-p", "icmp"], [/* 15 vars */]) = 0

代码语言:javascript
运行
复制
# 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在此命令中失败。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/548652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档