mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 22:51:42 +00:00
netfilter: xt_connlimit: pick right dstaddr in NAT scenario
xt_connlimit normally records the "original" tuples in a hashlist (such as "1.2.3.4 -> 5.6.7.8"), and looks in this list for iph->daddr when counting. When the user however uses DNAT in PREROUTING, looking for iph->daddr -- which is now 192.168.9.10 -- will not match. Thus in daddr mode, we need to record the reverse direction tuple ("192.168.9.10 -> 1.2.3.4") instead. In the reverse tuple, the dst addr is on the src side, which is convenient, as count_them still uses &conn->tuple.src.u3. Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
This commit is contained in:
parent
4b3fd57138
commit
ad86e1f27a
@ -185,11 +185,15 @@ connlimit_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
|||||||
int connections;
|
int connections;
|
||||||
|
|
||||||
ct = nf_ct_get(skb, &ctinfo);
|
ct = nf_ct_get(skb, &ctinfo);
|
||||||
if (ct != NULL)
|
if (ct != NULL) {
|
||||||
tuple_ptr = &ct->tuplehash[0].tuple;
|
if (info->flags & XT_CONNLIMIT_DADDR)
|
||||||
else if (!nf_ct_get_tuplepr(skb, skb_network_offset(skb),
|
tuple_ptr = &ct->tuplehash[IP_CT_DIR_REPLY].tuple;
|
||||||
par->family, &tuple))
|
else
|
||||||
|
tuple_ptr = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
|
||||||
|
} else if (!nf_ct_get_tuplepr(skb, skb_network_offset(skb),
|
||||||
|
par->family, &tuple)) {
|
||||||
goto hotdrop;
|
goto hotdrop;
|
||||||
|
}
|
||||||
|
|
||||||
if (par->family == NFPROTO_IPV6) {
|
if (par->family == NFPROTO_IPV6) {
|
||||||
const struct ipv6hdr *iph = ipv6_hdr(skb);
|
const struct ipv6hdr *iph = ipv6_hdr(skb);
|
||||||
|
Loading…
Reference in New Issue
Block a user