iptables: allow service names in [DS]NAT targets
PATCH 1/1 iptables: allow service names in [DS]NAT targets
As reported by Alexander Hoogerhuis, the [DS]NAT targets do not allow use of service names in the --to argument. The same problem was fixed in the REDIRECT target in commit 84d758b3 ("extensions: REDIRECT: fix --to-ports parser"). Use a similar fix here.
This closes bugzilla #514.
Phil
Signed-off-by Phil Oester <[email protected]>
extensions/libipt_DNAT.c +18 -22
@@ -67,7 +67,7 @@ static struct xt_entry_target * parse_to(const char *orig_arg, int portok, struct ipt_natinfo *info) { struct nf_nat_ipv4_range range; -char *arg, *colon, *dash, *error; +char *arg, *colon, *dash;const struct in_addr *ip; arg =strdup (orig_arg);
@@ -77,7 +77,8 @@ parse_to(const char *orig_arg, int portok, struct ipt_natinfo *info) colon =strchr (arg,':' );if (colon) { -int port; +char *end ="" ; +unsigned int port, maxport;if (!portok) xtables_error(PARAMETER_PROBLEM,
@@ -85,34 +86,29 @@ parse_to(const char *orig_arg, int portok, struct ipt_natinfo *info) range.flags |=NF_NAT_RANGE_PROTO_SPECIFIED ; - port =atoi (colon+1 ); -if (port <=0 || port >65535 ) -xtables_error (PARAMETER_PROBLEM , -"Port `%s' not valid\n" , colon+1 ); - - error =strchr (colon+1 ,':' ); -if (error) -xtables_error (PARAMETER_PROBLEM , -"Invalid port:port syntax - use dash\n" ); +if (!xtables_strtoui (colon +1 , &end, &port,0 ,UINT16_MAX ) && + (port =xtables_service_to_port (colon +1 ,NULL )) == (unsigned )-1 ) +xtables_param_act (XTF_BAD_VALUE ,"DNAT" ,"--to" , arg); - dash =strchr (colon,'-' ); -if (!dash) { +switch (*end) { +case '\0' : range.min.tcp.port = range.max.tcp.port =htons (port); - }else { -int maxport; +break ; +case '-' : +if (!xtables_strtoui (end +1 ,NULL , &maxport,0 ,UINT16_MAX ) && + (maxport =xtables_service_to_port (end +1 ,NULL )) == (unsigned )-1 ) +xtables_param_act (XTF_BAD_VALUE ,"DNAT" ,"--to" , arg); - maxport =atoi (dash +1 ); -if (maxport <=0 || maxport >65535 ) -xtables_error (PARAMETER_PROBLEM , -"Port `%s' not valid\n" , dash+1 );if (maxport < port) -/* People are stupid. */ -xtables_error (PARAMETER_PROBLEM , -"Port range `%s' funky\n" , colon+1 ); +xtables_param_act (XTF_BAD_VALUE ,"DNAT" ,"--to" , arg); + range.min.tcp.port =htons (port); range.max.tcp.port =htons (maxport); +break ; +default : +xtables_param_act (XTF_BAD_VALUE ,"DNAT" ,"--to" , arg); }/* Starts with a colon? No IP info...*/ if (colon == arg) {
extensions/libipt_SNAT.c +18 -22
@@ -67,7 +67,7 @@ static struct xt_entry_target * parse_to(const char *orig_arg, int portok, struct ipt_natinfo *info) { struct nf_nat_ipv4_range range; -char *arg, *colon, *dash, *error; +char *arg, *colon, *dash;const struct in_addr *ip; arg =strdup (orig_arg);
@@ -77,7 +77,8 @@ parse_to(const char *orig_arg, int portok, struct ipt_natinfo *info) colon =strchr (arg,':' );if (colon) { -int port; +char *end ="" ; +unsigned int port, maxport;if (!portok) xtables_error(PARAMETER_PROBLEM,
@@ -85,34 +86,29 @@ parse_to(const char *orig_arg, int portok, struct ipt_natinfo *info) range.flags |=NF_NAT_RANGE_PROTO_SPECIFIED ; - port =atoi (colon+1 ); -if (port <=0 || port >65535 ) -xtables_error (PARAMETER_PROBLEM , -"Port `%s' not valid\n" , colon+1 ); - - error =strchr (colon+1 ,':' ); -if (error) -xtables_error (PARAMETER_PROBLEM , -"Invalid port:port syntax - use dash\n" ); +if (!xtables_strtoui (colon +1 , &end, &port,0 ,UINT16_MAX ) && + (port =xtables_service_to_port (colon +1 ,NULL )) == (unsigned )-1 ) +xtables_param_act (XTF_BAD_VALUE ,"SNAT" ,"--to" , arg); - dash =strchr (colon,'-' ); -if (!dash) { +switch (*end) { +case '\0' : range.min.tcp.port = range.max.tcp.port =htons (port); - }else { -int maxport; +break ; +case '-' : +if (!xtables_strtoui (end +1 ,NULL , &maxport,0 ,UINT16_MAX ) && + (maxport =xtables_service_to_port (end +1 ,NULL )) == (unsigned )-1 ) +xtables_param_act (XTF_BAD_VALUE ,"SNAT" ,"--to" , arg); - maxport =atoi (dash +1 ); -if (maxport <=0 || maxport >65535 ) -xtables_error (PARAMETER_PROBLEM , -"Port `%s' not valid\n" , dash+1 );if (maxport < port) -/* People are stupid. */ -xtables_error (PARAMETER_PROBLEM , -"Port range `%s' funky\n" , colon+1 ); +xtables_param_act (XTF_BAD_VALUE ,"SNAT" ,"--to" , arg); + range.min.tcp.port =htons (port); range.max.tcp.port =htons (maxport); +break ; +default : +xtables_param_act (XTF_BAD_VALUE ,"SNAT" ,"--to" , arg); }/* Starts with a colon? No IP info...*/ if (colon == arg) {
Pablo Neira Ayuso
maintainerQuoted 4 lines · Phil Oester
As reported by Alexander Hoogerhuis, the [DS]NAT targets do not allow use of service names in the --to argument. The same problem was fixed in the REDIRECT target in commit
84d758b3("extensions: REDIRECT: fix --to-ports parser"). Use a similar fix here.
We also have libip6t_SNAT and libip6t_DNAT these days. Can you rework the patch to support that there as well? Thanks.