LINUX.ORG.RU

История изменений

Исправление vel, (текущая версия) :

Год или два назад здесь была аналогичная тема. Я специально тогда в исходниках смотрел и сейчас не поленился!

3.0, 3.4, 3.14, 3.18, 4.4, 4.9, 4.14, 4.19, 5.0, 5.1, 5.2

Практически буква в букву.

net/ipv4/netfilter/iptable_mangle.c:ipt_mangle_out()

        /* Save things which could affect route */
        mark = skb->mark;
        iph = ip_hdr(skb);
        saddr = iph->saddr;
        daddr = iph->daddr;
        tos = iph->tos;

        ret = ipt_do_table(skb, state, state->net->ipv4.iptable_mangle);
        /* Reroute for ANY change. */
        if (ret != NF_DROP && ret != NF_STOLEN) {
                iph = ip_hdr(skb);
                            
                if (iph->saddr != saddr ||
                    iph->daddr != daddr ||
                    skb->mark != mark ||
                    iph->tos != tos) {
                        err = ip_route_me_harder(state->net, skb, RTN_UNSPEC);
                        if (err < 0)
                                ret = NF_DROP_ERR(err);
                }
        }
Интересно? Этот код времен очакова и покорения крыма :)

интересно, чем бы штатным сменить daddr в mangle/output?

Какой кошмар. Уж лучше split DNS, чем это.

Ну не знаю. Если у тебя 1.5 зоны, то может быть и проще.

Исходная версия vel, :

Год или два назад здесь была аналогичная тема. Я специально тогда в исходниках смотрел и сейчас не поленился!

3.0, 3.4, 3.14, 3.18, 4.4, 4.9, 4.14, 4.19, 5.0, 5.1, 5.2

Практически буква в букву.

net/ipv4/netfilter/iptable_mangle.c:ipt_mangle_out()

        /* Save things which could affect route */
        mark = skb->mark;
        iph = ip_hdr(skb);
        saddr = iph->saddr;
        daddr = iph->daddr;
        tos = iph->tos;

        ret = ipt_do_table(skb, state, state->net->ipv4.iptable_mangle);
        /* Reroute for ANY change. */
        if (ret != NF_DROP && ret != NF_STOLEN) {
                iph = ip_hdr(skb);
                            
                if (iph->saddr != saddr ||
                    iph->daddr != daddr ||
                    skb->mark != mark ||
                    iph->tos != tos) {
                        err = ip_route_me_harder(state->net, skb, RTN_UNSPEC);
                        if (err < 0)
                                ret = NF_DROP_ERR(err);
                }
        }
Интересно? Этот код времен очакова и покорения крыма :)

PS интересно, чем бы штатным сменить daddr в mangle/output?