1
0
mirror of https://git.FreeBSD.org/src.git synced 2026-06-02 11:24:32 +00:00

ipfw: fix parsing error in nat config port_range

Also fix the corresponding tests.

PR:		263240
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D57010
This commit is contained in:
Vyacheslav Terehov
2026-05-21 10:15:22 +03:00
committed by Andrey V. Elsukov
parent 1d0410fb34
commit 6eba055fcf
3 changed files with 32 additions and 26 deletions
+2 -1
View File
@@ -1,5 +1,5 @@
.\" .\"
.Dd March 1, 2026 .Dd May 21, 2026
.Dt IPFW 8 .Dt IPFW 8
.Os .Os
.Sh NAME .Sh NAME
@@ -3519,6 +3519,7 @@ Obey transparent proxy rules only, packet aliasing is not performed.
Skip instance in case of global state lookup (see below). Skip instance in case of global state lookup (see below).
.It Cm port_range Ar lower-upper .It Cm port_range Ar lower-upper
Set the aliasing ports between the ranges given. Set the aliasing ports between the ranges given.
Ports must be in the range 1024-65535.
Upper port has to be greater than lower. Upper port has to be greater than lower.
.It Cm udp_eim .It Cm udp_eim
When enabled, UDP packets use endpoint-independent mapping (EIM) from RFC 4787 When enabled, UDP packets use endpoint-independent mapping (EIM) from RFC 4787
+16 -13
View File
@@ -757,25 +757,28 @@ nat_show_cfg(struct nat44_cfg_nat *n, void *arg __unused)
} }
static int static int
nat_port_alias_parse(char *str, u_short *lpout, u_short *hpout) { nat_port_alias_parse(char *str, u_short *lpout, u_short *hpout)
{
long lp, hp; long lp, hp;
char *ptr; char *ptr, *substr;
substr = strsep(&str, "-");
if (substr == NULL || str == NULL)
return (0);
/* Lower port parsing */ /* Lower port parsing */
lp = (long) strtol(str, &ptr, 10); lp = (long) strtol(substr, &ptr, 0);
if (lp < 1024 || lp > 65535) if (*ptr != '\0' || lp < 1024 || lp > 65535)
return 0; return (0);
if (!ptr || *ptr != '-')
return 0;
/* Upper port parsing */ /* Upper port parsing */
hp = (long) strtol(ptr, &ptr, 10); hp = (long) strtol(str, &ptr, 0);
if (hp < 1024 || hp > 65535) if (*ptr != '\0' || hp < 1024 || hp > 65535)
return 0; return (0);
if (ptr)
return 0;
*lpout = (u_short) lp; *lpout = (u_short) lp;
*hpout = (u_short) hp; *hpout = (u_short) hp;
return 1; return (1);
} }
void void
+14 -12
View File
@@ -26,6 +26,8 @@
# #
# #
set -e
. $(atf_get_srcdir)/utils.subr . $(atf_get_srcdir)/utils.subr
. $(atf_get_srcdir)/runner.subr . $(atf_get_srcdir)/runner.subr
@@ -178,13 +180,13 @@ common_cgn() {
atf_check -s exit:2 -o ignore jexec client1 ping -t 1 -c 1 198.51.100.2 atf_check -s exit:2 -o ignore jexec client1 ping -t 1 -c 1 198.51.100.2
atf_check -s exit:2 -o ignore jexec client2 ping -t 1 -c 1 198.51.100.2 atf_check -s exit:2 -o ignore jexec client2 ping -t 1 -c 1 198.51.100.2
if [[ $portalias ]]; then if [ ${portalias} = "true" ]; then
firewall_config nat $firewall \ firewall_config nat $firewall \
"ipfw" \ "ipfw" \
"ipfw -q nat 123 config if ${epair_host_nat}b unreg_cgn port_alias 2000-2999" \ "ipfw -q nat 123 config if ${epair_host_nat}b unreg_cgn port_range 2000-2999" \
"ipfw -q nat 456 config if ${epair_host_nat}b unreg_cgn port_alias 3000-3999" \ "ipfw -q nat 456 config if ${epair_host_nat}b unreg_cgn port_range 3000-3999" \
"ipfw -q add 1000 nat 123 all from any to 198.51.100.2 2000-2999 in via ${epair_host_nat}b" \ "ipfw -q add 1000 nat 123 all from any to 198.51.100.0/24 2000-2999 in via ${epair_host_nat}b" \
"ipfw -q add 2000 nat 456 all from any to 198.51.100.2 3000-3999 in via ${epair_host_nat}b" \ "ipfw -q add 2000 nat 456 all from any to 198.51.100.0/24 3000-3999 in via ${epair_host_nat}b" \
"ipfw -q add 3000 nat 123 all from 100.64.0.2 to any out via ${epair_host_nat}b" \ "ipfw -q add 3000 nat 123 all from 100.64.0.2 to any out via ${epair_host_nat}b" \
"ipfw -q add 4000 nat 456 all from 100.64.1.2 to any out via ${epair_host_nat}b" "ipfw -q add 4000 nat 456 all from 100.64.1.2 to any out via ${epair_host_nat}b"
else else
@@ -194,16 +196,16 @@ common_cgn() {
"ipfw -q add 1000 nat 123 all from any to any" "ipfw -q add 1000 nat 123 all from any to any"
fi fi
# ping is successful now
atf_check -s exit:0 -o ignore jexec client1 ping -t 1 -c 1 198.51.100.2
atf_check -s exit:0 -o ignore jexec client2 ping -t 1 -c 1 198.51.100.2
# if portalias, test a tcp server/client with nc # if portalias, test a tcp server/client with nc
if [[ $portalias ]]; then if [ ${portalias} = "true" ]; then
for inst in 1 2; do for inst in 1 2; do
daemon nc -p 198.51.100.2 7 daemon nc -l 198.51.100.2 7
atf_check -s exit:0 -o ignore jexec client$inst sh -c "echo | nc -N 198.51.100.2 7" atf_check -s exit:0 -o ignore -e ignore jexec client$inst nc -z 198.51.100.2 7
done done
else
# ping is successful now
atf_check -s exit:0 -o ignore jexec client1 ping -t 1 -c 1 198.51.100.2
atf_check -s exit:0 -o ignore jexec client2 ping -t 1 -c 1 198.51.100.2
fi fi
} }