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 [-]\n" +" --to-ports [[-]][: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 [-][:port-port]\n" +" --to-source [-][: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 -\n" +" --to -[: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)