Hi Hank,
I enjoyed your sessions at CLMel, to repay the favour here's a more compact for-loop for your get_nat method (hopefully this box won't trash the formatting!):

NAT_REGEX = "(?P\D*?)\s(?P([0-9]{1,3}.){3}[0-9]{1,3}):(?P[0-9]*?)\s" \
"(?P([0-9]{1,3}.){3}[0-9]{1,3}):(?P[0-9]*?)\s" \
"(?P([0-9]{1,3}.){3}[0-9]{1,3}):(?P[0-9]*?)\s" \
"(?P([0-9]{1,3}.){3}[0-9]{1,3}):(?P[0-9]*?)$"

raw_nat = RAW_NAT.split("\n")
nats = []
for raw in raw_nat:
matches = re.match(NAT_REGEX, raw)
if matches:
nats.append(matches.groupdict())

# eof

cheers,
Seb.