diff options
| author | Patrick McHardy <kaber@trash.net> | 2012-08-26 13:14:01 -0400 |
|---|---|---|
| committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-08-29 21:00:12 -0400 |
| commit | 811927ccfe90fbfcfff5253ba7f95057f6cae692 (patch) | |
| tree | c0e2606135bef4b786b3ee60126d02d64528c0a4 | |
| parent | 2b60af017880f7dc35d1fac65f48fc94f8a3c1ec (diff) | |
netfilter: nf_conntrack: restrict NAT helper invocation to IPv4
The NAT helpers currently only handle IPv4 packets correctly. Restrict
invocation of the helpers to IPv4 in preparation of IPv6 NAT.
Signed-off-by: Patrick McHardy <kaber@trash.net>
| -rw-r--r-- | net/netfilter/nf_conntrack_amanda.c | 3 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_ftp.c | 3 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_h323_main.c | 41 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_irc.c | 3 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_sip.c | 18 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_tftp.c | 3 |
6 files changed, 49 insertions, 22 deletions
diff --git a/net/netfilter/nf_conntrack_amanda.c b/net/netfilter/nf_conntrack_amanda.c index f2de8c55ac50..184c0dc6e437 100644 --- a/net/netfilter/nf_conntrack_amanda.c +++ b/net/netfilter/nf_conntrack_amanda.c | |||
| @@ -154,7 +154,8 @@ static int amanda_help(struct sk_buff *skb, | |||
| 154 | IPPROTO_TCP, NULL, &port); | 154 | IPPROTO_TCP, NULL, &port); |
| 155 | 155 | ||
| 156 | nf_nat_amanda = rcu_dereference(nf_nat_amanda_hook); | 156 | nf_nat_amanda = rcu_dereference(nf_nat_amanda_hook); |
| 157 | if (nf_nat_amanda && ct->status & IPS_NAT_MASK) | 157 | if (nf_nat_amanda && nf_ct_l3num(ct) == NFPROTO_IPV4 && |
| 158 | ct->status & IPS_NAT_MASK) | ||
| 158 | ret = nf_nat_amanda(skb, ctinfo, off - dataoff, | 159 | ret = nf_nat_amanda(skb, ctinfo, off - dataoff, |
| 159 | len, exp); | 160 | len, exp); |
| 160 | else if (nf_ct_expect_related(exp) != 0) | 161 | else if (nf_ct_expect_related(exp) != 0) |
diff --git a/net/netfilter/nf_conntrack_ftp.c b/net/netfilter/nf_conntrack_ftp.c index 4bb771d1f57a..3e1587e63c03 100644 --- a/net/netfilter/nf_conntrack_ftp.c +++ b/net/netfilter/nf_conntrack_ftp.c | |||
| @@ -487,7 +487,8 @@ static int help(struct sk_buff *skb, | |||
| 487 | /* Now, NAT might want to mangle the packet, and register the | 487 | /* Now, NAT might want to mangle the packet, and register the |
| 488 | * (possibly changed) expectation itself. */ | 488 | * (possibly changed) expectation itself. */ |
| 489 | nf_nat_ftp = rcu_dereference(nf_nat_ftp_hook); | 489 | nf_nat_ftp = rcu_dereference(nf_nat_ftp_hook); |
| 490 | if (nf_nat_ftp && ct->status & IPS_NAT_MASK) | 490 | if (nf_nat_ftp && nf_ct_l3num(ct) == NFPROTO_IPV4 && |
| 491 | ct->status & IPS_NAT_MASK) | ||
| 491 | ret = nf_nat_ftp(skb, ctinfo, search[dir][i].ftptype, | 492 | ret = nf_nat_ftp(skb, ctinfo, search[dir][i].ftptype, |
| 492 | matchoff, matchlen, exp); | 493 | matchoff, matchlen, exp); |
| 493 | else { | 494 | else { |
diff --git a/net/netfilter/nf_conntrack_h323_main.c b/net/netfilter/nf_conntrack_h323_main.c index 4283b207e63b..517c5e3fe7c6 100644 --- a/net/netfilter/nf_conntrack_h323_main.c +++ b/net/netfilter/nf_conntrack_h323_main.c | |||
| @@ -295,6 +295,7 @@ static int expect_rtp_rtcp(struct sk_buff *skb, struct nf_conn *ct, | |||
| 295 | &ct->tuplehash[!dir].tuple.dst.u3, | 295 | &ct->tuplehash[!dir].tuple.dst.u3, |
| 296 | sizeof(ct->tuplehash[dir].tuple.src.u3)) && | 296 | sizeof(ct->tuplehash[dir].tuple.src.u3)) && |
| 297 | (nat_rtp_rtcp = rcu_dereference(nat_rtp_rtcp_hook)) && | 297 | (nat_rtp_rtcp = rcu_dereference(nat_rtp_rtcp_hook)) && |
| 298 | nf_ct_l3num(ct) == NFPROTO_IPV4 && | ||
| 298 | ct->status & IPS_NAT_MASK) { | 299 | ct->status & IPS_NAT_MASK) { |
| 299 | /* NAT needed */ | 300 | /* NAT needed */ |
| 300 | ret = nat_rtp_rtcp(skb, ct, ctinfo, data, dataoff, | 301 | ret = nat_rtp_rtcp(skb, ct, ctinfo, data, dataoff, |
| @@ -353,6 +354,7 @@ static int expect_t120(struct sk_buff *skb, | |||
| 353 | &ct->tuplehash[!dir].tuple.dst.u3, | 354 | &ct->tuplehash[!dir].tuple.dst.u3, |
| 354 | sizeof(ct->tuplehash[dir].tuple.src.u3)) && | 355 | sizeof(ct->tuplehash[dir].tuple.src.u3)) && |
| 355 | (nat_t120 = rcu_dereference(nat_t120_hook)) && | 356 | (nat_t120 = rcu_dereference(nat_t120_hook)) && |
| 357 | nf_ct_l3num(ct) == NFPROTO_IPV4 && | ||
| 356 | ct->status & IPS_NAT_MASK) { | 358 | ct->status & IPS_NAT_MASK) { |
| 357 | /* NAT needed */ | 359 | /* NAT needed */ |
| 358 | ret = nat_t120(skb, ct, ctinfo, data, dataoff, taddr, | 360 | ret = nat_t120(skb, ct, ctinfo, data, dataoff, taddr, |
| @@ -688,6 +690,7 @@ static int expect_h245(struct sk_buff *skb, struct nf_conn *ct, | |||
| 688 | &ct->tuplehash[!dir].tuple.dst.u3, | 690 | &ct->tuplehash[!dir].tuple.dst.u3, |
| 689 | sizeof(ct->tuplehash[dir].tuple.src.u3)) && | 691 | sizeof(ct->tuplehash[dir].tuple.src.u3)) && |
| 690 | (nat_h245 = rcu_dereference(nat_h245_hook)) && | 692 | (nat_h245 = rcu_dereference(nat_h245_hook)) && |
| 693 | nf_ct_l3num(ct) == NFPROTO_IPV4 && | ||
| 691 | ct->status & IPS_NAT_MASK) { | 694 | ct->status & IPS_NAT_MASK) { |
| 692 | /* NAT needed */ | 695 | /* NAT needed */ |
| 693 | ret = nat_h245(skb, ct, ctinfo, data, dataoff, taddr, | 696 | ret = nat_h245(skb, ct, ctinfo, data, dataoff, taddr, |
| @@ -811,6 +814,7 @@ static int expect_callforwarding(struct sk_buff *skb, | |||
| 811 | &ct->tuplehash[!dir].tuple.dst.u3, | 814 | &ct->tuplehash[!dir].tuple.dst.u3, |
| 812 | sizeof(ct->tuplehash[dir].tuple.src.u3)) && | 815 | sizeof(ct->tuplehash[dir].tuple.src.u3)) && |
| 813 | (nat_callforwarding = rcu_dereference(nat_callforwarding_hook)) && | 816 | (nat_callforwarding = rcu_dereference(nat_callforwarding_hook)) && |
| 817 | nf_ct_l3num(ct) == NFPROTO_IPV4 && | ||
| 814 | ct->status & IPS_NAT_MASK) { | 818 | ct->status & IPS_NAT_MASK) { |
| 815 | /* Need NAT */ | 819 | /* Need NAT */ |
| 816 | ret = nat_callforwarding(skb, ct, ctinfo, data, dataoff, | 820 | ret = nat_callforwarding(skb, ct, ctinfo, data, dataoff, |
| @@ -852,7 +856,8 @@ static int process_setup(struct sk_buff *skb, struct nf_conn *ct, | |||
| 852 | 856 | ||
| 853 | set_h225_addr = rcu_dereference(set_h225_addr_hook); | 857 | set_h225_addr = rcu_dereference(set_h225_addr_hook); |
| 854 | if ((setup->options & eSetup_UUIE_destCallSignalAddress) && | 858 | if ((setup->options & eSetup_UUIE_destCallSignalAddress) && |
| 855 | (set_h225_addr) && ct->status & IPS_NAT_MASK && | 859 | (set_h225_addr) && nf_ct_l3num(ct) == NFPROTO_IPV4 && |
| 860 | ct->status & IPS_NAT_MASK && | ||
| 856 | get_h225_addr(ct, *data, &setup->destCallSignalAddress, | 861 | get_h225_addr(ct, *data, &setup->destCallSignalAddress, |
| 857 | &addr, &port) && | 862 | &addr, &port) && |
| 858 | memcmp(&addr, &ct->tuplehash[!dir].tuple.src.u3, sizeof(addr))) { | 863 | memcmp(&addr, &ct->tuplehash[!dir].tuple.src.u3, sizeof(addr))) { |
| @@ -868,7 +873,8 @@ static int process_setup(struct sk_buff *skb, struct nf_conn *ct, | |||
| 868 | } | 873 | } |
| 869 | 874 | ||
| 870 | if ((setup->options & eSetup_UUIE_sourceCallSignalAddress) && | 875 | if ((setup->options & eSetup_UUIE_sourceCallSignalAddress) && |
| 871 | (set_h225_addr) && ct->status & IPS_NAT_MASK && | 876 | (set_h225_addr) && nf_ct_l3num(ct) == NFPROTO_IPV4 && |
| 877 | ct->status & IPS_NAT_MASK && | ||
| 872 | get_h225_addr(ct, *data, &setup->sourceCallSignalAddress, | 878 | get_h225_addr(ct, *data, &setup->sourceCallSignalAddress, |
| 873 | &addr, &port) && | 879 | &addr, &port) && |
| 874 | memcmp(&addr, &ct->tuplehash[!dir].tuple.dst.u3, sizeof(addr))) { | 880 | memcmp(&addr, &ct->tuplehash[!dir].tuple.dst.u3, sizeof(addr))) { |
| @@ -1278,7 +1284,8 @@ static int expect_q931(struct sk_buff *skb, struct nf_conn *ct, | |||
| 1278 | exp->flags = NF_CT_EXPECT_PERMANENT; /* Accept multiple calls */ | 1284 | exp->flags = NF_CT_EXPECT_PERMANENT; /* Accept multiple calls */ |
| 1279 | 1285 | ||
| 1280 | nat_q931 = rcu_dereference(nat_q931_hook); | 1286 | nat_q931 = rcu_dereference(nat_q931_hook); |
| 1281 | if (nat_q931 && ct->status & IPS_NAT_MASK) { /* Need NAT */ | 1287 | if (nat_q931 && nf_ct_l3num(ct) == NFPROTO_IPV4 && |
| 1288 | ct->status & IPS_NAT_MASK) { /* Need NAT */ | ||
| 1282 | ret = nat_q931(skb, ct, ctinfo, data, taddr, i, port, exp); | 1289 | ret = nat_q931(skb, ct, ctinfo, data, taddr, i, port, exp); |
| 1283 | } else { /* Conntrack only */ | 1290 | } else { /* Conntrack only */ |
| 1284 | if (nf_ct_expect_related(exp) == 0) { | 1291 | if (nf_ct_expect_related(exp) == 0) { |
| @@ -1306,7 +1313,8 @@ static int process_grq(struct sk_buff *skb, struct nf_conn *ct, | |||
| 1306 | pr_debug("nf_ct_ras: GRQ\n"); | 1313 | pr_debug("nf_ct_ras: GRQ\n"); |
| 1307 | 1314 | ||
| 1308 | set_ras_addr = rcu_dereference(set_ras_addr_hook); | 1315 | set_ras_addr = rcu_dereference(set_ras_addr_hook); |
| 1309 | if (set_ras_addr && ct->status & IPS_NAT_MASK) /* NATed */ | 1316 | if (set_ras_addr && nf_ct_l3num(ct) == NFPROTO_IPV4 && |
| 1317 | ct->status & IPS_NAT_MASK) /* NATed */ | ||
| 1310 | return set_ras_addr(skb, ct, ctinfo, data, | 1318 | return set_ras_addr(skb, ct, ctinfo, data, |
| 1311 | &grq->rasAddress, 1); | 1319 | &grq->rasAddress, 1); |
| 1312 | return 0; | 1320 | return 0; |
| @@ -1374,7 +1382,8 @@ static int process_rrq(struct sk_buff *skb, struct nf_conn *ct, | |||
| 1374 | return -1; | 1382 | return -1; |
| 1375 | 1383 | ||
| 1376 | set_ras_addr = rcu_dereference(set_ras_addr_hook); | 1384 | set_ras_addr = rcu_dereference(set_ras_addr_hook); |
| 1377 | if (set_ras_addr && ct->status & IPS_NAT_MASK) { | 1385 | if (set_ras_addr && nf_ct_l3num(ct) == NFPROTO_IPV4 && |
| 1386 | ct->status & IPS_NAT_MASK) { | ||
| 1378 | ret = set_ras_addr(skb, ct, ctinfo, data, | 1387 | ret = set_ras_addr(skb, ct, ctinfo, data, |
| 1379 | rrq->rasAddress.item, | 1388 | rrq->rasAddress.item, |
| 1380 | rrq->rasAddress.count); | 1389 | rrq->rasAddress.count); |
| @@ -1405,7 +1414,8 @@ static int process_rcf(struct sk_buff *skb, struct nf_conn *ct, | |||
| 1405 | pr_debug("nf_ct_ras: RCF\n"); | 1414 | pr_debug("nf_ct_ras: RCF\n"); |
| 1406 | 1415 | ||
| 1407 | set_sig_addr = rcu_dereference(set_sig_addr_hook); | 1416 | set_sig_addr = rcu_dereference(set_sig_addr_hook); |
| 1408 | if (set_sig_addr && ct->status & IPS_NAT_MASK) { | 1417 | if (set_sig_addr && nf_ct_l3num(ct) == NFPROTO_IPV4 && |
| 1418 | ct->status & IPS_NAT_MASK) { | ||
| 1409 | ret = set_sig_addr(skb, ct, ctinfo, data, | 1419 | ret = set_sig_addr(skb, ct, ctinfo, data, |
| 1410 | rcf->callSignalAddress.item, | 1420 | rcf->callSignalAddress.item, |
| 1411 | rcf->callSignalAddress.count); | 1421 | rcf->callSignalAddress.count); |
| @@ -1453,7 +1463,8 @@ static int process_urq(struct sk_buff *skb, struct nf_conn *ct, | |||
| 1453 | pr_debug("nf_ct_ras: URQ\n"); | 1463 | pr_debug("nf_ct_ras: URQ\n"); |
| 1454 | 1464 | ||
| 1455 | set_sig_addr = rcu_dereference(set_sig_addr_hook); | 1465 | set_sig_addr = rcu_dereference(set_sig_addr_hook); |
| 1456 | if (set_sig_addr && ct->status & IPS_NAT_MASK) { | 1466 | if (set_sig_addr && nf_ct_l3num(ct) == NFPROTO_IPV4 && |
| 1467 | ct->status & IPS_NAT_MASK) { | ||
| 1457 | ret = set_sig_addr(skb, ct, ctinfo, data, | 1468 | ret = set_sig_addr(skb, ct, ctinfo, data, |
| 1458 | urq->callSignalAddress.item, | 1469 | urq->callSignalAddress.item, |
| 1459 | urq->callSignalAddress.count); | 1470 | urq->callSignalAddress.count); |
| @@ -1491,6 +1502,7 @@ static int process_arq(struct sk_buff *skb, struct nf_conn *ct, | |||
| 1491 | &addr, &port) && | 1502 | &addr, &port) && |
