将 `conntrack` 与 `--protocol` 等混合尝试重写我的规则.v4

将 `conntrack` 与 `--protocol` 等混合尝试重写我的规则.v4

我刚刚读过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))。它不是一个匹配模块参数,它将其依赖关系更改为多个模块。

  • 在未加载模块的情况下使用模块特定参数无法工作

    • --syn是其一部分-m tcp并且在不加载此模块的情况下无法使用

      第 7 行因此失败

    • --icmp-type是其一部分-m icmp并且在不加载此模块的情况下无法使用

      第 9 行因此失败

  • 协议特定模块需要说明协议

    声明协议(例如:-p tcp)会自动尝试加载同名的模块(例如:-m tcp)。反之则不然。这就是为什么tcpicmp模块很少被明确编写,但实际上总是存在,就像显示一样iptables-save。这没有明确记录,但如果这样做并且文档是严格地其次,人们总是必须编写 -p tcp-m tcp尊重当前的文档。

    • 传输控制协议

      tcp

      --protocol tcp如果指定,则可以使用这些扩展。 它提供以下选项:

      一旦-m tcp添加第 7 行,第 7 行和第 8 行仍然失败(显然是在内核验证级别),因为这个

    • ICMP

      icmp(IPv4 特定)

      --protocol icmp如果指定,则可以使用此扩展。 它提供以下选项:

      由于这个原因,第 9 行失败了(显然是在内核验证级别)

因此,即使可以使用--ctproto tcp,只要需要不属于其中的功能,-p tcp -m tcp仍然需要。 ICMP 也是如此。当有更具体的方法可用时,可能不值得conntrack为此使用该模块。

conntrack进行查找连线表可能比特定方法成本更高(但实际上一旦完成查找(按 prio -200连线设施),缓存对条目的引用在数据包的 skbuff 中,状态也直接可用)。

一些备注:

  • nf_conntrack_tcp_loose

    在系统(网络命名空间)级别,此过滤器:

    -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
    

相关内容