我刚刚阅读了iptables
手册页。看来,对于conntrack
模块,我应该使用/更--ctproto
喜欢--protocol
?
我会更好地向您展示我到目前为止使用的东西,我在某个时候迁移到ct*
. 无论如何,这里是:
$ cat /etc/iptables/rules.v4
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
--append INPUT --in-interface lo --match comment --comment "Allow loopback" --jump ACCEPT
--append INPUT --match conntrack --ctstate INVALID --match comment --comment "Drop invalid packets" --jump DROP
--append INPUT --match conntrack --ctstate NEW --protocol tcp ! --syn --match comment --comment "Reject new non-syn TCP" --jump REJECT --reject-with tcp-reset
--append INPUT --match conntrack --ctstate NEW,ESTABLISHED --protocol tcp --match tcp --destination-port 22 --source 192.168.0.0/24 --match comment --comment "Allow local SSH on default port" --jump ACCEPT
--append INPUT --protocol icmp --icmp-type echo-request --match limit --limit 2/second --limit-burst 5 --match comment --comment "Allow only ping and within limits" --jump ACCEPT
--append INPUT --match conntrack --ctstate RELATED,ESTABLISHED --match comment --comment "Normal traffic" --jump ACCEPT
COMMIT
因此,我尝试将其重写如下:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
--append INPUT --in-interface lo --match comment --comment "Allow loopback" --jump ACCEPT
--append INPUT --match conntrack --ctstate INVALID --match comment --comment "Drop invalid packets" --jump DROP
--append INPUT --match conntrack --ctstate NEW --ctproto tcp ! --syn --match comment --comment "Reject new non-syn TCP" --jump REJECT --reject-with tcp-reset
--append INPUT --match conntrack --ctstate NEW,ESTABLISHED --ctproto tcp --match tcp --destination-port 22 --source 192.168.0.0/24 --match comment --comment "Allow local SSH on default port" --jump ACCEPT
--append INPUT --match conntrack --ctproto icmp --icmp-type echo-request --match limit --limit 2/second --limit-burst 5 --match comment --comment "Allow only ping and within limits" --jump ACCEPT
--append INPUT --match conntrack --ctstate RELATED,ESTABLISHED --match comment --comment "Normal traffic" --jump ACCEPT
COMMIT
如果我尝试不同,则会出现这些以及可能的其他错误:
# iptables-restore < rules.v4-ct
iptables-restore v1.8.4 (legacy): unknown option "--syn"
Error occurred at line: 7
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
# iptables-restore < rules.v4-ct
iptables-restore v1.8.4 (legacy): unknown option "--icmp-type"
Error occurred at line: 9
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
# iptables-restore < rules.v4-ct
iptables-restore: line 11 failed
# iptables-restore < rules.v4-ct
Bad argument `COMMIT'
Error occurred at line: 11
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
谢谢,如果你能阐明这一点。
一些备注:
--ctproto tcp
. 有没有参考?conntrack
匹配模块。--ctreplsrcport
它还没有分成两个手册页:(iptables
基础)和iptables-extensions
今天大多数有趣的文档(匹配和目标)存在的地方。虽然我喜欢 Debian 手册页,因为参数和子命令的链接(如conntrack
match)经常出现。关于问题:
--protocol
iptables
是不需要额外匹配模块的内置功能(将在 中描述iptables-extensions(8)
)。它不是将其依赖关系更改为多个模块的匹配模块参数。在没有加载模块的情况下使用模块特定参数是行不通的
--syn
是其中的一部分,-m tcp
如果不加载此模块就无法使用第 7 行因此失败
--icmp-type
是其中的一部分,-m icmp
如果不加载此模块就无法使用第 9 行因此失败
协议特定模块需要说明协议
声明一个协议(例如:)
-p tcp
会自动尝试加载同名的模块(例如:)-m tcp
。反过来是不正确的。这就是为什么tcp
oricmp
模块很少被显式编写,但实际上总是存在的,就像一个iptables-save
展示一样。这没有明确记录,但如果这样做并且要严格遵循文档,则始终必须编写-p tcp
并-m tcp
尊重当前文档。TCP
一旦
-m tcp
添加了第 7 行,第 7 行和第 8 行仍然失败(显然在内核验证级别),因此ICMP
由于这个原因,第 9 行失败(显然在内核验证级别)
因此,最终即使可以使用
--ctproto tcp
,只要需要不属于其中的功能,-p tcp -m tcp
仍然需要。ICMP 同上。conntrack
当有更具体的方法可用时,可能不值得为此使用该模块。还会
conntrack
在conntrack表中进行查找,这可能比特定方法更昂贵(但实际上,一旦完成查找(在conntrack工具的 prio -200 时),对条目的引用就会缓存在数据包的 skbuff 中,并且状态也可以直接使用)。一些备注:
nf_conntrack_tcp_loose
在系统(网络命名空间)级别,此过滤器:
除了最终
REJECT
目标可以替换为:它现在会将此类数据包分类为无效并被 INVALID 规则检查丢弃(而不是在 OP 的规则中拒绝)。默认情况下启用松散模式以允许暂时中断的流量(例如:重新启动状态路由防火墙)恢复。
第 8 行实际上可以在没有的情况下完成
-p tcp -m tcp
因为对于这种情况
-m conntrack
,它具有替换它的功能。由于 nat/PREROUTING 规则可能改变了可能不同于 22 的原始目标端口,因此在
--ctreplsrcport 22
下面选择了更自然的--ctorigdstport 22
.甚至(尽管一些文档另有说明,但很少使用的 nat/INPUT 在 filter/INPUT 之后发生,源没有发生变化,并且
--ctorigsrc
可以使用自然):