ipルールコマンドでマスクでfwmarkを使用する方法

ipルールコマンドでマスクでfwmarkを使用する方法

私は彼らがどのようにip rule add fwmark協力しているのか理解しようとしていますmask

たとえば、 ip ruleこのコマンドは次の規則を表示します。 100: すべての fwmark 0xd00/0xffffff00 から 6017 を検索します。

したがって、パケットが「0xd70」タグで到着すると、IPルールのタグと一致しようとしますが、fwmarkとマスク「0xd00 / 0xffffff00」を使用して「0xd70」をどのように計算しますか?

ありがとうございます!

答え1

fwmaskまたは、カーネルのiprouteリリースノートに関する情報はあまりありません。最後に、fwmaskカーネルコードから得なければならない実際の意味は次のとおりです。

static int fib_rule_match(struct fib_rule *rule, struct fib_rules_ops *ops, struct flowi *fl, int flags, struct fib_lookup_arg *arg)
{
  int ret = 0;
  if (rule->iifindex && (rule->iifindex != fl->flowi_iif))
     goto out;
  if (rule->oifindex && (rule->oifindex != fl->flowi_oif))
     goto out;
  if ((rule->mark ^ fl->flowi_mark) & rule->mark_mask)  <<<<<<<<<<<
     goto out;
  if (rule->tun_id && (rule->tun_id != fl->flowi_tun_key.tun_id))
     goto out;
  if (rule->l3mdev && !l3mdev_fib_rule_match(rule->fr_net, fl, arg))
     goto out;
  if (uid_lt(fl->flowi_uid, rule->uid_range.start) || uid_gt(fl->flowi_uid, rule->uid_range.end))
     goto out;
    
  ret = ops->match(rule, fl, flags);

  out:
  return (rule->flags & FIB_RULE_INVERT) ? !ret : ret;
}

具体的にはfwmark、 // はタグ自体だけがルールfwmask 0xXYZ0xFFFFFFFF一致できることを意味します。

int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, struct netlink_ext_ack *extack)
{
  struct net *net = sock_net(skb->sk);
  struct fib_rule_hdr *frh = nlmsg_data(nlh);
  ...

  if (tb[FRA_FWMARK]) {
    rule->mark = nla_get_u32(tb[FRA_FWMARK]);
    if (rule->mark)
      /* compatibility: if the mark value is non-zero all bits
       * are compared unless a mask is explicitly specified.
       */
     rule->mark_mask = 0xFFFFFFFF; <<<<<<<<<<<
  }

関連情報