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; <<<<<<<<<<<
  }

관련 정보