Blame view
net/netfilter/xt_MASQUERADE.c
3.24 KB
d2912cb15
|
1 |
// SPDX-License-Identifier: GPL-2.0-only |
1da177e4c
|
2 3 4 5 |
/* Masquerade. Simple mapping which alters range to a local IP address (depending on route). */ /* (C) 1999-2001 Paul `Rusty' Russell |
5b1158e90
|
6 |
* (C) 2002-2006 Netfilter Core Team <coreteam@netfilter.org> |
1da177e4c
|
7 |
*/ |
ff67e4e42
|
8 |
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
1da177e4c
|
9 |
#include <linux/module.h> |
6709dbbb1
|
10 |
#include <linux/netfilter/x_tables.h> |
c7232c997
|
11 |
#include <net/netfilter/nf_nat.h> |
bf8981a2a
|
12 |
#include <net/netfilter/nf_nat_masquerade.h> |
1da177e4c
|
13 14 15 |
MODULE_LICENSE("GPL"); MODULE_AUTHOR("Netfilter Core Team <coreteam@netfilter.org>"); |
2ae15b64e
|
16 |
MODULE_DESCRIPTION("Xtables: automatic-address SNAT"); |
1da177e4c
|
17 |
|
1da177e4c
|
18 |
/* FIXME: Multiple targets. --RR */ |
135367b8f
|
19 |
static int masquerade_tg_check(const struct xt_tgchk_param *par) |
1da177e4c
|
20 |
{ |
cbc9f2f4f
|
21 |
const struct nf_nat_ipv4_multi_range_compat *mr = par->targinfo; |
1da177e4c
|
22 |
|
cbc9f2f4f
|
23 |
if (mr->range[0].flags & NF_NAT_RANGE_MAP_IPS) { |
ff67e4e42
|
24 25 |
pr_debug("bad MAP_IPS. "); |
d6b00a534
|
26 |
return -EINVAL; |
1da177e4c
|
27 28 |
} if (mr->rangesize != 1) { |
ff67e4e42
|
29 30 |
pr_debug("bad rangesize %u ", mr->rangesize); |
d6b00a534
|
31 |
return -EINVAL; |
1da177e4c
|
32 |
} |
a357b3f80
|
33 |
return nf_ct_netns_get(par->net, par->family); |
1da177e4c
|
34 35 36 |
} static unsigned int |
4b560b447
|
37 |
masquerade_tg(struct sk_buff *skb, const struct xt_action_param *par) |
1da177e4c
|
38 |
{ |
2eb0f624b
|
39 |
struct nf_nat_range2 range; |
cbc9f2f4f
|
40 |
const struct nf_nat_ipv4_multi_range_compat *mr; |
adcb5ad1e
|
41 |
|
7eb355865
|
42 |
mr = par->targinfo; |
8dd33cc93
|
43 44 45 |
range.flags = mr->range[0].flags; range.min_proto = mr->range[0].min; range.max_proto = mr->range[0].max; |
1da177e4c
|
46 |
|
613dbd957
|
47 48 |
return nf_nat_masquerade_ipv4(skb, xt_hooknum(par), &range, xt_out(par)); |
1da177e4c
|
49 |
} |
a357b3f80
|
50 51 52 53 |
static void masquerade_tg_destroy(const struct xt_tgdtor_param *par) { nf_ct_netns_put(par->net, par->family); } |
adf82accc
|
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#if IS_ENABLED(CONFIG_IPV6) static unsigned int masquerade_tg6(struct sk_buff *skb, const struct xt_action_param *par) { return nf_nat_masquerade_ipv6(skb, par->targinfo, xt_out(par)); } static int masquerade_tg6_checkentry(const struct xt_tgchk_param *par) { const struct nf_nat_range2 *range = par->targinfo; if (range->flags & NF_NAT_RANGE_MAP_IPS) return -EINVAL; return nf_ct_netns_get(par->net, par->family); } #endif static struct xt_target masquerade_tg_reg[] __read_mostly = { { #if IS_ENABLED(CONFIG_IPV6) .name = "MASQUERADE", .family = NFPROTO_IPV6, .target = masquerade_tg6, .targetsize = sizeof(struct nf_nat_range), .table = "nat", .hooks = 1 << NF_INET_POST_ROUTING, .checkentry = masquerade_tg6_checkentry, .destroy = masquerade_tg_destroy, .me = THIS_MODULE, }, { #endif .name = "MASQUERADE", .family = NFPROTO_IPV4, .target = masquerade_tg, .targetsize = sizeof(struct nf_nat_ipv4_multi_range_compat), .table = "nat", .hooks = 1 << NF_INET_POST_ROUTING, .checkentry = masquerade_tg_check, .destroy = masquerade_tg_destroy, .me = THIS_MODULE, } |
1da177e4c
|
96 |
}; |
d3c5ee6d5
|
97 |
static int __init masquerade_tg_init(void) |
1da177e4c
|
98 99 |
{ int ret; |
adf82accc
|
100 101 |
ret = xt_register_targets(masquerade_tg_reg, ARRAY_SIZE(masquerade_tg_reg)); |
584eab291
|
102 103 |
if (ret) return ret; |
1da177e4c
|
104 |
|
610a43149
|
105 |
ret = nf_nat_masquerade_inet_register_notifiers(); |
adf82accc
|
106 107 108 109 110 |
if (ret) { xt_unregister_targets(masquerade_tg_reg, ARRAY_SIZE(masquerade_tg_reg)); return ret; } |
1da177e4c
|
111 112 113 |
return ret; } |
d3c5ee6d5
|
114 |
static void __exit masquerade_tg_exit(void) |
1da177e4c
|
115 |
{ |
adf82accc
|
116 |
xt_unregister_targets(masquerade_tg_reg, ARRAY_SIZE(masquerade_tg_reg)); |
610a43149
|
117 |
nf_nat_masquerade_inet_unregister_notifiers(); |
1da177e4c
|
118 |
} |
d3c5ee6d5
|
119 120 |
module_init(masquerade_tg_init); module_exit(masquerade_tg_exit); |
adf82accc
|
121 122 123 124 |
#if IS_ENABLED(CONFIG_IPV6) MODULE_ALIAS("ip6t_MASQUERADE"); #endif MODULE_ALIAS("ipt_MASQUERADE"); |