firewall.sh: some improvements

This commit is contained in:
teldra 2020-06-22 18:42:59 +02:00
parent e43d0242cb
commit a6a4861488
1 changed files with 89 additions and 140 deletions

View File

@ -12,12 +12,17 @@ if [[ ! -f "${CFG}" ]]; then
done done
echo "alldevs=(${devs[*]})" > "${CFG}" echo "alldevs=(${devs[*]})" > "${CFG}"
echo "ignore=()" >> "${CFG}" echo "ignore=()" >> "${CFG}"
echo "hometcp=(ssh)" >> "${CFG}" echo "home_tcp=(ssh)" >> "${CFG}"
echo "homeudp=()" >> "${CFG}" echo "home_udp=()" >> "${CFG}"
echo "outtcp=(ssh)" >> "${CFG}" echo "out_tcp=(ssh)" >> "${CFG}"
echo "outudp=()" >> "${CFG}" echo "out_udp=()" >> "${CFG}"
echo "vpntcp=(ssh)" >> "${CFG}" echo "vpn_tcp=(ssh)" >> "${CFG}"
echo "vpnudp=()" >> "${CFG}" echo "vpn_udp=()" >> "${CFG}"
echo "" >> "${CFG}"
echo "PROFILE=" >> "${CFG}"
echo "" >> "${CFG}"
echo "NM=" >> "${CFG}"
echo "" >> "${CFG}"
echo "VPN_UNRESTRICTED=1" >> "${CFG}" echo "VPN_UNRESTRICTED=1" >> "${CFG}"
echo "" >> "${CFG}" echo "" >> "${CFG}"
echo "nft="/usr/sbin/nft"" >> "${CFG}" echo "nft="/usr/sbin/nft"" >> "${CFG}"
@ -59,14 +64,14 @@ source <(sed -n '/^#functions/,$p' $(dirname "$0")/$(basename "$0"))
# echo "${ports[$index]}" # echo "${ports[$index]}"
#done #done
while getopts Aia:r:l:fDhnL option while getopts Aia:r:p:fDhnL option
do do
case "${option}" in case "${option}" in
A) AUTOMATIC=1;; A) AUTOMATIC=1;;
i) INIT=1;; i) INIT=1;;
a) ADEVICE+=("${OPTARG}");; a) ADEVICE+=("${OPTARG}");;
r) RDEVICE+=("${OPTARG}");; r) RDEVICE+=("${OPTARG}");;
l) LOCATION="${OPTARG}";; p) PROFILE="${OPTARG}";;
f) FLUSH=1;; f) FLUSH=1;;
D) DEBUG=1;; D) DEBUG=1;;
h) HELP=1;; h) HELP=1;;
@ -81,7 +86,7 @@ help
flush flush
check_deviceinput check_deviceinput
get_devices get_devices
location profile
init init
add_device add_device
remove_device remove_device
@ -112,34 +117,34 @@ flush() {
fi fi
} }
location() { profile() {
[[ $INIT == "1" ]] && return 0 [[ $INIT == "1" ]] && return 0
if [[ -z $LOCATION ]]; then if [[ -z $PROFILE ]]; then
if [[ -e /run/home ]]; then if [[ -e /run/home ]]; then
HOME=$(cat /run/home) HOME=$(cat /run/home)
if [[ "${HOME}" == "home" ]]; then if [[ "${HOME}" == "home" ]]; then
LOCATION=home PROFILE=home
elif [[ "${HOME}" == "out" ]]; then elif [[ "${HOME}" == "out" ]]; then
LOCATION=out PROFILE=out
fi fi
else else
LOCATION=out PROFILE=out
fi fi
fi fi
case $LOCATION in case $PROFILE in
h|home) h|home)
portstcp=("${hometcp[@]}") portstcp=("${home_tcp[@]}")
portsudp=("${homeudp[@]}");; portsudp=("${home_udp[@]}");;
o|out) o|out)
portstcp=("${outtcp[@]}") portstcp=("${out_tcp[@]}")
portsudp=("${outudp[@]}") ;; portsudp=("${out_udp[@]}") ;;
esac esac
debug location: "${LOCATION[@]}" debug profile: "${PROFILE[@]}"
debug tcp ports: "${portstcp[@]}" debug tcp ports: "${portstcp[@]}"
debug udp ports: "${portsudp[@]}" debug udp ports: "${portsudp[@]}"
if [[ ! "$VPN_UNRESTRICTED" == "1" ]]; then if [[ ! "$VPN_UNRESTRICTED" == "1" ]]; then
debug vpntcp ports: "${vpntcp[@]}" debug vpntcp ports: "${vpn_tcp[@]}"
debug vpnudp ports: "${vpnudp[@]}" debug vpnudp ports: "${vpn_udp[@]}"
elif [[ "$VPN_UNRESTRICTED" == "1" ]]; then elif [[ "$VPN_UNRESTRICTED" == "1" ]]; then
debug "vpn ports unrestricted" debug "vpn ports unrestricted"
fi fi
@ -246,7 +251,7 @@ get_devices() {
function init() { function init() {
if ! $nft -a list ruleset | grep -q "table inet filter"; then if ! $nft -a list ruleset | grep -q "table inet filter"; then
debug "Initialise rule: nft add table inet filter" debug "Initialise ruletable: nft add table inet filter"
$nft add table inet filter $nft add table inet filter
$nft add chain inet filter INPUT \{ type filter hook input priority 0 \; policy drop \; \} $nft add chain inet filter INPUT \{ type filter hook input priority 0 \; policy drop \; \}
$nft add rule inet filter INPUT ct state invalid drop comment \"early drop of invalid packets\" $nft add rule inet filter INPUT ct state invalid drop comment \"early drop of invalid packets\"
@ -315,126 +320,70 @@ getports() {
done done
if [[ ! ${dev} == *"vpn"* ]]; then if [[ ! ${dev} == *"vpn"* ]]; then
#TCP ptcp=("${portstcp[@]}")
unchangedtcp=() pudp=("${portsudp[@]}")
for item1 in "${portstcp[@]}"; do elif [[ ${dev} == *"vpn"* ]]; then
for item2 in "${istportstcp[@]}"; do ptcp=("${vpn_tcp[@]}")
if [[ $item1 == "$item2" ]]; then pudp=("${vpn_udp[@]}")
unchangedtcp+=("$item1") fi
break #TCP
fi unchangedtcp=()
done for item1 in "${ptcp[@]}"; do
done for item2 in "${istportstcp[@]}"; do
turnofftcp=() if [[ $item1 == "$item2" ]]; then
for item1 in "${istportstcp[@]}"; do unchangedtcp+=("$item1")
for item2 in "${portstcp[@]}"; do break
[[ $item1 == "$item2" ]] && continue 2 fi
done done
turnofftcp+=("$item1") done
done turnofftcp=()
if [[ ! $2 == "off" ]]; then for item1 in "${istportstcp[@]}"; do
turnontcp=() for item2 in "${ptcp[@]}"; do
for item1 in "${portstcp[@]}"; do [[ $item1 == "$item2" ]] && continue 2
for item2 in "${istportstcp[@]}"; do done
[[ $item1 == "$item2" ]] && continue 2 turnofftcp+=("$item1")
done done
turnontcp+=("$item1") if [[ ! $2 == "off" ]]; then
done turnontcp=()
fi for item1 in "${ptcp[@]}"; do
for item2 in "${istportstcp[@]}"; do
[[ $item1 == "$item2" ]] && continue 2
done
turnontcp+=("$item1")
done
fi
#UDP
unchangedudp=()
for item1 in "${pudp[@]}"; do
for item2 in "${istportsudp[@]}"; do
if [[ $item1 == "$item2" ]]; then
unchangedudp+=("$item1")
break
fi
done
done
#UDP turnoffudp=()
unchangedudp=() for item1 in "${istportsudp[@]}"; do
for item1 in "${portsudp[@]}"; do for item2 in "${pudp[@]}"; do
for item2 in "${istportsudp[@]}"; do [[ $item1 == "$item2" ]] && continue 2
if [[ $item1 == "$item2" ]]; then done
unchangedudp+=("$item1")
break
fi
done
done
turnoffudp=() # If we reached here, nothing matched.
for item1 in "${istportsudp[@]}"; do turnoffudp+=("$item1")
for item2 in "${portsudp[@]}"; do done
[[ $item1 == "$item2" ]] && continue 2 if [[ ! $2 == "off" ]]; then
done turnonudp=()
for item1 in "${pudp[@]}"; do
for item2 in "${istportsudp[@]}"; do
[[ $item1 == "$item2" ]] && continue 2
done
# If we reached here, nothing matched. # If we reached here, nothing matched.
turnoffudp+=("$item1") turnonudp+=("$item1")
done done
if [[ ! $2 == "off" ]]; then if [[ ${dev} == *"vpn"* ]]; then
turnonudp=()
for item1 in "${portsudp[@]}"; do
for item2 in "${istportsudp[@]}"; do
[[ $item1 == "$item2" ]] && continue 2
done
# If we reached here, nothing matched.
turnonudp+=("$item1")
done
fi
elif [[ ${dev} == *"vpn"* ]]; then
#TCP VPN
unchangedtcp=()
for item1 in "${vpntcp[@]}"; do
for item2 in "${istportstcp[@]}"; do
if [[ $item1 == "$item2" ]]; then
unchangedtcp+=("$item1")
break
fi
done
done
turnofftcp=()
for item1 in "${istportstcp[@]}"; do
for item2 in "${vpntcp[@]}"; do
[[ $item1 == "$item2" ]] && continue 2
done
turnofftcp+=("$item1")
done
if [[ ! $2 == "off" ]]; then
vpnturnontcp=()
for item1 in "${vpntcp[@]}"; do
for item2 in "${istportstcp[@]}"; do
[[ $item1 == "$item2" ]] && continue 2
done
turnontcp+=("$item1")
done
fi
#UDP
unchangedudp=()
for item1 in "${vpnudp[@]}"; do
for item2 in "${istportsudp[@]}"; do
if [[ $item1 == "$item2" ]]; then
unchangedudp+=("$item1")
break
fi
done
done
turnoffudp=()
for item1 in "${istportsudp[@]}"; do
for item2 in "${vpnudp[@]}"; do
[[ $item1 == "$item2" ]] && continue 2
done
# If we reached here, nothing matched.
turnoffudp+=("$item1")
done
if [[ ! $2 == "off" ]]; then
turnonudp=()
for item1 in "${vpnudp[@]}"; do
for item2 in "${istportsudp[@]}"; do
[[ $item1 == "$item2" ]] && continue 2
done
# If we reached here, nothing matched.
turnonudp+=("$item1")
done
if [[ ! "$VPN_UNRESTRICTED" == "1" ]]; then if [[ ! "$VPN_UNRESTRICTED" == "1" ]]; then
if $nft -a list ruleset | grep -q "${dev}: accept all"; then if $nft -a list ruleset | grep -q "${dev}: accept all"; then
debug "${dev}: remove rule \"${dev}: accept all\"" debug "${dev}: remove rule \"${dev}: accept all\""
@ -520,7 +469,7 @@ set_rules() {
help() { help() {
[[ ! $HELP == "1" ]] && return 0 [[ ! $HELP == "1" ]] && return 0
cat <<EOF cat <<EOF
usage: $(basename "$0") [-A] [-i] [-a <device>] [-r <device>] [-l <location>] usage: $(basename "$0") [-A] [-i] [-a <device>] [-r <device>] [-l <profile>]
[-f] [-D] [-h] [-f] [-D] [-h]
-A Automagic find connected devices -A Automagic find connected devices