--- a/extensions/libipt_MASQUERADE.c +++ b/extensions/libipt_MASQUERADE.c @@ -11,6 +11,7 @@ enum { O_TO_PORTS = 0, O_RANDOM, + O_MODE, O_RANDOM_FULLY, }; @@ -23,13 +24,16 @@ static void MASQUERADE_help(void) " --random\n" " Randomize source port.\n" " --random-fully\n" -" Fully randomize source port.\n"); +" Fully randomize source port.\n" +" --mode \n" +" NAT mode.\n"); } static const struct xt_option_entry MASQUERADE_opts[] = { {.name = "to-ports", .id = O_TO_PORTS, .type = XTTYPE_STRING}, {.name = "random", .id = O_RANDOM, .type = XTTYPE_NONE}, {.name = "random-fully", .id = O_RANDOM_FULLY, .type = XTTYPE_NONE}, + {.name = "mode", .id = O_MODE, .type = XTTYPE_STRING}, XTOPT_TABLEEND, }; @@ -90,6 +94,8 @@ static void MASQUERADE_parse(struct xt_o else portok = 0; + mr->range[0].min_ip = 0; + xtables_option_parse(cb); switch (cb->entry->id) { case O_TO_PORTS: @@ -104,6 +110,15 @@ static void MASQUERADE_parse(struct xt_o case O_RANDOM_FULLY: mr->range[0].flags |= NF_NAT_RANGE_PROTO_RANDOM_FULLY; break; + case O_MODE: + if (strcasecmp(cb->arg, "fullcone") == 0) + mr->range[0].min_ip = 1; + else if (strcasecmp(cb->arg, "symmetric") == 0) + mr->range[0].min_ip = 0; + else + xtables_error(PARAMETER_PROBLEM, + "Unknown mode %s", cb->arg); + break; } } @@ -126,6 +141,9 @@ MASQUERADE_print(const void *ip, const s if (r->flags & NF_NAT_RANGE_PROTO_RANDOM_FULLY) printf(" random-fully"); + + if (r->min_ip == 1) + printf(" mode: fullcone"); } static void @@ -145,6 +163,9 @@ MASQUERADE_save(const void *ip, const st if (r->flags & NF_NAT_RANGE_PROTO_RANDOM_FULLY) printf(" --random-fully"); + + if (r->min_ip == 1) + printf(" --mode fullcone"); } static int MASQUERADE_xlate(struct xt_xlate *xl,