On 15 Nov 2016, at 13:07, Gomes, Rich wrote:
Just a quick question since I have not found a way in my Googling.
We are replacing some of our internal Exchange relays with postfix.
Currently we have other internal postfix relays which utilize a client
access file to allow relaying.
The file contains all single IPs, no ranges.
The exchange servers have some groups of consecutive IPs on their
allow list, some cover 5 or 6 IPs, others 100.
Is there a way to provide the same list .i.e.
192.168.0.2-12 OK
without:
Listing them all individually
i.e.
192.168.0.2 OK
192.168.0.3 OK
Etc...
Or
Allowing an entire subnet
192.168.0.0/24 OK
If not possible, that's fine, I will just list them by hand, just
hoping there was a native way to do it.
No, there's not.
However, I happened to have an old Perl script laying around for other
purposes that took about 2 minutes to turn into something that takes a
loosely-formatted text file with one IP spec (single, range, or CIDR)
per line and spits out a Postfix CIDR table with the aggregate of all
specs in a minimal set of CIDR blocks, each with OK as the action. On
many systems you'd need to install the Net::CIDR::Lite Perl module for
this to work. If your input is a clean list of single IPs and ranges,
one per line, you can remove lines 17-25 (which are an artifact of my
original script's loose input.)
#!/usr/bin/env perl
# Input file is text with lines of the general form:
#
# [IP|IP range|CIDR][whitespace+comment]
#
# Ranges are de-spaced, then anything from the first whitespace to EOL
is discarded
#
# Output is a Postfix CIDR table with lines of form:
#
# <CIDR><TAB>OK
use Net::CIDR::Lite;
$list=Net::CIDR::Lite->new ;
while (<>)
{
# de-space ranges
s/ ?- ?/-/;
# toss out comments after the IP spec & whitespace
s/\s+.*//;
# oops, this was an indented line with no IP spec, move along
next if ( ! m/./ );
# canonicalize shorthanded ranges
if ( m/^\d+\.\d+.\d+\.\d+-\d+$/) {
s/^(\d+)\.(\d+).(\d+)\.(\d+)-(\d+)$/\1.\2.\3.\4-\1.\2.\3.\5/;
}
$list->add_any($_);
}
$list->clean();
@cidrs=$list->list;
foreach $cidr (@cidrs) { print "$cidr\tOK\n"; }