aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2012-08-26 13:14:01 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2012-08-29 21:00:12 -0400
commit811927ccfe90fbfcfff5253ba7f95057f6cae692 (patch)
treec0e2606135bef4b786b3ee60126d02d64528c0a4
parent2b60af017880f7dc35d1fac65f48fc94f8a3c1ec (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.c3
-rw-r--r--net/netfilter/nf_conntrack_ftp.c3
-rw-r--r--net/netfilter/nf_conntrack_h323_main.c41
-rw-r--r--net/netfilter/nf_conntrack_irc.c3
-rw-r--r--net/netfilter/nf_conntrack_sip.c18
-rw-r--r--net/netfilter/nf_conntrack_tftp.c3
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) &&