DNS flag day 2020, software should reflect the minimum EDNS 1232 bytes. Added iface_wan and iface_lan to control internal DNS assignemnts and to control what is local service ACL. Interface wild cards are not explicitly set so that they can be customized in extended conf. Signed-off-by: Eric Luehrsen <ericluehrsen@gmail.com>
217 lines
5.5 KiB
Bash
217 lines
5.5 KiB
Bash
#!/bin/sh
|
|
##############################################################################
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 2 as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# Copyright (C) 2016 Eric Luehrsen
|
|
#
|
|
##############################################################################
|
|
#
|
|
# These are iptools that might be useful in a larger package, if provided
|
|
# elsewhere for common use. One example that many may find useful is turning
|
|
# flexible IPV6 colon dividers into PTR. Otherwise these are incomplete and
|
|
# would need robustness improvements for more generic applications.
|
|
#
|
|
##############################################################################
|
|
|
|
# while useful (sh)ellcheck is pedantic and noisy
|
|
# shellcheck disable=1091,2002,2004,2034,2039,2086,2094,2140,2154,2155
|
|
|
|
UB_IPTOOLS_BLANK=
|
|
|
|
##############################################################################
|
|
|
|
domain_ptr_ip6() {
|
|
# Get the nibble rounded /CIDR ...ip6.arpa.
|
|
echo "$1" | awk -F: \
|
|
'BEGIN { OFS = "" ; }
|
|
{ CIDR = $0 ;
|
|
sub(/.*\//,"",CIDR) ;
|
|
CIDR = (CIDR / 4) ;
|
|
sub(/\/[0-9]+/,"",$0) ;
|
|
ct_stop = 9 - NF ;
|
|
for(i=1; i<=NF; i++) {
|
|
if(length($i) == 0) {
|
|
for(j=1; j<=ct_stop; j++) { $i = ($i "0000") ; } }
|
|
else { $i = substr(("0000" $i), length($i)+5-4) ; } } ;
|
|
y = $0 ;
|
|
ct_start = length(y) - 32 + CIDR ;
|
|
for(i=ct_start; i>0; i--) { x = (x substr(y,i,1)) ; } ;
|
|
gsub(/./,"&\.",x) ;
|
|
x = (x "ip6.arpa") ;
|
|
print x }'
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
host_ptr_ip6() {
|
|
# Get complete host ...ip6.arpa.
|
|
echo "$1" | awk -F: \
|
|
'BEGIN { OFS = "" ; }
|
|
{ sub(/\/[0-9]+/,"",$0) ;
|
|
ct_stop = 9 - NF ;
|
|
for(i=1; i<=NF; i++) {
|
|
if(length($i) == 0) {
|
|
for(j=1; j<=ct_stop; j++) { $i = ($i "0000") ; } }
|
|
else { $i = substr(("0000" $i), length($i)+5-4) ; } } ;
|
|
y = $0 ;
|
|
ct_start = length(y);
|
|
for(i=ct_start; i>0; i--) { x = (x substr(y,i,1)) ; } ;
|
|
sub(/[0-9]+\//,"",x) ;
|
|
gsub(/./,"&\.",x) ;
|
|
x = (x "ip6.arpa") ;
|
|
print x }'
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
domain_ptr_ip4() {
|
|
# Get the byte rounded /CIDR ...in-addr.arpa.
|
|
echo "$1" | awk \
|
|
'{ CIDR = $0 ;
|
|
sub(/.*\//,"",CIDR) ;
|
|
CIDR = (CIDR / 8) ;
|
|
dtxt = $0 ;
|
|
sub(/\/.*/,"",dtxt) ;
|
|
split(dtxt, dtxt, ".") ;
|
|
for(i=1; i<=CIDR; i++) { x = (dtxt[i] "." x) ; }
|
|
x = (x "in-addr.arpa") ;
|
|
print x }'
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
host_ptr_ip4() {
|
|
# Get complete host ...in-addr.arpa.
|
|
echo "$1" | awk -F. \
|
|
'{ x = ( $4"."$3"."$2"."$1".in-addr.arpa" ) ;
|
|
sub(/\/[0-9]+/,"",x) ;
|
|
print x }'
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
valid_subnet6() {
|
|
case "$1" in
|
|
# GA
|
|
[1-9][0-9a-f][0-9a-f][0-9a-f]":"*) echo "ok" ;;
|
|
# ULA
|
|
f[cd][0-9a-f][0-9a-f]":"*) echo "ok" ;;
|
|
# fe80::, ::1, and such
|
|
*) echo "not" ;;
|
|
esac
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
valid_subnet4() {
|
|
case "$1" in
|
|
# Link, Local, and Such
|
|
169"."254"."*) echo "not" ;;
|
|
127"."*) echo "not" ;;
|
|
0"."*) echo "not" ;;
|
|
255"."*) echo "not" ;;
|
|
# Other Normal
|
|
25[0-4]"."[0-9]*) echo "ok" ;;
|
|
2[0-4][0-9]"."[0-9]*) echo "ok" ;;
|
|
1[0-9][0-9]"."[0-9]*) echo "ok" ;;
|
|
[0-9][0-9]"."[0-9]*) echo "ok" ;;
|
|
[0-9]"."[0-9]*) echo "ok" ;;
|
|
# Not Right
|
|
*) echo "not";;
|
|
esac
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
valid_subnet_any() {
|
|
local subnet=$1
|
|
local validip4=$( valid_subnet4 $subnet )
|
|
local validip6=$( valid_subnet6 $subnet )
|
|
|
|
|
|
if [ "$validip4" = "ok" ] || [ "$validip6" = "ok" ] ; then
|
|
echo "ok"
|
|
else
|
|
echo "not"
|
|
fi
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
private_subnet() {
|
|
case "$1" in
|
|
10"."*) echo "ok" ;;
|
|
172"."1[6-9]"."*) echo "ok" ;;
|
|
172"."2[0-9]"."*) echo "ok" ;;
|
|
172"."3[0-1]"."*) echo "ok" ;;
|
|
192"."168"."*) echo "ok" ;;
|
|
f[cd][0-9a-f][0-9a-f]":"*) echo "ok" ;;
|
|
*) echo "not" ;;
|
|
esac
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
local_subnet() {
|
|
# local subnet 2nd place is limited to one digit to improve the filter
|
|
case "$1" in
|
|
127"."[0-9]"."[0-9]*) echo "ok" ;;
|
|
::1) echo "ok" ;;
|
|
*) echo "not" ;;
|
|
esac
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
domain_ptr_any() {
|
|
local subnet=$1
|
|
local arpa validip4 validip6
|
|
|
|
validip4=$( valid_subnet4 $subnet )
|
|
validip6=$( valid_subnet6 $subnet )
|
|
|
|
|
|
if [ "$validip4" = "ok" ] ; then
|
|
arpa=$( domain_ptr_ip4 "$subnet" )
|
|
elif [ "$validip6" = "ok" ] ; then
|
|
arpa=$( domain_ptr_ip6 "$subnet" )
|
|
fi
|
|
|
|
|
|
if [ -n "$arpa" ] ; then
|
|
echo $arpa
|
|
fi
|
|
}
|
|
|
|
##############################################################################
|
|
|
|
host_ptr_any() {
|
|
local subnet=$1
|
|
local arpa validip4 validip6
|
|
|
|
validip4=$( valid_subnet4 $subnet )
|
|
validip6=$( valid_subnet6 $subnet )
|
|
|
|
|
|
if [ "$validip4" = "ok" ] ; then
|
|
arpa=$( host_ptr_ip4 "$subnet" )
|
|
elif [ "$validip6" = "ok" ] ; then
|
|
arpa=$( host_ptr_ip6 "$subnet" )
|
|
fi
|
|
|
|
|
|
if [ -n "$arpa" ] ; then
|
|
echo $arpa
|
|
fi
|
|
}
|
|
|
|
##############################################################################
|
|
|