Script-Time: Excel2cli
CLI-Commands aus Kunden-Tabellen generieren lassen.
Immer wieder bekomme ich Aufträge für Firewalls als Excel-Tabelle zugeschickt. Da diese Arbeit zunehmens langweiliger wird, habe ich begonnen diese Tätigkeiten zu automatisieren. Möglicherweise stellt der Kunde bald eine JSON-API zur Verfügung, sodass die Informationen nicht aus der Tabelle in das Script kopiert werden müssen, sondern direkt abgerufen werden können.
Dieses Script, das ursprünglich ein Shellscript war, lieferte ursprünglich Konfigurationen für Barracuda-Firewalls. Da es aber so gut funktioniert hat, habe ich Fortinet und Checkpoint ebenfalls hinzugefügt. Es ist noch nicht ganz vollständig. Routen und Interfaces werden bereits angelegt. Regeln sind auf Fortigate leicht zu realisieren.
Sobald die mgmt_cli von Checkpoint stabil läuft, kann auch hier der Anteil automatisiert werden, der sich sonst nur in der Windows-Applikation klicken lässt.
Die gleiche Art der Verarbeitung funktioniert besonders gut bei Cisco Komponenten. Auch hier können die Felder leicht an entsprechender Stelle in der Konfig platziert werden, die das Script erstellt.
Vielleich ist die Bash-Variante unten für viele besser verständlich.
Manche Firmen gestatten die Erstellung von Software nur durch ihre eigene Software-Abteilung. Doch die dabei entstehenden Lösungen sind meist viel zu umständlich. Hier geht es nur um Folgendes:
In der Exceltabelle befindet sich in jeder Zeile z.B. eine Cluster-Interface-Beschreibung. So weise ich also jeder Variablen das entsprechende Feld aus jeder einzelnen Zeile zu:

Bei der Ausgabe, die man später in die CLI kopieren kann, wird auch berücksichtigt, ob es sich um IPv4 oder IPv6 handelt:

Doch hier nun die Idee:
#!/bin/bash
Help(){
echo "
#################################################################################
### ####
### wf_tool ####
### ==================================================================== ####
### Version : 0.9 ####
### Date : 07.04.2017 ####
### Modified : 22.02.2021 ####
### Author : Michael Meister ####
### -------------------------------------------------------------------- ####
### Purpose : ####
### This tool provides help for fw-configuration ####
### ####
#################################################################################
"
exit 0
}
[ "$1" = "-h" -o "$1" = "-help" -o "$1" = "--help" ] && Help
####################################################################################################
####################################################################################################
# Export Rules, Interfaces and Routing to Excel, switch to read/write in Excel and paste the
# full lines below:
#
RULES='
0 FALSCH 1 Add fgt-rbm-01 rz-ber-1, rz-ber-2 10.232.17.11/24,10.232.17.12/24 keines kein 10.232.92.2/25-10.232.92.3/25 RZ-TEST BER NTP udp/123 Ja CLOCK/NTP für TFDPS_DB
0 FALSCH 2 Add fgt-rbm-01 rz-ber-1, rz-ber-2 10.226.17.11/24,10.226.17.12/24 keines kein 10.232.92.2/25-10.232.92.3/25 RZ-TEST BER NTP udp/123 Ja CLOCK/NTP für TFDPS_DP
'
INTERFACES='
0 FALSCH 1 port4 fgt-rbm-01 10.237.27.144/29 10.237.27.145 1337 (RZ_BER_MUC) RZ-BER-MUC-Transit
0 FALSCH 1 eth3.s01 ckp-rmm-17 10.237.27.152/29 10.237.27.153 1337 (RZ_BER_MUC) RZ-BER-MUC-Transit
'
ROUTING='
0 FALSCH 1 port4.1337 fgt-rbm-01 10.10.27.150 10.224.0.0/16 StdWo0113-Berlin113
0 FALSCH 2 port4.1337 fgt-rbm-01 10.10.27.150 10.231.83.0/24 StdWo0022-Berlin022
0 FALSCH 3 eth2.1337 ckp-rmm-17 10.10.25.30 172.17.201.128/25 RZ_MUC
'
####################################################################################################
####################################################################################################
# functions() here:
cdr2mask(){
# Number of args to shift, 255..255, first non-255 byte, zeroes
set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0
[ $1 -gt 1 ] && shift $1 || shift
echo ${1-0}.${2-0}.${3-0}.${4-0}
}
mask2cdr ()
{
# Assumes there's no "255." after a non-255 byte in the mask
local x=${1##*255.}
set -- 0^^^128^192^224^240^248^252^254^ $(( (${#1} - ${#x})*2 )) ${x%%.*}
x=${1%%$3*}
echo $(( $2 + (${#x}/4) ))
}
cprules(){
# _____ _____ _____ _ _ _ ______ _____
# / ____| __ \ | __ \| | | | | | ____|/ ____|
# | | | |__) | | |__) | | | | | | |__ | (___
# | | | ___/ | _ /| | | | | | __| \___ \
# | |____| | | | \ \| |__| | |____| |____ ____) |
# \_____|_| |_| \_\\____/|______|______|_____/
# Rules first as they can be done without OPSPLAN
#
for MASCHINE in ${MASCHINES}
do
echo
echo
echo "####################################################################################################"
echo "####################################################################################################"
figlet -w 140 -f doom Rules
figlet -w 140 -f doom ${MASCHINE}
echo "$RULES" |
grep "${MASCHINE}" |
sed -e 's/\t/\|/g' |
while read line
do
RULENR=$(echo $line | cut -d '|' -f3)
FIREWALL=$(echo $line | cut -d '|' -f5)
TODO=$(echo $line | cut -d '|' -f4)
SOURCEIP=$(echo $line | cut -d '|' -f7 | sed -e 's/[;,]/ /g')
SNAT=$(echo $line | cut -d '|' -f8)
SRCHOSTNAMES=$(echo $line | cut -d '|' -f6 | sed -e 's/ *,/,/g;s/, */,/g;s/ /_/g;s/[;,]/ /g')
DIRECTION="--->" #$(echo $line | cut -d '|' -f X)
DESTIP=$(echo $line | cut -d '|' -f11 | sed -e 's/[;,]/ /g')
DNAT=$(echo $line | cut -d '|' -f12)
DESTHOSTNAMES=$(echo $line | cut -d '|' -f13 | sed -e 's/ *,/,/g;s/, */,/g;s/ /_/g;s/[;,]/ /g')
PROTONAME=$(echo $line | cut -d '|' -f14 | sed -e 's/[;,]/ /g')
PORTS=$(echo $line | cut -d '|' -f15 | sed -e 's/[;,]/ /g')
PAT=$(echo $line | cut -d '|' -f17)
OPS=$(echo $line | cut -d '|' -f16)
SECTION=$(echo $line | cut -d '|' -f19)
RULENAME=$(echo $line | cut -d '|' -f18)
COMMENT="${AUFTRAG} $( (echo $OPS | grep -qi "ja") && echo OPS-Relevant) $(echo $line | cut -d '|' -f21 | sed -e 's/[;]/ /g;s/ */ /g')"
# if [[ ${RULENR} > 0 ]]
# then
declare -a SOURCEIPS=($SOURCEIP)
declare -a SOURCENAMES=($SRCHOSTNAMES)
declare -a DESTIPS=($DESTIP)
declare -a DESTNAMES=($DESTHOSTNAMES)
if (echo ${TODO} | grep -q "Add")
then
echo
echo "---------------------------------------------------------------"
echo "Neue Regel erstellen"
echo "Regelnummer im Auftrag : ${RULENR}"
echo "==========================="
echo
echo "Firewall : ${FIREWALL}"
echo "Section : ${SECTION}"
echo "Rulename : ${RULENAME}"
echo "Kommentar : ${COMMENT}"
echo "Sources : "
echo
[[ $(echo "$SOURCEIP" | wc -w) == $(echo "$SRCHOSTNAMES" | wc -w) ]] || echo Fehler im Auftrag
for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
do
echo -e " $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
done
echo
[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
echo "Direction ${DIRECTION}"
echo "Protokoll : ${PROTONAME}"
echo "Ports : ${PORTS}"
[ "${PAT}" ] && echo "PAT : ${PAT}"
echo "Direction ${DIRECTION}"
echo
echo "Destinations : "
echo
[[ $(echo "$DESTIPS" | wc -w) == $(echo "$DESTNAMES" | wc -w) ]] || echo Fehler im Auftrag
for (( i=0; i<${#DESTIPS[@]}; i++ ))
do echo -e " $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
done
echo
[ "${DNAT}" ] && echo "DNAT : ${DNAT}" && echo
echo "OPS Relevant : ${OPS}"
echo "Kommentar : ${COMMENT}"
fi
if (echo ${TODO} | grep -q "Delete")
then
echo
echo "---------------------------------------------------------------"
echo -e "[1;91mRegel LÖSCHEN!!!\033[0m"
echo "Regelnummer im Auftrag : ${RULENR}"
echo "==========================="
echo
echo "Firewall : ${FIREWALL}"
echo "Section : ${SECTION}"
echo "Rulename : ${RULENAME}"
echo "Kommentar : ${COMMENT}"
echo "Sources : "
echo
[[ $(echo "$SOURCEIPS" | wc -w) == $(echo "$SOURCENAMES" | wc -w) ]] || echo Fehler im Auftrag
for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
do echo -e " $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
done
echo
[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
echo "Direction ${DIRECTION}"
echo "Protokoll : ${PROTONAME}"
echo "Ports : ${PORTS}"
[ "${PAT}" ] && echo "PAT : ${PAT}"
echo "Direction ${DIRECTION}"
echo
echo "Destinations : "
echo
[[ $(echo "$DESTIPS" | wc -w) == $(echo "$DESTNAMES" | wc -w) ]] || echo Fehler im Auftrag
for (( i=0; i<${#DESTIPS[@]}; i++ ))
do echo -e " $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
done
echo
[ "${DNAT}" ] && echo "DNAT : ${DNAT}" && echo
echo "OPS Relevant : ${OPS}"
echo "Kommentar : ${COMMENT}"
fi
if (echo ${TODO} | grep -q "Change")
then
echo
echo "---------------------------------------------------------------"
echo "Regel ändern"
echo "Regelnummer im Auftrag : ${RULENR}"
echo "==========================="
echo
echo "Firewall : ${FIREWALL}"
echo "Section : ${SECTION}"
echo "Rulename : ${RULENAME}"
echo "Kommentar : ${COMMENT}"
echo "Sources : "
echo
for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
do echo -e " $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
done
echo
[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
echo "Direction ${DIRECTION}"
echo "Protokoll : ${PROTONAME}"
echo "Ports : ${PORTS}"
[ "${PAT}" ] && echo "PAT : ${PAT}"
echo "Direction ${DIRECTION}"
echo
echo "Destinations : "
echo
for (( i=0; i<${#DESTIPS[@]}; i++ ))
do echo -e " $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
done
echo
[ "${DNAT}" ] && echo "DNAT : ${DNAT}" && echo
echo "OPS Relevant : ${OPS}"
echo -e "Kommentar : \033[1;31m${COMMENT}\033[0m"
fi
# fi
done | sed -e 's/ \//\//g;s/\/\//\//g'
done
}
fortirules(){
# ______ ____ _____ _______ _____ _____ _ _ _ ______ _____
# | ____/ __ \| __ \__ __|_ _| | __ \| | | | | | ____|/ ____|
# | |__ | | | | |__) | | | | | | |__) | | | | | | |__ | (___
# | __|| | | | _ / | | | | | _ /| | | | | | __| \___ \
# | | | |__| | | \ \ | | _| |_ | | \ \| |__| | |____| |____ ____) |
# |_| \____/|_| \_\ |_| |_____| |_| \_\\____/|______|______|_____/
# Rules first as they can be done without OPSPLAN
#
for MASCHINE in ${MASCHINES}
do
echo
echo
echo "####################################################################################################"
echo "####################################################################################################"
figlet -w 140 -f doom Rules
figlet -w 140 -f doom ${MASCHINE}
echo "$RULES" |
grep "${MASCHINE}" |
sed -e 's/\t/\|/g' |
while read line
do
RULENR=$(echo $line | cut -d '|' -f3)
FIREWALL=$(echo $line | cut -d '|' -f5)
TODO=$(echo $line | cut -d '|' -f4)
SOURCEIP=$(echo $line | cut -d '|' -f7 | sed -e 's/[;,]/ /g')
SNAT=$(echo $line | cut -d '|' -f8)
SRCHOSTNAMES=$(echo $line | cut -d '|' -f6 | sed -e 's/ *,/,/g;s/, */,/g;s/ /_/g;s/[;,]/ /g')
DIRECTION="--->" #$(echo $line | cut -d '|' -f X)
DESTIP=$(echo $line | cut -d '|' -f11 | sed -e 's/[;,]/ /g')
DNAT=$(echo $line | cut -d '|' -f12)
DESTHOSTNAMES=$(echo $line | cut -d '|' -f13 | sed -e 's/ *,/,/g;s/, */,/g;s/ /_/g;s/[;,]/ /g')
PROTONAME=$(echo $line | cut -d '|' -f14 | sed -e 's/[;,]/ /g')
PORTS=$(echo $line | cut -d '|' -f15 | sed -e 's/[;,]/ /g')
PAT=$(echo $line | cut -d '|' -f17)
OPS=$(echo $line | cut -d '|' -f16)
SECTION=$(echo $line | cut -d '|' -f19)
RULENAME=$(echo $line | cut -d '|' -f18)
COMMENT="${AUFTRAG} $( (echo $OPS | grep -qi "ja") && echo OPS-Relevant) $(echo $line | cut -d '|' -f21 | sed -e 's/[;,/]/ /g;s/ */ /g')"
# if [[ ${RULENR} > 0 ]]
# then
declare -a SOURCEIPS=($SOURCEIP)
declare -a SOURCENAMES=($SRCHOSTNAMES)
declare -a DESTIPS=($DESTIP)
declare -a DESTNAMES=($DESTHOSTNAMES)
if (echo ${TODO} | grep -q "Add")
then
echo
echo "---------------------------------------------------------------"
echo "Neue Regel erstellen"
echo "Regelnummer im Auftrag : ${RULENR}"
echo "==========================="
echo
echo "Firewall : ${FIREWALL}"
echo "Section : ${SECTION}"
echo "Rulename : ${RULENAME}"
echo
# ip=1.1.1.128/25
# (echo $ip | grep -q "/") && [[ "$( echo $ip | sed -e 's/\/.*//')" == "$(ipcalc $ip | sed -ne '/Network:/{s/Network: *//;s/\/.*//p}')" ]] && echo ist ein Netz || echo ist ein Host
echo edit
echo set name \"${RULENAME}\"
echo set srcintf \"any\"
echo set dstintf \"any\"
echo set action accept
echo -n set srcaddr
for (( i=0; i<${#SOURCENAMES[@]}; i++ ))
do
echo -n " "\"${SOURCENAMES[$i]}\"
done
echo
echo -n set dstaddr
for (( i=0; i<${#DESTNAMES[@]}; i++ ))
do
echo -n " "\"${DESTNAMES[$i]}\"
done
echo
echo set schedule \"always\"
echo set service \"$(echo $PORTS | sed -e 's/\//_/g;s/ /\" \"/g' )\"
echo set utm-status enable
echo set inspection-mode proxy
echo set av-profile \"DS-AV\"
echo set ips-sensor \"DS-IPS\"
echo set logtraffic-start enable
echo set comments \"${COMMENT}\"
echo next
fi
if (echo ${TODO} | grep -q "Delete")
then
echo
echo "---------------------------------------------------------------"
echo -e "[1;91mRegel LÖSCHEN!!!\033[0m"
echo "Regelnummer im Auftrag : ${RULENR}"
echo "==========================="
echo
echo "Firewall : ${FIREWALL}"
echo "Section : ${SECTION}"
echo "Rulename : ${RULENAME}"
echo "Sources : "
echo
[[ $(echo "$SOURCEIPS" | wc -w) == $(echo "$SOURCENAMES" | wc -w) ]] || echo Fehler im Auftrag
for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
do echo -e " $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
done
echo
[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
echo "Direction ${DIRECTION}"
echo "Protokoll : ${PROTONAME}"
echo "Ports : ${PORTS}"
[ "${PAT}" ] && echo "PAT : ${PAT}"
echo "Direction ${DIRECTION}"
echo
echo "Destinations : "
echo
[[ $(echo "$DESTIPS" | wc -w) == $(echo "$DESTNAMES" | wc -w) ]] || echo Fehler im Auftrag
for (( i=0; i<${#DESTIPS[@]}; i++ ))
do echo -e " $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
done
echo
[ "${DNAT}" ] && echo "DNAT : ${DNAT}" && echo
echo "OPS Relevant : ${OPS}"
echo "Kommentar : ${COMMENT}"
fi
if (echo ${TODO} | grep -q "Change")
then
echo
echo "---------------------------------------------------------------"
echo "Regel ändern"
echo "Regelnummer im Auftrag : ${RULENR}"
echo "==========================="
echo
echo "Firewall : ${FIREWALL}"
echo "Section : ${SECTION}"
echo "Rulename : ${RULENAME}"
echo "Sources : "
echo
for (( i=0; i<${#SOURCEIPS[@]}; i++ ))
do echo -e " $(($i+1)). \\t ${SOURCEIPS[$i]} \\t ${SOURCENAMES[$i]}"
done
echo
[ "${SNAT}" ] && echo "Explicit Src : ${SNAT}" && echo
echo "Direction ${DIRECTION}"
echo "Protokoll : ${PROTONAME}"
echo "Ports : ${PORTS}"
[ "${PAT}" ] && echo "PAT : ${PAT}"
echo "Direction ${DIRECTION}"
echo
echo "Destinations : "
echo
for (( i=0; i<${#DESTIPS[@]}; i++ ))
do echo -e " $(($i+1)). \\t ${DESTIPS[$i]} \\t ${DESTNAMES[$i]}"
done
echo
[ "${DNAT}" ] && echo "DNAT : ${DNAT}" && echo
echo "OPS Relevant : ${OPS}"
echo -e "Kommentar : \033[1;31m${COMMENT}\033[0m"
fi
# fi
done | sed -e 's/ \//\//g;s/\/\//\//g'
done
}
cpinterfaces(){
# _____ _____ _____ _ _ _______ ______ _____ ______ _____ ______ _____
# / ____| __ \ |_ _| \ | |__ __| ____| __ \| ____/\ / ____| ____|/ ____|
# | | | |__) | | | | \| | | | | |__ | |__) | |__ / \ | | | |__ | (___
# | | | ___/ | | | . ` | | | | __| | _ /| __/ /\ \| | | __| \___ \
# | |____| | _| |_| |\ | | | | |____| | \ \| | / ____ \ |____| |____ ____) |
# \_____|_| |_____|_| \_| |_| |______|_| \_\_|/_/ \_\_____|______|_____/
#
for MASCHINE in $MASCHINES
do
echo
echo '############################################################################'
echo '############################################################################'
figlet -w 140 -f doom Interfaces
figlet -w 140 -f doom ${MASCHINE}1
echo
echo -e "$INTERFACES" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
do
firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g;s/\..*//')
vlan=$(echo $line | cut -d ';' -f10 | sed -e 's/ (.*//g;s/ //g;s/^0*//')
clusterip=$(echo $line | cut -d ';' -f9 | sed -e 's/ //g')
cp1=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
cp2=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g')
cdr=$(echo $line | cut -d ';' -f8 | sed -e 's/.*\///;s/ //g')
# mask=$(cdr2mask $cdr)
kommentar=$(echo $line | cut -d ';' -f10 | sed -e 's/.*(//g;s/).*//g')
if (echo $line | grep -qi "löschen")
then
echo "# ${firewall}2 - $interface.$vlan löschen:"
echo delete interface $interface.$vlan ipv4-address $cp1 mask-length $cdr
else
echo '#'
echo "# ${firewall}2 - $interface.$vlan anlegen:"
echo add interface $interface vlan $vlan
echo set interface $interface.$vlan comments \"$kommentar\"
( echo "$cp1" | grep -q "." ) && echo set interface $interface.$vlan ipv4-address $cp1 mask-length $cdr
( echo "$cp1" | grep -q ":" ) && echo set interface $interface.$vlan ipv6-address $cp1 mask-length $cdr
echo set interface $interface.$vlan mtu 1500
echo set interface $interface.$vlan state on
fi
done | sed -e 's/ \//\//;s/\/\//\//'
echo
echo '############################################################################'
echo '############################################################################'
figlet -w 140 -f doom Interfaces
figlet -w 140 -f doom ${MASCHINE}2
echo
echo -e "$INTERFACES" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
do
firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g;s/\..*//')
vlan=$(echo $line | cut -d ';' -f10 | sed -e 's/ (.*//g;s/ //g')
clusterip=$(echo $line | cut -d ';' -f9 | sed -e 's/ //g')
cp1=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
cp2=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g')
cdr=$(echo $line | cut -d ';' -f8 | sed -e 's/.*\///;s/ //g')
# mask=$(cdr2mask $cdr)
kommentar=$(echo $line | cut -d ';' -f10 | sed -e 's/.*(//g;s/).*//g')
if (echo $line | grep -qi "löschen")
then
echo "# ${firewall}2 - $interface.$vlan löschen:"
echo delete interface $interface.$vlan ipv4-address $cp2 mask-length $cdr
else
echo '#'
echo "# ${firewall}2 - $interface.$vlan anlegen:"
echo add interface $interface vlan $vlan
echo set interface $interface.$vlan comments \"$kommentar\"
( echo "$cp2" | grep -q "." ) && echo set interface $interface.$vlan ipv4-address $cp2 mask-length $cdr
( echo "$cp2" | grep -q ":" ) && echo set interface $interface.$vlan ipv6-address $cp2 mask-length $cdr
echo set interface $interface.$vlan mtu 1500
echo set interface $interface.$vlan state on
fi
done | sed -e 's/ \//\//;s/\/\//\//'
done
}
fortiinterfaces(){
# ______ ____ _____ _______ _____ _____ _ _ _______ ______ _____ ______ _____ ______ _____
# | ____/ __ \| __ \__ __|_ _| |_ _| \ | |__ __| ____| __ \| ____/\ / ____| ____|/ ____|
# | |__ | | | | |__) | | | | | | | | \| | | | | |__ | |__) | |__ / \ | | | |__ | (___
# | __|| | | | _ / | | | | | | | . ` | | | | __| | _ /| __/ /\ \| | | __| \___ \
# | | | |__| | | \ \ | | _| |_ _| |_| |\ | | | | |____| | \ \| | / ____ \ |____| |____ ____) |
# |_| \____/|_| \_\ |_| |_____| |_____|_| \_| |_| |______|_| \_\_|/_/ \_\_____|______|_____/
#
for MASCHINE in $MASCHINES
do
echo
echo '############################################################################'
echo '############################################################################'
figlet -w 140 -f doom Interfaces
figlet -w 140 -f doom ${MASCHINE}
echo
echo -e "$INTERFACES" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
do
firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g;s/\..*//')
vlan=$(echo $line | cut -d ';' -f10 | sed -e 's/ (.*//g;s/ //g;s/^0*//')
clusterip=$(echo $line | cut -d ';' -f9 | sed -e 's/ //g')
cp1=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
cp2=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g')
cdr=$(echo $line | cut -d ';' -f8 | sed -e 's/.*\///;s/ //g')
# mask=$(cdr2mask $cdr)
kommentar=$(echo $line | cut -d ';' -f10 | sed -e 's/.*(//g;s/).*//g')
if ( echo $firewall | grep -Eiq '.*-.*-f' )
then
if (echo $line | grep -qi "löschen")
then
echo "# ${firewall} - $interface.$vlan löschen:"
echo delete interface $interface.$vlan ipv4-address $cp1 mask-length $cdr
else
echo '#'
echo "# ${firewall} - $interface.$vlan anlegen:"
echo config system interface
echo edit \"$interface.$vlan\"
echo set vdom \"root\"
echo set description \"$kommentar\"
echo set device-identification enable
echo set role lan
echo set ip $clusterip/$cdr
echo set allowaccess ping
echo set interface \"$interface\"
echo set vlanid $vlan
echo next
echo end
fi
fi
done | sed -e 's/ \//\//;s/\/\//\//'
done
}
cprouting(){
# _____ _____ _____ ____ _ _ _______ _____ _ _ _____
# / ____| __ \ | __ \ / __ \| | | |__ __|_ _| \ | |/ ____|
# | | | |__) | | |__) | | | | | | | | | | | | \| | | __
# | | | ___/ | _ /| | | | | | | | | | | | . ` | | |_ |
# | |____| | | | \ \| |__| | |__| | | | _| |_| |\ | |__| |
# \_____|_| |_| \_\\____/ \____/ |_| |_____|_| \_|\_____|
#
for MASCHINE in $MASCHINES
do
echo "####################################################################################################"
echo "####################################################################################################"
figlet -w 140 -f doom ROUTING
figlet -w 140 -f doom ${MASCHINE}1 u. ${MASCHINE}2
echo -e "$ROUTING" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
do
firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
netz=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/\/.*//')
maske=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/.*\///')
gateway=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g')
kommentar=$(echo $line | cut -d ';' -f8)
if [[ $netz ]]
then
if (echo $line | grep -qi "löschen")
then
echo "# $firewall - ${netz}/${maske}"
echo set static-route ${netz}/${maske} off
else
echo "# $firewall - ${netz}/${maske}"
echo set static-route ${netz}/${maske} comment \"${kommentar}\"
echo set static-route ${netz}/${maske} nexthop gateway address ${gateway} on
fi
fi
done | sed -e 's/ \//\//;s/\/\//\//'
done
}
fortirouting(){
# ______ ____ _____ _______ _____ _____ ____ _ _ _______ _____ _ _ _____
# | ____/ __ \| __ \__ __|_ _| | __ \ / __ \| | | |__ __|_ _| \ | |/ ____|
# | |__ | | | | |__) | | | | | | |__) | | | | | | | | | | | | \| | | __
# | __|| | | | _ / | | | | | _ /| | | | | | | | | | | | . ` | | |_ |
# | | | |__| | | \ \ | | _| |_ | | \ \| |__| | |__| | | | _| |_| |\ | |__| |
# |_| \____/|_| \_\ |_| |_____| |_| \_\\____/ \____/ |_| |_____|_| \_|\_____|
#
for MASCHINE in $MASCHINES
do
echo "####################################################################################################"
echo "####################################################################################################"
figlet -w 140 -f doom ROUTING
figlet -w 140 -f doom ${MASCHINE}
echo -e "$ROUTING" |
grep "${MASCHINE}" |
sed -e 's/\t/;/g' |
while read line
do
firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
netz=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/\/.*//')
maske=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/.*\///')
gateway=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g')
kommentar=$(echo $line | cut -d ';' -f8)
if (echo $line | grep -qi "löschen")
then
echo "# $firewall - ${netz}/${maske}"
echo keine Ahnung, wie man ${netz}/${maske} über das cli löscht
else
echo "# $firewall - ${netz}/${maske}"
echo config router static
echo edit
echo set dst ${netz}/${maske}
echo set gateway $gateway
echo set device \"$interface\"
echo set comment \"$kommentar\"
echo next
echo end
fi
done | sed -e 's/ \//\//;s/\/\//\//'
done
}
antispoofing(){
# _ _ _______ _____ _____ _____ ____ ____ ______ _____ _ _ _____
# /\ | \ | |__ __|_ _|/ ____| __ \ / __ \ / __ \| ____|_ _| \ | |/ ____|
# / \ | \| | | | | | | (___ | |__) | | | | | | | |__ | | | \| | | __
# / /\ \ | . ` | | | | | \___ \| ___/| | | | | | | __| | | | . ` | | |_ |
# / ____ \| |\ | | | _| |_ ____) | | | |__| | |__| | | _| |_| |\ | |__| |
# /_/ \_\_| \_| |_| |_____|_____/|_| \____/ \____/|_| |_____|_| \_|\_____|
#
echo
echo '############################################################################'
echo '#'
echo "# In der Netzwerktopologie Antispoofing anlegen:"
for MASCHINE in ${ROUTINGFW}
do
echo -e "$INTERFACES" |
grep "$MASCHINE" |
sed -e 's/\t/;/g' |
while read line
do
firewall=$(echo $line | cut -d ';' -f5 | sed -e 's/ //g')
interface=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g;s/\..*//')
vlan=$(echo $line | cut -d ';' -f10 | sed -e 's/ (.*//g;s/ //g')
clusterip=$(echo $line | cut -d ';' -f9 | sed -e 's/ //g')
cp1=$(echo $line | cut -d ';' -f6 | sed -e 's/ //g')
cp2=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g')
cdr=$(echo $line | cut -d ';' -f8 | sed -e 's/.*\///;s/ //g')
# mask=$(cdr2mask $cdr)
kommentar=$(echo $line | cut -d ';' -f10 | sed -e 's/.*(//g;s/).*//g')
if ( echo $firewall | grep -Eiq '.*-.*-c' )
then
figlet -w 140 -f doom ${MASCHINE}
if (echo $line | grep -qi "löschen")
then
echo "# ${firewall}1 - $interface.$vlan löschen:"
echo "# delete interface $interface.$vlan ipv4-address $clusterip mask-length $cdr"
else
echo '#'
echo "# Auf ${firewall} [ add Interface ]"
echo "# Object-Name: $interface.$vlan"
echo "# Type: Cluster"
echo "# IPv4: $clusterip/$cdr"
echo "# Member1: $cp1/$cdr"
echo "# Member2: $cp2/$cdr"
echo "# Antispoofing: as-ng.${firewall//fw-/}-$interface.$vlan"
echo "# * fw-n.$(echo $firewall | sed -e 's/fw-//;s/-.*//')-$(echo $kommentar | sed 's/.*/\L&/;s/ /_/g') - $(ipcalc $clusterip/$cdr | sed -ne '/Network/{s/\/.*//;s/.* //p}')/$(ipcalc $clusterip/$cdr | sed -ne '/Netmask/{s/ =.*//;s/.* //p}')"
echo -e "$ROUTING" |
sed -e 's/\t/;/g' |
while read line
do
netz=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/\/.*//')
maske=$(echo $line | cut -d ';' -f7 | sed -e 's/ //g;s/.*\///')
cpif=$(echo $line | cut -d ';' -f4 | sed -e 's/ //g')
netname=$(echo $line | cut -d ';' -f8 | sed 's/.*/\L&/;s/ /_/g')
if [[ "$cpif" == "$interface.$vlan" ]]
then
echo "# * $netname - ${netz}/$(cdr2mask ${maske})"
fi
done | sed -e 's/ \//\//;s/\/\//\//'
fi
fi
done | sed -e 's/ \//\//;s/\/\//\//'
done
echo '#'
echo '############################################################################'
echo
}
# _____ _______ _____ _______ _ _ ______ _____ ______
# / ____|__ __|/\ | __ \__ __| | | | | ____| __ \| ____|
# | (___ | | / \ | |__) | | | | |__| | |__ | |__) | |__
# \___ \ | | / /\ \ | _ / | | | __ | __| | _ /| __|
# ____) | | |/ ____ \| | \ \ | | | | | | |____| | \ \| |____
# |_____/ |_/_/ \_\_| \_\ |_| |_| |_|______|_| \_\______|
#
####################################################################################################
####################################################################################################
AUFTRAG=$1
INTERFACEFW=$(echo "$INTERFACES" | sed -e 's/\t/\|/g' | cut -d '|' -f5 | grep -vEi "^$" | sort -u)
ROUTINGFW=$(echo "$ROUTING" | sed -e 's/\t/\|/g' | cut -d '|' -f5 | grep -vEi "^$" | sort -u)
RULEFW=$(echo "$RULES" | sed -e 's/\t/\|/g' | cut -d '|' -f5 | grep -vEi "^$" | sort -u)
####################################################################################################
####################################################################################################
# _____ _ _ ______ _____ _ _______ ____ _____ _ _ _______
# / ____| | | | ____/ ____| |/ / __ \ / __ \_ _| \ | |__ __|
# | | | |__| | |__ | | | ' /| |__) | | | || | | \| | | |
# | | | __ | __|| | | < | ___/| | | || | | . ` | | |
# | |____| | | | |___| |____| . \| | | |__| || |_| |\ | | |
# \_____|_| |_|______\_____|_|\_\_| \____/_____|_| \_| |_|
#
MASCHINES=$( echo "$RULEFW" | grep -Ei 'ckp-.*-.*' )
[ "${MASCHINES}" ] && cprules
MASCHINES=$( echo "$INTERFACEFW" | grep -Ei 'ckp-.*-.*' )
[ "${MASCHINES}" ] && cpinterfaces
MASCHINES=$( echo "$ROUTINGFW" | grep -Ei 'ckp-.*-.*' )
[ "${MASCHINES}" ] && cprouting
MASCHINES=$( echo "$ROUTINGFW" | grep -Ei 'ckp-.*-.*' )
[ "${MASCHINES}" ] && antispoofing
####################################################################################################
# ______ ____ _____ _______ _____ _ _ ______ _______
# | ____/ __ \| __ \__ __|_ _| \ | | ____|__ __|
# | |__ | | | | |__) | | | | | | \| | |__ | |
# | __|| | | | _ / | | | | | . ` | __| | |
# | | | |__| | | \ \ | | _| |_| |\ | |____ | |
# |_| \____/|_| \_\ |_| |_____|_| \_|______| |_|
#
MASCHINES=$( echo "$RULEFW" | grep -Ei 'fgt-.*-.*' )
[ "${MASCHINES}" ] && fortirules
MASCHINES=$( echo "$INTERFACEFW" | grep -Ei 'fgt-.*-.*' )
[ "${MASCHINES}" ] && fortiinterfaces
MASCHINES=$( echo "$ROUTINGFW" | grep -Ei 'fgt-.*-.*' )
[ "${MASCHINES}" ] && fortirouting
Ausgabe
Lässt man das Script laufen, erzeugt es eine Ausgabe, wie z.B. diese:
set interface eth16 link-speed 1000M/full
set interface eth16 auto-negotiation on
set interface eth16 mtu 1500
set interface eth16 state on
add interface eth16 vlan 11
set interface eth16.11 comments "RZ_BER_MUC"
set interface eth16.11 mtu 1500
set interface eth16.11 ipv4-address 10.21.17.202 mask-length 29
set interface eth16.11 state on
Man kann das nun leicht in die Konsole der entsprechenden Maschine kopieren, und muss sich nicht mühsam durch langsame Webfrontends quälen.
Fazit
Wenn man die entsprechende Erfahrung mitbringt, kann man sich viele umständliche Abläufe ersparen. Es setzt jedoch voraus, dass man in seiner Umgebung einen Linux-Rechner zur Verfügung hat, auf dem es gestattet ist, Pakete nachzuinstallieren. Sollte der Arbeitgeber einem dies nicht gestatten, muss man wohl oder übel entsprechend langsam arbeiten. Aber: Man wird ja auch nach Zeit bezahlt.