我刚刚读过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.
如果您能阐明这一点,谢谢。
答案1
一些备注:
- 我很想知道哪里建议人们应该优先使用
--ctproto tcp
.有什么参考吗? - 精确的OP 中的联机帮助页 URL 链接已经过时了 10 多年:例如,它不包括本答案末尾的评论中使用的
conntrack
匹配模块。--ctreplsrcport
它尚未分为两个手册页:iptables
(基地)和iptables-extensions
如今,大多数有趣的文档(匹配和目标)都存在于此。尽管我更喜欢 Debian 手册页,因为它提供了参数和子命令的链接(例如conntrack
匹配)经常出现。
关于问题:
--protocol
是一个内置功能,iptables
不需要额外的匹配模块(将在 中进行描述iptables-extensions(8)
)。它不是一个匹配模块参数,它将其依赖关系更改为多个模块。在未加载模块的情况下使用模块特定参数无法工作
协议特定模块需要说明协议
声明协议(例如:
-p tcp
)会自动尝试加载同名的模块(例如:-m tcp
)。反之则不然。这就是为什么tcp
或icmp
模块很少被明确编写,但实际上总是存在,就像显示一样iptables-save
。这没有明确记录,但如果这样做并且文档是严格地其次,人们总是必须编写-p tcp
并-m tcp
尊重当前的文档。
因此,即使可以使用--ctproto tcp
,只要需要不属于其中的功能,-p tcp -m tcp
仍然需要。 ICMP 也是如此。当有更具体的方法可用时,可能不值得conntrack
为此使用该模块。
还conntrack
进行查找连线表可能比特定方法成本更高(但实际上一旦完成查找(按 prio -200连线设施),缓存对条目的引用在数据包的 skbuff 中,状态也直接可用)。
一些备注:
-
在系统(网络命名空间)级别,此过滤器:
-A INPUT -p tcp -m conntrack --ctstate NEW --ctproto tcp -m tcp ! --syn -m comment --comment "Reject new non-syn TCP" -j REJECT --reject-with tcp-reset
除了最终
REJECT
目标可以替换为:sysctl -w net.netfilter.nf_conntrack_tcp_loose=0
现在会将此类数据包分类为无效,并通过无效规则检查将其丢弃(而不是在 OP 规则中拒绝)。默认情况下启用松散模式,以允许暂时中断的流量(例如:重新启动状态路由防火墙)恢复。
第8行实际上可以完成没有
-p tcp -m tcp
因为对于这个案例
-m conntrack
具有替代它的功能。由于 nat/PREROUTING 规则可能会更改原始目标端口(可能与 22 不同),因此
--ctreplsrcport 22
在下面选择了更自然的--ctorigdstport 22
.-A INPUT -s 192.168.0.0/24 -m conntrack --ctstate NEW,ESTABLISHED --ctproto tcp --ctreplsrcport 22 --match comment --comment "Allow local SSH on default port" --jump ACCEPT
甚至(很少使用的 nat/INPUT 发生在过滤器/输入之后,尽管一些文档另有说明,源没有发生任何变化,并且
--ctorigsrc
可以使用自然):-A INPUT -m conntrack --ctstate NEW,ESTABLISHED --ctproto tcp --ctreplsrcport 22 --ctorigsrc 192.168.0.0/24 --match comment --comment "Allow local SSH on default port" --jump ACCEPT