微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使其他输入表中的第二个输入链变得可移植?

如何解决如何使其他输入表中的第二个输入链变得可移植?

有我的测试 nft规则集,除表inet测试外,所有作品均有效,但表 f2b-table 却非常相似(除了drop vs接受),效果很好:

table inet f2b-table {
    set addr-set-sshd {
        type ipv4_addr
        elements = { 0.0.0.0 }
    }

    chain input {
        type filter hook input priority filter - 1; policy accept;
        tcp dport { 222 } ip saddr @addr-set-sshd drop
    }
}
table inet default {
    set full_op_port {
        type inet_service
        elements = { 222 }
    }

    set allowed_ips {
        type ipv4_addr
        elements = { 0.0.0.0 }
    }

    chain INPUT {
        type filter hook input priority filter; policy drop;
        ct state invalid drop
        ct state { established,related } accept
        iif "lo" accept
        tcp dport @full_op_port accept
        ip saddr @allowed_ips accept
        ip protocol icmp accept
        counter packets 17 bytes 884
    }

    chain FORWARD {
        type filter hook forward priority filter; policy drop;
    }

    chain OUTPUT {
        type filter hook output priority filter; policy accept;
    }
}
table ip test {
    chain PREROUTING {
        type nat hook prerouting priority filter; policy accept;
    }

    chain POSTROUTING {
        type nat hook postrouting priority srcnat; policy accept;
    }

    chain FORWARD {
        type filter hook forward priority filter; policy drop;
    }
}
table inet test {
    set op_port {
        type inet_service
        elements = { 8888 }
    }

    chain INPUT {
        type filter hook input priority filter - 2; policy accept;
        tcp dport @op_port accept
    }
}

我在tcpdump中看到软件包,我在表表inet测试中进行 count 时看到软件包,但是不接受软件包。我怎么了?

解决方法

answer来自A.B,他说:

仅是为了阐明同一挂钩中可以多次接受(或不接受)数据包:

并在nft手册页上发布

接受

终止规则集评估并接受数据包。数据包仍然可以被丢弃 之后再由另一个钩子(例如在向前钩子中接受)仍允许丢弃 后路由钩中的数据包,或具有更高优先级的另一个前向基链 优先级编号,然后在处理管道中进行评估。

您的默认表基础链优先级0将在测试表基础链优先级-2之后求值,并且由于它具有丢弃策略并且数据包在那里不匹配,因此它将被丢弃。

手册页对此令人困惑。对于允许裁决“终止规则集评估并接受数据包”的说法,它实际上仅以给定的基链优先级终止了规则集的视图。由于优先级较高的数字,具有相同优先级,较低优先级的其他类型的基本链,钩子和家族链仍将在之后运行,并且可以被规则或策略覆盖。这与丢弃判决不同,在丢弃判决中,所有消息均已停止,并且数据包被丢弃。您可以使用日志记录来查看此操作:

nft flush ruleset
nft create table ip table1
nft add chain ip table1 input1 { type filter hook input priority filter\; policy drop\; }
nft add rule ip table1 input1 tcp dport != 8888 accept
nft add rule ip table1 input1 tcp dport 8888 log prefix \"TABLE1_INPUT1 DROPPING \" level info
nft create table ip table2
nft add chain ip table2 input2 { type filter hook input priority filter - 1\; policy accept\; }
nft add rule ip table2 input2 tcp dport != 8888 accept
nft add rule ip table2 input2 tcp dport 8888 log prefix \"TABLE2_INPUT2 BEFORE \" level info
nft add rule ip table2 input2 tcp dport 8888 accept
nft add rule ip table2 input2 tcp dport 8888 log prefix \"TABLE2_INPUT2 AFTER \" level info
,

我在此处添加示例的另一个答案,以阐明将策略与相同家族,类型和钩子的多个基链混合在一起的意外结果。尽管可以在这些优先级上设置相同的优先级,但是绝对不可以。较低的优先级数字意味着较高的优先级,并且将首先运行。错误地应用丢弃策略可能会对您打算接受的流量造成意外的后果。

关于将混合家族inet与ip和ip6混合在一起的效果,我什至不会开始赞美自己,除非说这可能是个坏主意。

警告:示例严重破坏了ipv4流量,并在VM上执行-买方当心!

不良投放策略的示例:

table inet filter {
        chain input1 {
                type filter hook input priority filter + 1; policy drop;
                tcp dport 80 log prefix "input1_" # SEEN
        }

    # input2 chain not evaluated as there is no traffic left after input1
        chain input2 {
                type filter hook input priority filter + 2; policy accept;
                tcp dport 80 accept
                tcp dport 80 log prefix "input2_"
        }
}

好的删除策略的示例:

table inet filter {
        chain input1 {
                type filter hook input priority filter + 1; policy accept;
                tcp dport 80 log prefix "input1_" # SEEN
        }
        chain input2 {
                type filter hook input priority filter + 2; policy drop;
                tcp dport 80 accept
                tcp dport 80 log prefix "input2_" # NOT SEEN due previous accept
        }
}

不良接受政策的示例:

table inet filter {
        chain input1 {
                type filter hook input priority filter + 1; policy accept;
                tcp dport 80 accept
                tcp dport 80 log prefix "input1_" # NOT SEEN due to previous accept
        }
        chain input2 {
                type filter hook input priority filter + 2; policy drop;
                tcp dport 80 log prefix "input2_" # SEEN - chain evaluates
        # all traffic dropped here by policy including accepted input1 traffic
        }
}

可以接受的政策示例:

table inet filter {
        chain input1 {
                type filter hook input priority filter + 1; policy accept;
                tcp dport 80 log prefix "input1_" # SEEN
        }
        chain input2 {
                type filter hook input priority filter + 2; policy drop;
                tcp dport 80 accept
                tcp dport 80 log prefix "input2_" # NOT SEEN due to previous accept
        }
}

如nft手册页中所述,按规则或策略丢弃将立即丢弃,而无需进一步处理优先级较低的基础链。接受不。它会将当前优先级的剩余规则短路,并移交给下一个较低的优先级,但是在此,如果被规则显式删除,则仍然有可能被丢弃;如果没有规则要接受,则仍会被策略隐式删除。

也许最简单的方法是使用单个基本链和跳转/转到非基本链,这是iptables的有效工作方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。