adenardo has asked for the wisdom of the Perl Monks concerning the following question:

I am attempting to query a firewall that has rules containing subnets, and IP addresses. sometimes a rule governs one IP address (i.e. 63.161.169.137/32). sometimes a rule governs a subnet (i.e. 63.161.169.0/24). I have gotten to the point where every rule is a unique element in an array (@blocklist). how can I create a new array which is a subset of @blocklist, containing only rules relevant to a subnet, or IP address of interest? to clarify, sometimes the query will be an IP address, which will have to match itself, and any subnets it is a part of. sometimes the query will be a subnet, which will have to match subnets it is a part of, and any rules pertaining to any member IP addresses. thanks in advance :-) ad3

Replies are listed 'Best First'.
Re: IP Address/Subnet matching
by NetWallah (Canon) on Jun 30, 2006 at 16:40 UTC
    Convert elements of @blocklist,and the "one IP address", into NetAddr::IP objects.
    Those objects support the method:
    $me->contains($other) #Returns true when $me completely contains $other. False is returned + otherwise # and undef is returned if $me and $other are of different versions. #Note that $me and $other must be NetAddr::IP objects.
    You can then use grep to filter the list of objects, limiting them to thost where the condition is TRUE.

         "For every complex problem, there is a simple answer ... and it is wrong." --H.L. Mencken

Re: IP Address/Subnet matching
by starbolin (Hermit) on Jun 30, 2006 at 22:24 UTC

    Reading Don't Use Regular Expressions To Parse IP Addresses! first:

    1) Convert the dotted-quad forms to integers.
    2) Select the appropriate netmask.
    3) Logical AND with the netmask to generate a subnet.
    4) Exclusive -or two subnets to compare them.

    If you think of the subnets as bitmasks, comparing them with host addresses is trivial.


    s//----->\t/;$~="JAPH";s//\r<$~~/;{s|~$~-|-~$~|||s |-$~~|$~~-|||s,<$~~,<~$~,,s,~$~>,$~~>,, $|=1,select$,,$,,$,,1e-1;print;redo}