From: Eric Leblond <eric@inl.fr>
To: netfilter-devel@lists.netfilter.org
Cc: Patrick McHardy <kaber@trash.net>,
Pablo Neira Ayuso <pablo@netfilter.org>
Subject: Resend [patch 2/2] iptables: add random option to SNAT
Date: Mon, 05 Feb 2007 14:25:50 +0100 [thread overview]
Message-ID: <1170681950.5631.4.camel@localhost.localdomain> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 311 bytes --]
Hi,
This is a resend of :
http://patchwork.netfilter.org/netfilter-devel/patch.pl?id=36
Merge window for 2.6.21 is open and kernel part of the feature should
reach kernel tree soon...
BR,
--
Éric Leblond, eleblond@inl.fr
Téléphone : 01 44 89 46 39, Fax : 01 44 89 45 01
INL, http://www.inl.fr
[-- Attachment #1.2: iptables-random-nat.diff --]
[-- Type: text/x-patch, Size: 7534 bytes --]
Index: extensions/libipt_MASQUERADE.c
===================================================================
--- extensions/libipt_MASQUERADE.c (révision 6735)
+++ extensions/libipt_MASQUERADE.c (copie de travail)
@@ -14,7 +14,7 @@
{
printf(
"MASQUERADE v%s options:\n"
-" --to-ports <port>[-<port>]\n"
+" --to-ports [<port>[-<port>]][:random]\n"
" Port (range) to map to.\n\n",
IPTABLES_VERSION);
}
@@ -40,14 +40,30 @@
parse_ports(const char *arg, struct ip_nat_multi_range *mr)
{
const char *dash;
+ char *random;
int port;
+ if (*arg == 'r'){
+ mr->range[0].flags |= IP_NAT_RANGE_PROTO_RANDOM;
+ return;
+ }
+
mr->range[0].flags |= IP_NAT_RANGE_PROTO_SPECIFIED;
port = atoi(arg);
if (port <= 0 || port > 65535)
exit_error(PARAMETER_PROBLEM, "Port `%s' not valid\n", arg);
+ random = strchr(arg, ':');
+ if (random) {
+ if (*(random+1) == 'r') {
+ mr->range[0].flags |= IP_NAT_RANGE_PROTO_RANDOM;
+ *random = '\0';
+ } else {
+ exit_error(PARAMETER_PROBLEM, "Random specification `%s' not valid\n", arg);
+ }
+ }
+
dash = strchr(arg, '-');
if (!dash) {
mr->range[0].min.tcp.port
@@ -125,8 +141,11 @@
printf("%hu", ntohs(r->min.tcp.port));
if (r->max.tcp.port != r->min.tcp.port)
printf("-%hu", ntohs(r->max.tcp.port));
+ if (r->flags & IP_NAT_RANGE_PROTO_RANDOM)
+ printf(":random");
printf(" ");
- }
+ } else if (r->flags & IP_NAT_RANGE_PROTO_RANDOM)
+ printf("random ");
}
/* Saves the union ipt_targinfo in parsable form to stdout. */
@@ -141,8 +160,11 @@
printf("--to-ports %hu", ntohs(r->min.tcp.port));
if (r->max.tcp.port != r->min.tcp.port)
printf("-%hu", ntohs(r->max.tcp.port));
+ if (r->flags & IP_NAT_RANGE_PROTO_RANDOM)
+ printf(":random");
printf(" ");
- }
+ } else if (r->flags & IP_NAT_RANGE_PROTO_RANDOM)
+ printf("--to-ports random ");
}
static struct iptables_target masq = { NULL,
Index: extensions/libipt_SNAT.c
===================================================================
--- extensions/libipt_SNAT.c (révision 6735)
+++ extensions/libipt_SNAT.c (copie de travail)
@@ -22,9 +22,11 @@
{
printf(
"SNAT v%s options:\n"
-" --to-source <ipaddr>[-<ipaddr>][:port-port]\n"
+" --to-source <ipaddr>[-<ipaddr>][:port-port][:random]\n"
" Address to map source to.\n"
-" (You can use this more than once)\n\n",
+" (You can use this more than once)\n"
+" random adds randomness in port selection\n"
+" to avoid attack by port prediction\n",
IPTABLES_VERSION);
}
@@ -57,7 +59,7 @@
parse_to(char *arg, int portok, struct ipt_natinfo *info)
{
struct ip_nat_range range;
- char *colon, *dash, *error;
+ char *colon, *dash, *random;
struct in_addr *ip;
memset(&range, 0, sizeof(range));
@@ -66,44 +68,55 @@
if (colon) {
int port;
- if (!portok)
- exit_error(PARAMETER_PROBLEM,
- "Need TCP or UDP with port specification");
+ if (*(colon+1) == 'r') {
+ /* syntax is IP1-IP2:R we just set random */
+ range.flags |= IP_NAT_RANGE_PROTO_RANDOM;
+ } else {
+ if (!portok)
+ exit_error(PARAMETER_PROBLEM,
+ "Need TCP or UDP with port specification");
- range.flags |= IP_NAT_RANGE_PROTO_SPECIFIED;
+ range.flags |= IP_NAT_RANGE_PROTO_SPECIFIED;
- port = atoi(colon+1);
- if (port <= 0 || port > 65535)
- exit_error(PARAMETER_PROBLEM,
- "Port `%s' not valid\n", colon+1);
+ port = atoi(colon+1);
+ if (port <= 0 || port > 65535)
+ exit_error(PARAMETER_PROBLEM,
+ "Port `%s' not valid\n", colon+1);
- error = strchr(colon+1, ':');
- if (error)
- exit_error(PARAMETER_PROBLEM,
- "Invalid port:port syntax - use dash\n");
+ random = strchr(colon+1, ':');
+ if (random) {
+ if (*(random+1) != 'r'){
+ exit_error(PARAMETER_PROBLEM,
+ "Invalid port:port syntax - use dash\n");
+ } else {
+ range.flags |= IP_NAT_RANGE_PROTO_RANDOM;
+ *random = '\0';
+ }
+ }
- dash = strchr(colon, '-');
- if (!dash) {
- range.min.tcp.port
- = range.max.tcp.port
- = htons(port);
- } else {
- int maxport;
+ dash = strchr(colon, '-');
+ if (!dash) {
+ range.min.tcp.port
+ = range.max.tcp.port
+ = htons(port);
+ } else {
+ int maxport;
- maxport = atoi(dash + 1);
- if (maxport <= 0 || maxport > 65535)
- exit_error(PARAMETER_PROBLEM,
- "Port `%s' not valid\n", dash+1);
- if (maxport < port)
- /* People are stupid. */
- exit_error(PARAMETER_PROBLEM,
- "Port range `%s' funky\n", colon+1);
- range.min.tcp.port = htons(port);
- range.max.tcp.port = htons(maxport);
+ maxport = atoi(dash + 1);
+ if (maxport <= 0 || maxport > 65535)
+ exit_error(PARAMETER_PROBLEM,
+ "Port `%s' not valid\n", dash+1);
+ if (maxport < port)
+ /* People are stupid. */
+ exit_error(PARAMETER_PROBLEM,
+ "Port range `%s' funky\n", colon+1);
+ range.min.tcp.port = htons(port);
+ range.max.tcp.port = htons(maxport);
+ }
+ /* Starts with a colon? No IP info...*/
+ if (colon == arg)
+ return &(append_range(info, &range)->t);
}
- /* Starts with a colon? No IP info...*/
- if (colon == arg)
- return &(append_range(info, &range)->t);
*colon = '\0';
}
@@ -197,6 +210,9 @@
if (r->max.tcp.port != r->min.tcp.port)
printf("-%hu", ntohs(r->max.tcp.port));
}
+ if (r->flags & IP_NAT_RANGE_PROTO_RANDOM) {
+ printf(":random");
+ }
}
/* Prints out the targinfo. */
Index: extensions/libipt_SAME.c
===================================================================
--- extensions/libipt_SAME.c (révision 6735)
+++ extensions/libipt_SAME.c (copie de travail)
@@ -16,7 +16,7 @@
{
printf(
"SAME v%s options:\n"
-" --to <ipaddr>-<ipaddr>\n"
+" --to <ipaddr>-<ipaddr>[:random]\n"
" Addresses to map source to.\n"
" May be specified more than\n"
" once for multiple ranges.\n"
@@ -49,10 +49,21 @@
static void
parse_to(char *arg, struct ip_nat_range *range)
{
- char *dash;
+ char *dash, *random;
struct in_addr *ip;
range->flags |= IP_NAT_RANGE_MAP_IPS;
+
+ random = strchr(arg, ':');
+ if (random) {
+ if (*(random+1) == 'r') {
+ range->flags |= IP_NAT_RANGE_PROTO_RANDOM;
+ *random = '\0';
+ } else {
+ exit_error(PARAMETER_PROBLEM, "Random specification `%s' not valid\n", random+1);
+ }
+ }
+
dash = strchr(arg, '-');
if (dash)
@@ -90,7 +101,7 @@
struct ipt_same_info *mr
= (struct ipt_same_info *)(*target)->data;
- switch (c) {
+switch (c) {
case '1':
if (mr->rangesize == IPT_SAME_MAX_RANGE)
exit_error(PARAMETER_PROBLEM,
@@ -151,10 +162,13 @@
printf("%s", addr_to_dotted(&a));
a.s_addr = r->max_ip;
- if (r->min_ip == r->max_ip)
+ if (r->min_ip != r->max_ip)
+ printf("-%s", addr_to_dotted(&a));
+
+ if (r->flags & IP_NAT_RANGE_PROTO_RANDOM)
+ printf(":random ");
+ else
printf(" ");
- else
- printf("-%s ", addr_to_dotted(&a));
}
if (mr->info & IPT_SAME_NODST)
@@ -177,10 +191,13 @@
printf("--to %s", addr_to_dotted(&a));
a.s_addr = r->max_ip;
- if (r->min_ip == r->max_ip)
+ if (r->min_ip != r->max_ip)
+ printf("-%s", addr_to_dotted(&a));
+
+ if (r->flags & IP_NAT_RANGE_PROTO_RANDOM)
+ printf(":random ");
+ else
printf(" ");
- else
- printf("-%s ", addr_to_dotted(&a));
}
if (mr->info & IPT_SAME_NODST)
[-- Attachment #2: Ceci est une partie de message numériquement signée --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
next reply other threads:[~2007-02-05 13:25 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-05 13:25 Eric Leblond [this message]
2007-02-05 15:06 ` Resend [patch 2/2] iptables: add random option to SNAT Patrick McHardy
2007-02-05 15:55 ` Eric Leblond
2007-02-12 13:40 ` Patrick McHardy
2007-02-12 18:38 ` Jan Engelhardt
2007-02-12 19:38 ` Patrick McHardy
2007-02-24 14:10 ` Eric Leblond
2007-02-24 14:21 ` Patrick McHardy
-- strict thread matches above, loose matches on Subject: below --
2007-01-12 16:59 [Patch 0/2] Avoid direct connections between NATed hosts Eric Leblond
2007-01-12 22:53 ` Jan Engelhardt
2007-01-13 12:06 ` Resend [Patch 2/2] iptables: add random option to SNAT Eric Leblond
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1170681950.5631.4.camel@localhost.localdomain \
--to=eric@inl.fr \
--cc=kaber@trash.net \
--cc=netfilter-devel@lists.netfilter.org \
--cc=pablo@netfilter.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.