Hello Darren,
thanks for the quick source port randomization patch!
While trying to apply it to m0n0wall today, two things struck me as
odd with the following code:
! port = ipf_random() % (ntohs(np->in_pmax) -
! ntohs(np->in_pmin));
1. np->in_pmin isn't added to the generated random number, which means
that the result will be
between 0 and (in_pmax - in_pmin - 1), rather than between in_pmin
and in_pmax (inclusive).
2. No htons() is done on the result, and thus the resulting port
numbers don't turn out as expected.
A quick test with a map rule port range of 6000:7000 resulted in port
numbers like the following (as seen on the network):
26114, 65282, 48898, 12033, 51459, 32258, ...
all of which, when byte-swapped, are < 1000.
The fix seems to be as follows:
port = htons((ipf_random() %
(ntohs(np->in_pmax) - ntohs(np->in_pmin) + 1))
+ ntohs(np->in_pmin));
Regards,
Manuel