나는 그들이 어떻게 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
0xXYZ
만 0xFFFFFFFF
규칙과 일치할 수 있음을 의미합니다.
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; <<<<<<<<<<<
}