1

有我的测试nft 规则集,除了表 inet 测试之外的所有工作, 但表f2b-table非常相似(除了 drop vs accept)并且工作正常:

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 测试中计数时看到包,但不接受包。我做错了什么?

4

2 回答 2

0

答案来自AB,他说:

只是为了澄清一个数据包可以在同一个钩子中多次接受(或不接受):

并从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
于 2020-11-21T01:14:17.380 回答
0

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

至于混合家庭 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 的工作方式。

于 2020-11-23T22:41:27.353 回答