diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..79b5594 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**/.DS_Store diff --git a/Dokumentation/Pdf/Dokumentation.pdf b/Dokumentation/Pdf/Dokumentation.pdf new file mode 100644 index 0000000..a23230a Binary files /dev/null and b/Dokumentation/Pdf/Dokumentation.pdf differ diff --git a/PFDialogControl/pfdialogcontrol-1.0.3-ZIP/pfdialogcontrol-1.0.3.tar.gz b/PFDialogControl/pfdialogcontrol-1.0.3-ZIP/pfdialogcontrol-1.0.3.tar.gz new file mode 100644 index 0000000..cdcf37f Binary files /dev/null and b/PFDialogControl/pfdialogcontrol-1.0.3-ZIP/pfdialogcontrol-1.0.3.tar.gz differ diff --git a/PFDialogControl/pfdialogcontrol-1.0.3/dnsmasq.skeleton b/PFDialogControl/pfdialogcontrol-1.0.3/dnsmasq.skeleton new file mode 100755 index 0000000..b1d83eb --- /dev/null +++ b/PFDialogControl/pfdialogcontrol-1.0.3/dnsmasq.skeleton @@ -0,0 +1,6 @@ +### Skeleton "dnsmasq" modifiziert durch PFDialogControl ### + +domain-needed +bogus-priv +expand-hosts + diff --git a/PFDialogControl/pfdialogcontrol-1.0.3/install b/PFDialogControl/pfdialogcontrol-1.0.3/install new file mode 100755 index 0000000..fb05589 --- /dev/null +++ b/PFDialogControl/pfdialogcontrol-1.0.3/install @@ -0,0 +1,135 @@ +#!/bin/sh + +####################################################################### +# Title : PFDialogControl Installer +# Author : Bogdanovic Theodor {t.bogdanovic@hotmail.com} +# Date : 2015-05-05 +# Requires : dialog +# Category : Installationsskript +####################################################################### +# Description +# +# Dieses Skript dient der Installation der PFDialogControl Skript- +# sammlung. +####################################################################### + +clear + +######################################################################## + +# -> Diese Function zeigt eine Statusleiste waehrend der Istallation +pfdcontrol_start() { + +# -> Installation des FreeBSD Paketmanagers (pkg), welcher per Default nich installiert ist. Zusaetzliche Pakete installieren +clear +pkg +pkg install -y dnsmasq pftop nano gsed +# <- # + +### Erstellen der notwendigen Verzeichnisse ########################### + +{ +echo 4; echo "XXX"; echo "mkdir -p /usr/local/etc/pfdcontrol/block"; echo "XXX"; sleep 0.2 +mkdir -p /usr/local/etc/pfdcontrol/block +echo 8; echo "XXX"; echo "mkdir -p /usr/local/etc/pfdcontrol/portfor"; echo "XXX"; sleep 0.2 +mkdir -p /usr/local/etc/pfdcontrol/portfor +echo 16; echo "XXX"; echo "mkdir -p /usr/local/etc/pfdcontrol/skel"; echo "XXX"; sleep 0.2 +mkdir -p /usr/local/etc/pfdcontrol/skel + +### Erstellen der notwendigen Dateien und aendern der Rechte########### + +echo 20; echo "XXX"; echo "cp ./pfdctl /usr/bin/pfdctl && chmod 700 /usr/bin/pfdctl"; echo "XXX"; sleep 0.2 +cp ./pfdctl /usr/bin/pfdctl && chmod 700 /usr/bin/pfdctl +echo 24; echo "XXX"; echo "cp ./libpfdctl /usr/lib/libpfdctl && chmod 660 /usr/lib/libpfdctl"; echo "XXX"; sleep 0.2 +cp ./libpfdctl /usr/lib/libpfdctl && chmod 660 /usr/lib/libpfdctl +echo 28; echo "XXX"; echo "cp ./libnmcalc16 /usr/lib/libnmcalc16 && chmod 660 /usr/lib/libnmcalc16"; echo "XXX"; sleep 0.2 +cp ./libnmcalc16 /usr/lib/libnmcalc16 && chmod 660 /usr/lib/libnmcalc16 +echo 32; echo "XXX"; echo "cp ./libchkin12 /usr/lib/libchkin12 && chmod 660 /usr/lib/libchkin12"; echo "XXX"; sleep 0.2 +cp ./libchkin12 /usr/lib/libchkin12 && chmod 660 /usr/lib/libchkin12 +echo 36; echo "XXX"; echo "cp ./pfdchelp /usr/bin/pfdchelp && chmod 660 /usr/bin/pfdchelp"; echo "XXX"; sleep 0.2 +cp ./pfdchelp /usr/bin/pfdchelp && chmod 770 /usr/bin/pfdchelp +echo 40; echo "XXX"; echo "cp ./dnsmasq.skeleton /usr/local/etc/pfdcontrol/skel"; echo "XXX"; sleep 0.2 +cp ./dnsmasq.skeleton /usr/local/etc/pfdcontrol/skel && chmod 660 /usr/local/etc/pfdcontrol/skel/dnsmasq.skeleton +echo 44; echo "XXX"; echo "cp ./pf.skeleton /usr/local/etc/pfdcontrol/skel"; echo "XXX"; sleep 0.2 +cp ./pf.skeleton /usr/local/etc/pfdcontrol/skel && chmod 660 /usr/local/etc/pfdcontrol/skel/pf.skeleton +echo 48; echo "XXX"; echo "cp ./motd /etc/motd"; echo "XXX"; sleep 0.2 +cp ./motd /etc/motd && chmod 660 /etc/motd + +### Erstellen der notwendigen Config Files und aendern der Rechte###### + +echo 52; echo "XXX"; echo "touch /usr/local/etc/pfdcontrol/dns.addr"; echo "XXX"; sleep 0.2 +touch /usr/local/etc/pfdcontrol/dns.addr +echo 56; echo "XXX"; echo "touch /usr/local/etc/pfdcontrol/dnsmasq_run.status"; echo "XXX"; sleep 0.2 +touch /usr/local/etc/pfdcontrol/dnsmasq_run.status +echo 60; echo "XXX"; echo "touch /usr/local/etc/pfdcontrol/domainname"; echo "XXX"; sleep 0.2 +touch /usr/local/etc/pfdcontrol/domainname +echo 64; echo "XXX"; echo "touch /usr/local/etc/pfdcontrol/gateway.addr"; echo "XXX"; sleep 0.2 +touch /usr/local/etc/pfdcontrol/gateway.addr +echo 68; echo "XXX"; echo "touch /usr/local/etc/pfdcontrol/identified_ifaces"; echo "XXX"; sleep 0.2 +touch /usr/local/etc/pfdcontrol/identified_ifaces +echo 72; echo "XXX"; echo "touch /usr/local/etc/pfdcontrol/inside_iface"; echo "XXX"; sleep 0.2 +touch /usr/local/etc/pfdcontrol/inside_iface +echo 76; echo "XXX"; echo "touch /usr/local/etc/pfdcontrol/nat_run.status"; echo "XXX"; sleep 0.2 +touch /usr/local/etc/pfdcontrol/nat_run.status +echo 80; echo "XXX"; echo "touch /usr/local/etc/pfdcontrol/outside_iface"; echo "XXX"; sleep 0.2 +touch /usr/local/etc/pfdcontrol/outside_iface +echo 84; echo "XXX"; echo "echo "0" > /usr/local/etc/pfdcontrol/counter_pw"; echo "XXX"; sleep 0.2 +echo "0" > /usr/local/etc/pfdcontrol/counter_pw +echo 90; echo "XXX"; echo "echo "0" > /usr/local/etc/pfdcontrol/counter_block"; echo "XXX"; sleep 0.2 +echo "0" > /usr/local/etc/pfdcontrol/counter_block +echo 100; echo "XXX"; echo "Installation komplett"; echo "XXX"; sleep 2 +} | dialog --backtitle "PFDialogControl" --title "Installiere PFDialogControl" --gauge "" 6 85 0 +# <- # +### Suchen und dekonfigurieren von bestehenden Interfaces ############# + +sed "s/ifconfig_/#--DECONFIG--durch--PFDialogControl/g" /etc/rc.conf > /etc/rc.conf.pfdctl && rm /etc/rc.conf && mv /etc/rc.conf.pfdctl /etc/rc.conf + +### Aktivieren der Dienste PF Firewall und Gateway Modus ############## + +echo "pf_enable=\"YES\"" >> /etc/rc.conf +echo "gateway_enable=\"YES\"" >> /etc/rc.conf + +### Abschlussmeldung und initialisieren des Reboots ################### + +dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" \ + --msgbox "PFDialogControl wurde erfolgreich installiert, das System wird nun neu gestartet." 10 50 + +reboot + +} + +# -> Startsequenz des Installers mit Check auf Minimum 2 Interfaces +chk_iface() { +if [ $(ifconfig -a | awk '/.[0-9]:/ {print $1}' | cut -d ":" -f1 | grep -v -i inet | grep -v -i ether | grep -v -i lo0 | wc -l | cut -d " " -f 7-9) = 1 ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" \ + --yesno "Der Installer hat ermittelt, dass Ihr System nur ein Interface besitzen. PFDialogControl benoetigt aber mindestens zwei. Sie können die Installation aber dennoch \ +durchfuehren wenn Sie wollen.\n\nMoechten Sie fortfahren?" 10 80 + + case $? in + 0) pfdcontrol_start + ;; + 1) clear; exit + ;; + esac +else + pfdcontrol_start +fi + +} +# <- # + +# -> Startsequenz des Installers +dialog --backtitle "PFDialogControl" \ + --title "Installation" \ + --yesno "Willkommen zur Installation von PFDialogControl. Dieser Installer wird alle Ihre Interfaces waehrend der Installation dekonfigurieren, fuehren Sie ihn deshalb \ +lokal auf dem Geraet aus. Bitte bestaetigen Sie allfaellige Fragen in der Kommandozeile mit \"y\" --> ENTER.\n\nMoechten Sie PFDialogControl installieren?" 10 80 + + case $? in + 0) chk_iface + ;; + 1) clear; exit + ;; + esac +# <- # diff --git a/PFDialogControl/pfdialogcontrol-1.0.3/libchkin12 b/PFDialogControl/pfdialogcontrol-1.0.3/libchkin12 new file mode 100755 index 0000000..8f08820 --- /dev/null +++ b/PFDialogControl/pfdialogcontrol-1.0.3/libchkin12 @@ -0,0 +1,113 @@ +#!/bin/sh + +####################################################################### +# Title : PFDialogControl --> Check Interface Name (libchkin12) +# Author : Bogdanovic Theodor {t.bogdanovic@hotmail.com} +# Date : 2015-05-05 +# Requires : dialog, libpfdctl +# Category : Dialog Menu zur Steurung von PF Firewall +####################################################################### +# Description +# +# Diese Bibliothek dient dem dem Ueberpruefen des eingegebenen +# Interface Namens auf reale Existenz +####################################################################### + +chk_iface_name() { + +nics=`cat /usr/local/etc/pfdcontrol/identified_ifaces` +interface_name=`cat $iface_name` + +[ $interface_name = $(echo $nics | cut -d " " -f1) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f2) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f3) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f4) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f5) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f6) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f7) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f8) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f9) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f10) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +[ $interface_name = $(echo $nics | cut -d " " -f11) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi +[ $interface_name = $(echo $nics | cut -d " " -f12) ] + if [ $? = 0 ]; then + dialog --backtitle "PFDialogControl" \ + --title "Betstaetigt" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann als existent verifiziert werden." 10 35 + echo "OK" > /usr/local/etc/pfdcontrol/tmp_iface_chk + fi + +iface_OK_file=/usr/local/etc/pfdcontrol/tmp_iface_chk +if [ ! -e $iface_OK_file ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Der von Ihnen eingegebene Interface Name --> $interface_name kann NICHT als existent verifiziert werden.\n\nBitte ueberpruefen Sie Ihre Eingabe" 12 44 + rm /usr/local/etc/pfdcontrol/tmp_iface_chk 2> /dev/null + menu_network && exit +fi + rm /usr/local/etc/pfdcontrol/tmp_iface_chk 2> /dev/null +} + diff --git a/PFDialogControl/pfdialogcontrol-1.0.3/libnmcalc16 b/PFDialogControl/pfdialogcontrol-1.0.3/libnmcalc16 new file mode 100755 index 0000000..2a3719c --- /dev/null +++ b/PFDialogControl/pfdialogcontrol-1.0.3/libnmcalc16 @@ -0,0 +1,51 @@ +#!/bin/sh + +####################################################################### +# Title : PFDialogControl --> Netmask Calculate max Suffix 16 (libnmcalc16) +# Author : Bogdanovic Theodor {t.bogdanovic@hotmail.com} +# Date : 2015-05-05 +# Requires : dialog, libpfdctl +# Category : Dialog Menu zur Steurung von PF Firewall +####################################################################### +# Description +# +# Diese Bibliothek dient dem Berechnen der Subnetzmaske bis max. 16 +# Bit (255.255.0.0 - 255.255.255.254). +####################################################################### + + +calc_netmask() { +if [ $netmask = "255.255.0.0" ]; then + echo "16" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.128.0" ]; then + echo "17" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.192.0" ]; then + echo "18" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.224.0" ]; then + echo "19" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.240.0" ]; then + echo "20" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.248.0" ]; then + echo "21" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.252.0" ]; then + echo "22" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.254.0" ]; then + echo "23" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.255.0" ]; then + echo "24" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.255.128" ]; then + echo "25" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.255.192" ]; then + echo "26" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.255.224" ]; then + echo "27" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.255.240" ]; then + echo "28" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.255.248" ]; then + echo "29" > /usr/local/etc/pfdcontrol/suffix.$run +elif [ $netmask = "255.255.255.252" ]; then + echo "30" > /usr/local/etc/pfdcontrol/suffix.$run +else + echo "24" > /usr/local/etc/pfdcontrol/suffix.$run +fi +} diff --git a/PFDialogControl/pfdialogcontrol-1.0.3/libpfdctl b/PFDialogControl/pfdialogcontrol-1.0.3/libpfdctl new file mode 100644 index 0000000..fdd8362 --- /dev/null +++ b/PFDialogControl/pfdialogcontrol-1.0.3/libpfdctl @@ -0,0 +1,1865 @@ +#!/bin/sh + +####################################################################### +# Title : PFDialogControl --> Primary Control Libery (libpfdctl) +# Author : Bogdanovic Theodor {t.bogdanovic@hotmail.com} +# Date : 2015-05-05 +# Requires : dialog +# Category : Dialog Menu zur Steurung von PF Firewall +####################################################################### +# Description + +####################################################################### + +###### Include ######################################################## +. /usr/lib/libnmcalc16 +. /usr/lib/libchkin12 + +###### Global Function ################################################ + +# -> Diese Funktion prueft auf Aenderungen an den primaeren Interfaces und passt sie an. +# Dabei setzt, oder aendert sie den Flag "NOTACT" BZW. "ACT" +chk_iface_status_on() { + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_inside` + str_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + str_outside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_outside` + + str_inside_ip_cut=`cat /usr/local/etc/pfdcontrol/ip.$str_inside | cut -d "." -f1-3` + + inside_ip=/usr/local/etc/pfdcontrol/ip.$str_inside + inside=/usr/local/etc/pfdcontrol/inside_iface + + outside_ip=/usr/local/etc/pfdcontrol/ip.$str_outside + outside=/usr/local/etc/pfdcontrol/outside_iface + + netmask_in=`cat /usr/local/etc/pfdcontrol/suffix.$str_inside` + netmask_out=`cat /usr/local/etc/pfdcontrol/suffix.$str_outside` + +cat /etc/pf.conf | grep '#---NOTACT---' +if [ $? != "1" ]; then + gsed "s/#---NOTACT---/#---ACT--- \ + \nin_iface=$str_inside #var1 \ + \nin_iface_ip='$str_inside_ip_cut.0\/$netmask_in' #var2 \ + \nout_iface=$str_outside #var3 \ + \nout_iface_ip=$(ifconfig $str_outside | grep inet | cut -d " " -f2) #var4 /g" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf +fi + + sysctl net.inet.ip.forwarding=1 + service pf onestop + service pf onestart + echo "" >> /etc/pf.conf + pfctl -f /etc/pf.conf +} +# <- # + +####### Sektion Interface Einstellungen ################################################################################################################ +######################################################################################################################################################## +# Allgemeiner Kommentar: Die dialog meldungen werden nicht kommentiert, ihr Zweck ist in den diversen -msgbox, -yesno, -infobox etc. gut ersichlich + +# -> Diese Funktion erzeugt die statische Statusleiste. In aehnlicher Form kommt diese Funktion in den Sektionen DHCP/DNS und Firewall zu Einsatz. +# Sie wird daher nur an dieser Stelle kommentiert. +chk_iface_network() { + { + echo "XXX"; echo "Outside Interface: $(cat /usr/local/etc/pfdcontrol/outside_iface)"; echo "XXX" # Der geplottete Text in der Statusleiste + echo 1; sleep 0.16; echo 5; sleep 0.16; echo 13; sleep 0.16; echo 12 ; sleep 0.16 # Die Prozentwerte mit den sleep Times um den Balken zu versoegern + echo "XXX"; echo "Inside Interface: $(cat /usr/local/etc/pfdcontrol/inside_iface)"; echo "XXX" + echo 13; sleep 0.16; echo 16; sleep 0.16; echo 20; sleep 0.16; echo 26; sleep 0.16 + echo "XXX"; echo "Outside IP: $(cat /usr/local/etc/pfdcontrol/ip.$(cat /usr/local/etc/pfdcontrol/outside_iface))"; echo "XXX" + echo 30; sleep 0.16; echo 36; sleep 0.16; echo 40; sleep 0.16; echo 45; sleep 0.16 + echo "XXX"; echo "Inside IP: $(cat /usr/local/etc/pfdcontrol/ip.$(cat /usr/local/etc/pfdcontrol/inside_iface))"; echo "XXX" + echo 47; sleep 0.16; echo 49; sleep 0.16; echo 50; sleep 0.16; echo 55; sleep 0.16 + echo "XXX"; echo "Outside Netzmaske: $(cat /usr/local/etc/pfdcontrol/netmask.$(cat /usr/local/etc/pfdcontrol/outside_iface))"; echo "XXX" + echo 57; sleep 0.16; echo 60; sleep 0.16; echo 63; sleep 0.16; echo 67; sleep 0.16 + echo "XXX"; echo "Inside Netzmaske: $(cat /usr/local/etc/pfdcontrol/netmask.$(cat /usr/local/etc/pfdcontrol/inside_iface))"; echo "XXX" + echo 79; sleep 0.16; echo 82; sleep 0.16; echo 86; sleep 0.16; echo 94; sleep 0.16 + echo "XXX"; echo Komplett; echo "XXX" + echo 100; sleep 1 + } | \ + dialog --backtitle "PFDialogControl" --title "Aktuelle Einstellungen" --gauge "" 6 75 0 + ifconfig -a | awk '/.[0-9]:/ {print $1}' | cut -d ":" -f1 | grep -v -i inet | grep -v -i ether | grep -v -i lo0 > /usr/local/etc/pfdcontrol/identified_ifaces +} +# <- # + +#---Interface Einstellungen--- +# -> Diese Function baut das Menu "Interface Einstellungen" mithilfe von dialog auf. +menu_network() { + while true; do + _holdNM="/usr/local/etc/pfdcontrol/tmp_nm.$$" + + dialog --backtitle "PFDialogControl" --title " Netzwerk Menu "\ + --cancel-label "Zurueck" \ + --menu "In diesem Menu muessen Sie die unten aufgefuehrten Punkte konfigurieren, da ansonsten PFDialogControl keinen Dienst starten wird. Entscheiden Sie sich zuerst, welcher \ +Netwerkanschluss ins Internet zeigt und definieren diesen als Outside Interface. Der Anschluss, welcher spaeter mit den LAN Computern kommuniziert ist Ihr Inside Interface. Im Menu \ +Interfaces muessen Sie dann, dem Inside und Outside Interfaces je eine IP - Adresse und eine Netzmaske vergeben, achten Sie auf die Hinweise bezueglich DHCP in den Untermenues. Wenn \ +Sie nicht DHCP auf dem Outside Interface nutzen, gehen Sie zu den Punkten \"Standart Gateway\" und \"DNS Server\", diese beiden haben meist die gleiche IP, welche Sie in den Einstellungen \ +des Provider Routers finden. Wenn Sie denken dass alles OK ist, gehen Sie zu Punkt \"Interface INFO\" und sehen sich nochmals alles an. Wenn auch dann noch alles OK ist Starten Sie die \ +Interfaces\n\nKleiner Tip, arbeiten Sie sich von oben nach unten, dann klappt schon alles.\n\nIhr System hat folgende Interfaces:\n\n`cat /usr/local/etc/pfdcontrol/identified_ifaces`" 33 115 33 \ + "INSIDE Interface" "Geben Sie ein Interface ein welches in Richtung eigenes netzwerk zeigt" \ + "OUTSIDE Interface" "Geben Sie das Interface ein, welches mit dem Internet verbunden ist" \ + "Interfaces" "IP - Adresse und Netzmasken konfigurieren bzw. Eingeben" \ + "Standard Gateway" "Geben Sie die Route zum Internet oder Ihrem Provider - Router hier ein " \ + "DNS Server" "DNS - Server eintragen, meist der gleiche wie unter Punkt \"Standard Gateway\"." \ + "" "Ansonsten geben Sie den Google DNS - Server an (8.8.8.8) er funktioniert immer" \ + "Interface Info" "BITTE UEBERPRUEFEN SIE DIE INTERFACE EINSTELLUNGEN BEVOR SIE AUF START INTERFACE GEHEN" \ + "" "" \ + "Start Interface" "Hier koennen Sie die konfigurierten Interfaces starten" \ + "Stop Interface" "Hier koennen Sie die konfigurierten Interfaces stoppen" \ + "" "" \ + "Zurueck" "Zurueck zum Hauptmenu" 2>$_holdNM + + opt=$? + if [ $opt != 0 ]; then dialog --clear; /usr/bin/pfdctl && exit; fi + menuPoint=`cat $_holdNM` + case $menuPoint in + "Interfaces") warning_1; input_netconfig_name; input_netconfig_ip; input_netconfig_netmask; + ;; + "INSIDE Interface") run_inside_netconfig; + ;; + "OUTSIDE Interface") run_outside_netconfig; + ;; + "Standard Gateway") input_netconfig_gway; + ;; + "DNS Server") input_netconfig_dns; + ;; + "Interface Info") info_netconfig; + ;; + "Start Interface") run_netconfig; + ;; + "Stop Interface") run_netconfig_stop; + ;; + "Zurueck") dialog --clear; /usr/bin/pfdctl && exit; + ;; + esac + done +} + +_netCONF=/usr/local/etc/pfdcontrol +warning_1() { +warn_1=/usr/local/etc/pfdcontrol/tmp_warning_1.$$ + dialog --backtitle "PFDialogControl"\ + --msgbox "Wenn Sie diesen Menupunkt das erste mal ausfuehren dann ist alles wie vorgesehen (OK!). Wenn Sie aber hier Aenderungen vornehmen, nachdem Sie einen der verfuegbaren Dienste bereits aktiviert haben \ +so muessen Sie folgende Punkte DRINGEND beachten:\n\n1. Starten Sie die Dienste DHCP/DNS und NAT welche aktiv sind einmal neu nachdem Sie auf \"Start Interface\" waren. Diese Dienste sind dynamisch und koennen sich selbst anpassen\ +\n\n2. Die Portweiterleitung und Sperr-Regeln sind statisch, also ueberpruefen Sie Ihre Regeln, sie werden NICHT mehr passen!\n\nIm allgemeinen sollte zumindest die Inside Seite von Beginn an korrekt konfiguriert sein, so \ +gilt der allgemeine Grundsatz --> Zuerst denken, dann konfigurieren :)" 25 70 2>$warn_1 + +} +# <- # + +#---Interfaces--- --> Teil 1/3 +# -> Diese Function baut nur auf dialog auf und ermoeglicht die Eingabe des Iface Namens, welcher fuer die beiden Nachfolgenden Funktions in eine Variable gespeichert wird. +input_netconfig_name() { + iface_name=/usr/local/etc/pfdcontrol/tmp_main_iface.$$ # tempraeres Speichern in File mit Verweis auf Variable + iface_OK_str=`cat $iface_name` # Cat Auszug um spaeter einen String zu haben falls noetig + act_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` # String Speicherung fuer spaetere Iface Active Pruefung + act_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` # dito wie oben + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie den Interface Namen ein:\n\nZur Auswahl --> `cat /usr/local/etc/pfdcontrol/identified_ifaces`\n\n\ +Aktuelles INSIDE Iinterface: $act_inside\nAktuelles OUTSIDE Interface: $act_outside" 15 52 2>$iface_name + opt=$? + if [ $opt != 0 ]; then menu_network && exit; dialog --clear; fi + + if [ -z $(cat $iface_name) ]; then # Diese IF prueft auf Leereingabe Iface Name + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keinen Interface Namen Eingegeben!" 10 35 + menu_network && exit + fi + + chk_iface_name # Libary (libchkin12) zum verifizieren ob Iface Name existiert oder nicht +} +# <- # +#---Interfaces--- --> Teil 2/3 +# -> Diese Function baut auf dialog und nutzt den Iface Namen von input_netconfig_name. Hier kann die IP Adresse eingegeben werden. +input_netconfig_ip() { + warn_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` # Ermitteln ob Inside Iface um nachfolgenden dialog zu erzeugen, ansonsten wird auf Outside dialog umgeleitet + warn_input=`cat $iface_name` + + if [ "$(echo $warn_inside)" = "$(echo $warn_input)" ]; then + dialog --backtitle "PFDialogControl" \ + --title "HINWEIS" \ + --msgbox "Sie konfigurieren gerade Ihr Inside Interface, wenn Sie die DHCP/DNS Funktion von \ +PFDialogControl nutzen moechten, so waehlen Sie eine IP -Adresse, die mit einer \ +der folgenden Ziffern endet --> 1 - 19 oder 251 - 254." 10 70 + elif [ "$(echo $warn_inside)" != "$(echo $warn_input)" ]; then + dialog --backtitle "PFDialogControl" \ + --title "HINWEIS" \ + --msgbox "Sie konfigurieren gerade Ihr Outside Interface, Sie koennen wenn Sie wollen auch DHCP \ +eingeben und PFDialogControl bezieht seine IP und Netzmaske vom Provider Router. Dies wird aber nicht empfohlen. " 10 70 + fi + + backup_ip=$(cat /usr/local/etc/pfdcontrol/ip.`cat $iface_name`) # Backup Funktion um bei Leer -oder Falscheingaben den urspruenglichen Wert wiederherzustellen + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie eine IP Adresse ein" 12 52 $(cat /usr/local/etc/pfdcontrol/ip.`cat $iface_name`) 2>$_netCONF/ip.`cat $iface_name` + opt=$? + if [ $opt != 0 ]; then $(echo $backup_ip > $_netCONF/ip.`cat $iface_name`); menu_network && exit; dialog --clear; fi # Zurueck Funktion + + if [ -z $(cat /usr/local/etc/pfdcontrol/ip.`cat $iface_name`) ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keine IP Adresse eingegeben!" 10 35 + $(echo $backup_ip > $_netCONF/ip.`cat $iface_name`) + menu_network && exit + fi + + equal_inside=$(cat /usr/local/etc/pfdcontrol/ip.`cat /usr/local/etc/pfdcontrol/inside_iface` | cut -d "." -f1-3) + equal_outside=$(cat /usr/local/etc/pfdcontrol/ip.`cat /usr/local/etc/pfdcontrol/outside_iface` | cut -d "." -f1-3) + + if [ "echo $equal_inside" = "echo $equal_outside" ]; then # Hier wird auf Inside/Outside Iface, gleiches Subnetz geprueft und gewarnt + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" \ + --yesno "Ihre INSIDE UND OUTSIDE IP scheinen sind im gleichen Subnetz zu befinden. Sind Sie sicher mit dieser Aktion?" 10 40 + + case $? in + 0) + ;; + 1) $(echo $backup_ip > $_netCONF/ip.`cat $iface_name`); menu_network && exit + ;; + esac + fi +} +# <- # +#---Interfaces--- --> Teil 3/3 +# -> Hier kann die Subnetzmaske eingegeben werden +input_netconfig_netmask() { + backup_netmask=$(cat $_netCONF/netmask.`cat $iface_name`) + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie eine Netzmaske ein (z.B 255.255.255.0).\n\nDer Bereich Min/Max. bewegt sich frei zwischen (255.255.0.0 - 255.255.255.252 oder 16 - 30 Bit Siffix) " 15 50 $(cat $_netCONF/netmask.`cat $iface_name`) 2>$_netCONF/netmask.`cat $iface_name` + opt=$? + if [ $opt != 0 ]; then $(echo $backup_netmask > $_netCONF/netmask.`cat $iface_name`); menu_network && exit; dialog --clear; fi + int_info=`cat $iface_name` + ip=`cat /usr/local/etc/pfdcontrol/ip.$int_info` + + if [ -z $(cat $_netCONF/netmask.`cat $iface_name`) ]; then + if [ $(cat $_netCONF/ip.`cat $iface_name`) != DHCP ] && [ $(cat $_netCONF/ip.`cat $iface_name`) != dhcp ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keine Netzmaske eingegeben!" 10 35 + $(echo $backup_netmask > $_netCONF/netmask.`cat $iface_name`) + menu_network && exit + fi + fi + + + netmask=`cat /usr/local/etc/pfdcontrol/netmask.$int_info` + dialog --backtitle "PFDialogControl" \ + --title "Interface Info: $int_info" \ + --msgbox "IP Adresse: $ip\nNetzmaske: $netmask" 6 44 +} +# <- # +#---Start Interface--- +# -> Hier kann ein konfiguriertes Interface mittels Namensangabe gestartet werden +run_netconfig() { +# Nachfolgende Variabelen speichern diverse Werte bezueglcich Outside/Inside Iface um sie spaeter als Pfad oder String zu nutzen +run_iface=/usr/local/etc/pfdcontrol/tmp_run_iface.$$ +outside_interface=`cat /usr/local/etc/pfdcontrol/outside_iface` +gway_addr=/usr/local/etc/pfdcontrol/gateway.addr +gateway=`cat $gway_addr` +iface_name=$run_iface +act_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` +act_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie das zu startende Interface ein\n\nVerfuegbare Interfaces: `cat /usr/local/etc/pfdcontrol/identified_ifaces`\n\n\ +Aktuelles INSIDE Iinterface: $act_inside\nAktuelles OUTSIDE Interface: $act_outside" 15 52 2>$run_iface + opt=$? + if [ $opt != 0 ]; then dialog --clear; menu_network; fi + + run=`cat $run_iface` + ip=`cat /usr/local/etc/pfdcontrol/ip.$run` + netmask=`cat /usr/local/etc/pfdcontrol/netmask.$run` + + if [ -z $(cat $run_iface) ]; then # Pruefung auf Leereingabe Iface Name + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keinen Interface Namen Eingegeben!" 10 35 + menu_network && exit + fi + + chk_iface_name # Pruefung auf existierenden Iface Namen + + # Folgende Wariablen liefern Informationen in Pfad -oder Stringform zum Pruefen auf Config (Vorhandensein) der Inside/Outside Einstellungen + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_inside` + str_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + str_outside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_outside` + + str_inside_ip_cut=`cat /usr/local/etc/pfdcontrol/ip.$str_inside | cut -d "." -f1-3` + + inside_ip=/usr/local/etc/pfdcontrol/ip.$str_inside + inside=/usr/local/etc/pfdcontrol/inside_iface + + outside_ip=/usr/local/etc/pfdcontrol/ip.$str_outside + outside=/usr/local/etc/pfdcontrol/outside_iface + + netmask_in=`cat /usr/local/etc/pfdcontrol/suffix.$str_inside` + netmask_out=`cat /usr/local/etc/pfdcontrol/suffix.$str_outside` + + str_netmask_in_stat=`cat /usr/local/etc/pfdcontrol/netmask.$str_inside` + netmask_in_stat=/usr/local/etc/pfdcontrol/netmask.$str_inside + str_netmask_out_stat=`cat /usr/local/etc/pfdcontrol/netmask.$str_outside` + netmask_out_stat=/usr/local/etc/pfdcontrol/netmask.$str_outside + +# Pruefung auf fertig konfigurierte Inside/outside Einstellungen + if [ ! -e $inside ] || [ -z $str_inside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr INTERNES Interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> INSIDE Interface eingeben." 15 50 + elif [ ! -e $inside_ip ] || [ -z $str_inside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + elif [ ! -e $outside ] || [ -z $str_outside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr EXTERNES interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> OUTSIDE Interface eingeben." 15 50 + elif [ ! -e $outside_ip ] || [ -z $str_outside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre EXTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + elif [ ! -e $netmask_in_stat ] || [ -z $str_netmask_in_stat ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNES Interface hat keine Subnetzmaske.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + fi + + ifconfig $run inet $ip netmask $netmask up # Initialisiert den Iface Start/ auch dhcp wird ergebnislos versucht, ist aber nicht ersichtlich + route add default $(cat /usr/local/etc/pfdcontrol/gateway.addr) # Setzten der Defaultroute aus "Standard Gateway"/ dhcp wird auch ergebnislos ausgefuehrt + sed "s/ifconfig_$run/#$run--DECONFIG--durch--PFDialogControl/g" /etc/rc.conf > /etc/rc.conf.pfdctl && rm /etc/rc.conf && mv /etc/rc.conf.pfdctl /etc/rc.conf + if [ $ip = DHCP ] || [ $ip = dhcp ]; then # Pruefe ob Iface Name in Config File "dhcp oder DHCP enthaelt" + echo -n "ifconfig_$run=\"DHCP\" #Diese Regel wurde durch PFDialogControl erstellt" >> /etc/rc.conf # Setzt die Config in rc.conf ein um sie beim Reboot zu erhalten + dhclient $run # Falls DHCP, wird gleich verucht mittels "dhclient" das Iface zu initialisierten. (Funktioniert nicht immer FreeBSD mag solche Aenderungen zur Laufzeit nicht) + # Nachfolgend gleiche Pruefung wie oben, aber spezifisch fuer das Outside Iface + if [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) = DHCP ] || [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) = dhcp ]; then + sed "s/defaultrouter/#defaultrouter--DECONFIG--durch--PFDialogControl/g" /etc/rc.conf > /etc/rc.conf.pfdctl && rm /etc/rc.conf && mv /etc/rc.conf.pfdctl /etc/rc.conf + fi + else # Im Falle von statischer Config wird diese "else" ausgefuehrt + sed "s/defaultrouter/#defaultrouter--DECONFIG--durch--PFDialogControl/g" /etc/rc.conf > /etc/rc.conf.pfdctl && rm /etc/rc.conf && mv /etc/rc.conf.pfdctl /etc/rc.conf + echo "ifconfig_$run=\"inet $ip netmask $netmask\" #Diese Regel wurde durch PFDialogControl erstellt" >> /etc/rc.conf + echo "defaultrouter=\"$gateway\" #Diese Regel wurde durch PFDialogControl erstellt" >> /etc/rc.conf + sed "/nameserver/d" /etc/resolv.conf > /etc/resolv.conf.pfdctl && rm /etc/resolv.conf && mv /etc/resolv.conf.pfdctl /etc/resolv.conf + echo "nameserver $(cat /usr/local/etc/pfdcontrol/dns.addr)" >> /etc/resolv.conf + calc_netmask + fi + + dns_info=`cat /usr/local/etc/pfdcontrol/dns.addr` # Prueft ob Outside DHCP ist, falls nein, wird wird DNS statisch gesetzt + if [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) = DHCP ] || [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) = dhcp ]; then + sed "/nameserver/d" /etc/resolv.conf > /etc/resolv.conf.pfdctl && rm /etc/resolv.conf && mv /etc/resolv.conf.pfdctl /etc/resolv.conf + calc_netmask + fi + +cat /etc/pf.conf | grep '#---ACT---' +if [ $? != "1" ]; then + gsed "s/#---ACT---/#---NOTACT---/g" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + gsed "/#var1 /d" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + gsed "/#var2 /d" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + gsed "/#var3 /d" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + gsed "/#var4 /d" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf +fi + +chk_iface_status_on # Globale Function von Skript head, soll Iface Einstellungen wo moeglich aktualisieren + + dialog --backtitle "PFDialogControl" \ + --title " Interface Info: $run" --msgbox "Das Interface wurde mit folgenden Einstellungen gestartet und die Konfiguration in\n/etc/rc.conf gespeichert\n\nAchtung wenn Sie von einer per DHCP konfigurierten Umgebung in eine statische +wechseln dann ist aufgrund einer FreeBSD Restriktion ein NEUSTART erforderlich!\n\nIP Adresse: $ip\nNetzmaske: $netmask" 15 55 +} +# <- # +#---Stop Interface--- +# -> Mit dieser Funktion wird ein Iface gestoppt, aber seine Config bleibt in den Config Files erhalten +run_netconfig_stop() { +run_iface=/usr/local/etc/pfdcontrol/tmp_run_iface.$$ +iface_name=$run_iface +act_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` +act_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie das zu stoppende Interface ein\n\nVerfuegbare Interfaces: `cat /usr/local/etc/pfdcontrol/identified_ifaces`\n\nAktuelles INSIDE Iinterface: $act_inside\nAktuelles OUTSIDE Interface: $act_outside" 15 52 2>$run_iface + opt=$? + if [ $opt != 0 ]; then dialog --clear; menu_network; fi + + if [ -z $(cat $run_iface) ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keinen Interface Namen Eingegeben!" 10 35 + menu_network && exit + fi + + chk_iface_name # Pruefung auf existierenden Iface Namen + + run=`cat $run_iface` + ifconfig $run down delete # Stoppt das Iface anhand des Namens und deconfiguriert die Einstellungen in FreeBSD (nur dort) + sed "s/ifconfig_$run/#$run--DECONFIG--durch--PFDialogControl/g" /etc/rc.conf > /etc/rc.conf.pfdctl && rm /etc/rc.conf && mv /etc/rc.conf.pfdctl /etc/rc.conf + # Obere Zeile loescht die Boot Einstellungen in rc.conf + dialog --backtitle "PFDialogControl" \ + --title " Interface Info: $run" --msgbox "Das Interface wurde deaktiviert und dekonfiguriert. Dies bedeutet es ist abgeschaltet\nund wird bei einem System Neustart nicht aktiviert.\n\nWenn Sie dies aendern moechten, dann gehen Sie zum Menupunkt Netwerk --> Start Interface" 15 55 +} +# <- # + +#---Standard Gateway--- +# -> Hier kann die Default Route statisch konfiguriert werden (kein DHCP)/ nur konfiguriert, nur ausgefuehrt dazu ist "Start Interface" erforderlich +input_netconfig_gway() { + backup_gway=$(cat /usr/local/etc/pfdcontrol/gateway.addr) + gway_addr=/usr/local/etc/pfdcontrol/gateway.addr + outside_interface=`cat /usr/local/etc/pfdcontrol/outside_iface` + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie die IP Adresse Ihres primaeren Gateway ein\n\nAchtung: wenn Sie auf Ihrem Outside Interface\nDHCP benutzen, brauchen Sie hier nichts zu konfigurieren" 15 50 $(cat /usr/local/etc/pfdcontrol/gateway.addr) 2>$gway_addr + opt=$? + if [ $opt != 0 ]; then $(echo $backup_gway > /usr/local/etc/pfdcontrol/gateway.addr); dialog --clear; menu_network; fi + # Auslesen der Gateway Config + gateway=`cat $gway_addr` + gateway_info=`cat /usr/local/etc/pfdcontrol/gateway.addr` + + if [ -z $(cat /usr/local/etc/pfdcontrol/gateway.addr) ]; then # Pruefung auf Leereingabe + if [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) != DHCP ] && [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) != dhcp ]; then + # Pfuefung auf DHCP vohanden, falls nein, erscheint eine Fehlermeldung + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keinen Gateway (Router) eingebeben!" 10 35 + $(echo $backup_gway > /usr/local/etc/pfdcontrol/gateway.addr) + menu_network && exit + fi + fi + + # Nachfolgend die Schreibprozesse in rc.conf, mit Pruefung auf DHCP oder statisch + if [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) = DHCP ] || [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) = dhcp ]; then + sed "s/defaultrouter/#defaultrouter--DECONFIG--durch--PFDialogControl/g" /etc/rc.conf > /etc/rc.conf.pfdctl && rm /etc/rc.conf && mv /etc/rc.conf.pfdctl /etc/rc.conf + else + sed "s/defaultrouter/#defaultrouter--DECONFIG--durch--PFDialogControl/g" /etc/rc.conf > /etc/rc.conf.pfdctl && rm /etc/rc.conf && mv /etc/rc.conf.pfdctl /etc/rc.conf + echo -n "defaultrouter=\"$gateway\" #Diese Regel wurde durch PFDialogControl erstellt" >> /etc/rc.conf + fi + + dialog --backtitle "PFDialogControl" \ + --title "Gateway Adresse" --msgbox "Ihr Standard Gateway ist unter der IP $gateway_info erreichbar." 10 44 +} +# <- # + +#---DNS Server--- +# -> Hier kann der DNS Eintrag gemacht werden fuer die FreeBSD Instanz. Auch hier wie in "#---Standard Gateway---" Pruefung auf DHCP oder statisch +input_netconfig_dns() { + dns_addrr=/usr/local/etc/pfdcontrol/dns.addr + outside_interface=`cat /usr/local/etc/pfdcontrol/outside_iface` + dns_info=`cat /usr/local/etc/pfdcontrol/dns.addr` + backup_dns=$dns_info + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie die IP Adresse Ihres primaeren DNS Servers ein\n\nAchtung: wenn Sie auf Ihrem Outside Interface\nDHCP benutzen, brauchen Sie hier nichts zu konfigurieren" 15 50 $dns_info 2>$dns_addrr + opt=$? + if [ $opt != 0 ]; then $(echo $backup_dns > /usr/local/etc/pfdcontrol/dns.addr); dialog --clear; menu_network; fi + + dns=`cat dns_addrr` + dns_info=`cat /usr/local/etc/pfdcontrol/dns.addr` + + if [ -z $dns_info ]; then + if [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) != DHCP ] && [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) != dhcp ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keinen Gateway (Router) eingebeben!" 10 35 + $(echo $backup_dns > /usr/local/etc/pfdcontrol/dns.addr) + menu_network && exit + fi + fi + # Schreibe Config in /etc/reslov.conf + if [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) = DHCP ] || [ $(cat /usr/local/etc/pfdcontrol/ip.$outside_interface) = dhcp ]; then + sed "/nameserver/d" /etc/resolv.conf > /etc/resolv.conf.pfdctl && rm /etc/resolv.conf && mv /etc/resolv.conf.pfdctl /etc/resolv.conf + else + sed "/nameserver/d" /etc/resolv.conf > /etc/resolv.conf.pfdctl && rm /etc/resolv.conf && mv /etc/resolv.conf.pfdctl /etc/resolv.conf + echo -n "nameserver $dns_info" >> /etc/resolv.conf + fi + + dialog --backtitle "PFDialogControl" \ + --title "Primaerer DNS Server" --msgbox "Ihr primaerer DNS Server ist unter der IP $dns_info erreichbar." 10 44 +} +# <- # + +#---Interface INFO--- +# -> Hier werden alle relevanten Einstellungen aus den PFDialogControl Config Files ausgelesen und in einer Globalen (Iface abhaengigen) Ausgabe zusammengefasst +info_netconfig() { + info_iface=/usr/local/etc/pfdcontrol/tmp_info_interface.$$ + ifaces=`cat /usr/local/etc/pfdcontrol/identified_ifaces` + iface_name=$info_iface + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie einen Interface Name ein um die Konfiguration zu sehen.\n\nZur Auswahl stehen:\n\n$ifaces" 15 50 2>$info_iface + opt=$? + if [ $opt != 0 ]; then dialog --clear; menu_network; fi + + iiface=`cat $info_iface` + ip=`cat /usr/local/etc/pfdcontrol/ip.$iiface` + netmask=`cat /usr/local/etc/pfdcontrol/netmask.$iiface` + gateway_info=`cat /usr/local/etc/pfdcontrol/gateway.addr` + dns_info=`cat /usr/local/etc/pfdcontrol/dns.addr` + outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + real_gatewa=`netstat -rn | grep default | cut -d " " -f13-20` # Reale Ausgabe des aktuellen Gateway mittels "netstat" + real_dns=`cat /etc/resolv.conf | grep -m 1 nameserver | cut -d " " -f2` # Reale Ausgabe des Nameservers mittels cat von resolv.conf + + if [ -z $(cat $info_iface) ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keinen Interface Namen Eingegeben!" 10 35 + menu_network && exit + fi + + chk_iface_name + + ifconfig $(cat $info_iface) | grep inet + # Nachfolgende IF Prueft auf aktuellen Running Zustand des Interfaces und gibt ihn in Ausgabe mit + if [ "$?" != "0" ];then + iface_running=`echo "Interface inaktiv"` + else + iface_running=`echo "Interface aktiv"` + fi + + dialog --backtitle "PFDialogControl" \ + --title " Interface Info: $iiface" --msgbox "\nInterface Einstellungen\nIP Adresse: $ip\nNetzmaske: $netmask\n\nAktueller Status: $iface_running\n\nGlobale \ +Einstellungen\nGateway IP: $gateway_info\nPrimare DNS IP: $dns_info\nMomentan laufender Gatewaw: $real_gatewa\nMomentan laufender DNS Server: $real_dns\n\nINSIDE Interface: \ +$inside\nOUTSIDE Interface: $outside" 20 60 +} +# <- # + +#---INSIDE Interface--- +# -> Hier kann das Insdie Iface eingegeben werden/ Eintellungen werden erst mit "Start Interface" uebernommen +run_inside_netconfig() { + inside_iface=/usr/local/etc/pfdcontrol/inside_iface + ifaces=`cat /usr/local/etc/pfdcontrol/identified_ifaces` + iface_name=/usr/local/etc/pfdcontrol/inside_iface + backup_inside=$(cat $inside_iface) + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie das INSIDE Interface an. Bei diesem Interface handelt es sich um jenes, welches sich in Ihrem LAN befindet\n\nZur Auswahl stehen:\n\n$ifaces" 15 50 $(cat $inside_iface) 2>$inside_iface + opt=$? + if [ $opt != 0 ]; then $(echo $backup_inside > /usr/local/etc/pfdcontrol/inside_iface); dialog --clear; menu_network; fi + + + if [ -z $(cat $inside_iface) ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keinen Interface Namen Eingegeben!" 10 35 + $(echo $backup_inside > /usr/local/etc/pfdcontrol/inside_iface) + menu_network && exit + fi + + chk_iface_name + # An dieser Stelle findet eine Pruefung mit WARNUNG auf gleiches Inside/Outside Iface gesetzt statt + inside_info=`cat /usr/local/etc/pfdcontrol/inside_iface` + if [ $inside_info = $(cat /usr/local/etc/pfdcontrol/outside_iface) ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --yesno "Ihr Inside Interface hat den gleichen Namen wie Ihr Outside Interface!\n\nSind Sie sicher?" 10 50 + + case $? in + 0) + ;; + 1) $(echo $backup_inside > /usr/local/etc/pfdcontrol/inside_iface); menu_network && exit + ;; + esac + else + dialog --backtitle "PFDialogControl" \ + --title "Auszug INSIDE Interface" --msgbox "\nIhr neues INSIDE Interface ist: $inside_info" 10 30 + fi +} +# <- # + +#---OUTSIDE Interface--- +# -> DITO wie oben, aber mit Outside Interface +run_outside_netconfig() { + outside_iface=/usr/local/etc/pfdcontrol/outside_iface + ifaces=`cat /usr/local/etc/pfdcontrol/identified_ifaces` + iface_name=/usr/local/etc/pfdcontrol/outside_iface + backup_outside=$(cat $outside_iface) + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie das OUTSIDE Interface an. Bei diesem Interface handelt es sich um jenes, welches richtung Aussenwelt (Internet) zeigt.\n\nZur Auswahl stehen:\n\n$ifaces" 15 50 $(cat $outside_iface) 2>$outside_iface + opt=$? + if [ $opt != 0 ]; then $(echo $backup_outside > /usr/local/etc/pfdcontrol/outside_iface); dialog --clear; menu_network; fi + + if [ -z $(cat $outside_iface) ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --msgbox "Sie haben keinen Interface Namen Eingegeben!" 10 35 + $(echo $backup_outside > /usr/local/etc/pfdcontrol/outside_iface) + menu_network && exit + fi + + chk_iface_name + + outside_info=`cat /usr/local/etc/pfdcontrol/outside_iface` + if [ $outside_info = $(cat /usr/local/etc/pfdcontrol/inside_iface) ]; then + dialog --backtitle "PFDialogControl"\ + --title "WARNUNG" --yesno "Ihr Outside Interface hat den gleichen Namen wie Ihr Inside Interface!\n\nSind Sie sicher?" 10 50 + + case $? in + 0) + ;; + 1) $(echo $backup_outside > /usr/local/etc/pfdcontrol/outside_iface); menu_network && exit + ;; + esac + else + dialog --backtitle "PFDialogControl" \ + --title "Auszug INSIDE Interface" --msgbox "\nIhr neues Outside Interface ist: $outside_info" 10 30 + fi +} +# <- # + +######################################################################################################################################################## +############################################################################################################### Sektion Interface Einstellungen ######## + + +####### Sektion DHCP/DNS Einstellungen ################################################################################################################# +######################################################################################################################################################## + + +chk_iface_dnsmasq() { + { + echo "XXX"; echo "Config File: $(ls /usr/local/etc/ | grep -m 1 dnsmasq)"; echo "XXX" + echo 1; sleep 0.16; echo 5; sleep 0.16; echo 13; sleep 0.16; echo 12 ; sleep 0.16 + echo "XXX"; echo "DHCP Interface: $(head -7 /usr/local/etc/dnsmasq.conf | tail -1 | cut -d "=" -f2)"; echo "XXX" + echo 13; sleep 0.16; echo 16; sleep 0.16; echo 20; sleep 0.16; echo 26; sleep 0.16 + echo "XXX"; echo "Router Config: $(head -8 /usr/local/etc/dnsmasq.conf | tail -1 | cut -d "=" -f2)"; echo "XXX" + echo 30; sleep 0.16; echo 36; sleep 0.16; echo 40; sleep 0.16; echo 45; sleep 0.16 + echo "XXX"; echo "DHCP Range: $(head -9 /usr/local/etc/dnsmasq.conf | tail -1 | cut -d "=" -f2)"; echo "XXX" + echo 47; sleep 0.16; echo 49; sleep 0.16; echo 50; sleep 0.16; echo 55; sleep 0.16 + echo "XXX"; echo "Domain Erweiterung: $(head -10 /usr/local/etc/dnsmasq.conf | tail -1 | cut -d "=" -f2)"; echo "XXX" + echo 57; sleep 0.16; echo 60; sleep 0.16; echo 63; sleep 0.16; echo 67; sleep 0.16 + echo "XXX"; echo "Lokale Domain: $(head -11 /usr/local/etc/dnsmasq.conf | tail -1 | cut -d "=" -f2)"; echo "XXX" + echo 79; sleep 0.16; echo 82; sleep 0.16; echo 86; sleep 0.16; echo 94; sleep 0.16 + echo "XXX"; echo Komplett; echo "XXX" + echo 100; sleep 1 + } | \ + dialog --backtitle "PFDialogControl" --title "Aktuelle Einstellungen..." --gauge "" 6 75 0 +} +#--- DHCP/DNS Einstellungen--- +# -> Nachfolgen der Konstuktor fuer das Menu DHCP/DNS Einstellungen mit dialog +menu_dnsmasq() { + while true; do + _holdDMASQ="/usr/local/etc/pfdcontrol/tmp_dd.$$" + + # IF notwendig fuer Statusanzeige in Secondary Menu/ ist abhaengig von "ifconfig" und "pa -ax" Pruefungen um 100% sicher zu sein + if [ $(ps -ax | grep dnsmasq | wc -l) = 1 ]; then + varRUNNING="DHCP/DNS ist DEAKTIVIERT" + else + ifconfig $(cat /usr/local/etc/pfdcontrol/inside_iface) | grep inet + if [ "$?" != "0" ]; then + varRUNNING="DHCP/DNS ist DEAKTIVIERT" + else + varRUNNING="DHCP/DNS ist AKTIVIERT" + fi + fi + + dialog --backtitle "PFDialogControl" --title " DHCP/DNS Einstellungen "\ + --cancel-label "Zurueck" \ + --menu "Willkommen im DHCP/DNS Konfigurationsmenu. Hier koennen Sie den DHCP/DNS Dienst AN/AUS schalten. Der einfachen Konfiguration halber muessen Sie hier nichts einstellen bis auf den Domainnamen der ueber das LAN \ +an die lokalen Computer verteilt wird. Der Standard Arbeitsbereich richtet sich an die von Ihnen unter Inside Interface eingegebene IP Adresse und wird per Autokonfiguration in den Bereich xxx.xxx.xxx.20 - xxx.xxx.xxx.250 eingeschraenkt. \n\nAktueller Zustand: $varRUNNING" 21 115 21\ + "Domainname" "Hier koennen Sie den Domain Namen, den Ihr Netzwerk benutzen soll eingeben (z.B. example.com)" \ + "" "" \ + "DHCP/DNS INFO" "Auszug aus Ihrer autogenerierten DHCP/DNS Konfiguration" \ + "" "" \ + "Start DHCP/DNS" "Hier koennen Sie Ihren DHCP/DNS Dienst starten" \ + "Stop DHCP/DNS" "Hier koennen Sie Ihren DHCP/DNS Dienst stoppen" \ + "" "" \ + "Zurueck" "Zurueck zum Hauptmenu" 2>$_holdDMASQ + + + opt=$? + if [ $opt != 0 ]; then dialog --clear; /usr/bin/pfdctl && exit; fi + menuPoint=`cat $_holdDMASQ` + case $menuPoint in + "Domainname") input_dnsmasq_domainname; + ;; + "DHCP/DNS INFO") info_dnsmasq; + ;; + "Start DHCP/DNS") run_dnsmasq; + ;; + "Stop DHCP/DNS") stop_dnsmasq; + ;; + "Zurueck") dialog --clear; /usr/bin/pfdctl && exit; + ;; + esac + done +} +# <- # + +#---Domainname--- +# -> An dieser Stelle kann der Domainname eingegeben werden, welchen dnsmasq benoetigt +input_dnsmasq_domainname() { + backup_dnsmasq=$(cat /usr/local/etc/pfdcontrol/domainname) + domname=/usr/local/etc/pfdcontrol/domainname + dom_info=`cat /usr/local/etc/pfdcontrol/domainname` + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Geben Sie bitte den Domain Namen ein, den Ihr Netzwerk benutzen soll. Uebliche Namen sind localdomain, localdom, network usw." 10 60 $(cat /usr/local/etc/pfdcontrol/domainname) 2>$domname + opt=$? + if [ $opt != 0 ]; then $(echo $backup_dnsmasq > /usr/local/etc/pfdcontrol/domainname); menu_dnsmasq && exit; fi + + # Nachfolgen eine simple Leereingabepruefung + if [ -z "$(cat /usr/local/etc/pfdcontrol/domainname)" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Bitte geben Sie einen gueltigen Namen ein!" 10 20 + $(echo $backup_dnsmasq > /usr/local/etc/pfdcontrol/domainname) + menu_dnsmasq && exit + fi + + dom_info=`cat /usr/local/etc/pfdcontrol/domainname` + dialog --backtitle "PFDialogControl" \ + --title "Domainname Info" --msgbox "Ihr neuer Domain Name lautet --> $dom_info" 6 44 +} +# <- # + +#---DHCP/DNS INFO--- +# -> Einfache Infoausgabe mittels dialog, dabei werden lediglich Config Files ausgelesen und in Variablen gepackt +info_dnsmasq() { + inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + range=`cat /usr/local/etc/pfdcontrol/ip.$inside | cut -d "." -f1-3` + dom=`cat /usr/local/etc/pfdcontrol/domainname` + + dialog --backtitle "PFDialogControl" \ + --title "DHCP/DNS Auszug" --msgbox "\nIhr durch PFDialogControl autogenerierte DHCP Einstellung lautet wie folgt:\n\nVerteilt wird ueber Interface: $inside\n\nPrimaerer Domainname: $dom\n\nIhr DHCP Range: $range.20 - $range.250\n\nDer Range +von $range.2 - $range.19 steht Ihnen fuer Ihre eigene statische Konfiguration zur Verfuegung." 20 80 +} +# <- # + +#---Start DNCP/DNS--- +# -> An dieser Stelle kann dnsmasq gestartet werden, falls alle Configs und Parameter vorhanden +run_dnsmasq() { + inside_iface=`cat /usr/local/etc/pfdcontrol/inside_iface` + inside_ip=/usr/local/etc/pfdcontrol/ip.$inside_iface + inside=/usr/local/etc/pfdcontrol/inside_iface + + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$inside_iface` + + # Pruefung ob Inside Iface/IP gesetzt + if [ ! -e $inside ] || [ -z $str_inside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr INTERNES Interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> INSIDE interface eingeben." 15 50 + menu_dnsmasq && exit + elif [ ! -e $inside_ip ] || [ -z $str_inside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_dnsmasq && exit + fi + # Pruefung ob Domainname gesetzt + if [ -z "$(cat /usr/local/etc/pfdcontrol/domainname)" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Bitte geben Sie einen gueltigen Domaninnamen ein!" 10 20 + menu_dnsmasq && exit + fi + # Pruefung ob Inside Iface ueberhabt lauffaehig/ mittels ifconfig wird Status ermittelt, so ist immer sicher ob OK oder nicht + ifconfig $(cat /usr/local/etc/pfdcontrol/inside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Inside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_dnsmasq && exit + fi + # Letzte Frage vor Ausfuehrung/ sonst Abbruch mit Default-Abbruch-Sequenz (menu_ && exit) + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --title "Achtung" --yesno "Sie wollen Ihren DHCP/DNS - Server aktivieren. Sind Sie Sicher?" 8 30 + + case $? in + 0) + ;; + 1) menu_dnsmasq && exit + ;; + esac + + + inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + range=`cat /usr/local/etc/pfdcontrol/ip.$inside | cut -d "." -f1-3` + dom=`cat /usr/local/etc/pfdcontrol/domainname` + router_ip=`cat /usr/local/etc/pfdcontrol/ip.$inside` + w_hostname=`hostname` + ip=`cat /usr/local/etc/pfdcontrol/ip.$inside` + + # Falls bis hierhin alles OK/ Beginn mit diversen Schreiboperationen + sed "s/dnsmasq_enable/#dnsmasq_enable--DECONFIG--durch--PFDialogControl/g" /etc/rc.conf > /etc/rc.conf.pfdctl && rm /etc/rc.conf && mv /etc/rc.conf.pfdctl /etc/rc.conf + # Schreibe aktuelle Config in eine tmp-Kopie von dnsmasq.skeleton und Kopiere sie in /usr/local/etc/dnsmasq.conf/ loesche tmp-Kopie + cp /usr/local/etc/pfdcontrol/skel/dnsmasq.skeleton /usr/local/etc/pfdcontrol/skel/dnsmasq.conf.tmp + echo "interface=$inside" >> /usr/local/etc/pfdcontrol/skel/dnsmasq.conf.tmp + echo "dhcp-option=option:router,$router_ip" >> /usr/local/etc/pfdcontrol/skel/dnsmasq.conf.tmp + echo "dhcp-range=$range.20,$range.250,336h" >> /usr/local/etc/pfdcontrol/skel/dnsmasq.conf.tmp + echo "local=/$dom/" >> /usr/local/etc/pfdcontrol/skel/dnsmasq.conf.tmp + echo "domain=$dom" >> /usr/local/etc/pfdcontrol/skel/dnsmasq.conf.tmp + cp /usr/local/etc/pfdcontrol/skel/dnsmasq.conf.tmp /usr/local/etc/dnsmasq.conf + rm /usr/local/etc/pfdcontrol/skel/dnsmasq.conf.tmp + # Setzen des eigenen Hosnamens in /etc/hosts, damit der Hostname der PFDialogControl Instanz auch aufgeloest werden kann/ letzter Name wird vorgaengig geloescht + sed "/$w_hostname/d" /etc/hosts > /etc/hosts.pfdctl && rm /etc/hosts && mv /etc/hosts.pfdctl /etc/hosts + echo "$ip $w_hostname" >> /etc/hosts + # Neustart/Start des dnsmasq Dienstes + /usr/local/etc/rc.d/dnsmasq onestart + echo -n "dnsmasq_enable=\"YES\"" >> /etc/rc.conf + + dialog --backtitle "PFDialogControl" \ + --title "DHCP/DNS Auszug" --msgbox "\nIhr DHCP Server lauft auf Interface --> $inside\nund bedient den Adressbereich --> $range.20 - $range.250\nDie Standard Lebensdauer einer IP betraegt 14 Tage (lease Time)\nnach dem Motto so kurz wie +moeglich und so lang wie noetig.\n\nIhre Computername werden um den Domainnamen --> $dom ergaenzt." 20 60 +} +# <- # + +#---Stop DHCP/DNS--- +# -> Hier kann dnsmasq wieder gestoppt werden +stop_dnsmasq() { + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --title "Achtung" --yesno "Sie wollen Ihren DHCP/DNS - Server deaktivieren. Sind Sie Sicher?" 8 30 + + case $? in + 0) + ;; + 1) menu_dnsmasq && exit + ;; + esac + # Loeschen des Bootbefehls in rc.conf und stoppen des Dienstes + sed "s/dnsmasq_enable/#dnsmasq_enable--DECONFIG--durch--PFDialogControl/g" /etc/rc.conf > /etc/rc.conf.pfdctl && rm /etc/rc.conf && mv /etc/rc.conf.pfdctl /etc/rc.conf + /usr/local/etc/rc.d/dnsmasq stop + + dialog --backtitle "PFDialogControl" \ + --title "Domainname Info" --msgbox "Ihr DHCP/DNS Server wurde deaktiviert. Ein DHCP-Relay-Agent wird aufgrund der spezialisierung dieses Projekts auf kleine virtuelle Umgebungen nicht aktiviert. Bitte vergewissern Sie sich, dass sich eine +Ausweichloesung in Ihrem Netzwerk befindet." 15 40 +} +# <- # + +######################################################################################################################################################## +############################################################################################################### Sektion DHCP/DNS Einstellungen ######### + + + +####### Sektion NAT EIN/AUS ############################################################################################################################ +######################################################################################################################################################## + +#---NAT Einstellungen--- +# -> Dies ist der dialog Menu Konstruktor fuer NAT Einstellungen +menu_nat() { + while true; do + _holdNAT="/usr/local/etc/pfdcontrol/tmp_nat.$$" + outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + ip=`cat /usr/local/etc/pfdcontrol/ip.$outside` + # Pruefung auf aktives Iface mittels ifconfig und grep (nach nat on). Dient der Statusanzeige im Menu + cat /etc/pf.conf | grep "nat on" + if [ "$?" != "0" ]; then + varRUNNING="NAT ist DEAKTIVIERT" + else + ifconfig $outside | grep inet + if [ "$?" != "0" ]; then + varRUNNING="NAT ist DEAKTIVIERT" + else + varRUNNING="NAT ist AKTIVIERT" + fi + fi + + dialog --backtitle "PFDialogControl" --title " NAT Einstellungen "\ + --cancel-label "Zurueck" \ + --menu "Willkommen im NAT Abschnitt. NAT steht fuer Network Address Translation und bedeutet, wenn Sie diesen Dienst aktivieren, werden alle Ihre Computer im LAN ueber eine oeffentliche Adresse ($ip) geleitet. \ +Wenn Sie sich entschliessen diesen Dienst nicht zu nutzen, so ist dies \"mit groesster Wahrscheinlichkeit\" kein Problem. Denn die Standardkonfiguration dieses FreeBSD Systems ist der Gateway Modus, was bedeutet, dass Sie nur darauf achten \ +muessen dass die Einheit vor diesem System entsprechend konfiguriert ist um im Gateway Modus zu arbeiten. ACHTUNG: Da die Firewall Regeln unterschiedlich sein koennen, kann die Wirkung diverser Regeln ohne NAT nicht vorhergesagt werden.\n\nAktueller Zustand: $varRUNNING" 19 115 19\ + "NAT Aktivieren" "Schaltet den NAT Betrieb EIN" \ + "NAT Deaktivieren" "Schaltet den NAT Betrieb AUS" \ + "" "" \ + "Zurueck" "Zurueck zum Hauptmenu" 2>$_holdNAT + + + opt=$? + if [ $opt != 0 ]; then dialog --clear; /usr/bin/pfdctl && exit; fi + menuPoint=`cat $_holdNAT` + case $menuPoint in + "NAT Aktivieren") run_nat; + ;; + "NAT Deaktivieren") stop_nat + ;; + "Zurueck") dialog --clear; /usr/bin/pfdctl && exit; + ;; + esac + done +} +# <- # + +#---NAT Aktivieren--- +# -> An dieser Stelle kann der NAT Dienst gestartet werden +run_nat() { + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_inside` + str_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + str_outside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_outside` + + str_inside_ip_cut=`cat /usr/local/etc/pfdcontrol/ip.$str_inside | cut -d "." -f1-3` + + inside_ip=/usr/local/etc/pfdcontrol/ip.$str_inside + inside=/usr/local/etc/pfdcontrol/inside_iface + + outside_ip=/usr/local/etc/pfdcontrol/ip.$str_outside + outside=/usr/local/etc/pfdcontrol/outside_iface + + netmask_in=`cat /usr/local/etc/pfdcontrol/suffix.$str_inside` + netmask_out=`cat /usr/local/etc/pfdcontrol/suffix.$str_outside` + # Pruefungen auf Vorhandensein der Einstellungen Inside/Outside Iface/IP mit Fehelermeldung bei fehlenden Parametern + if [ ! -e $inside ] || [ -z $str_inside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr INTERNES Interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> INSIDE Interface eingeben." 15 50 + menu_nat && exit + elif [ ! -e $inside_ip ] || [ -z $str_inside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_nat && exit + elif [ ! -e $outside ] || [ -z $str_outside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr EXTERNES interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> OUTSIDE Interface eingeben." 15 50 + menu_nat && exit + elif [ ! -e $outside_ip ] || [ -z $str_outside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre EXTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_nat && exit + fi + # Pruefung auf aktives Outside Iface mittels ifconfig + ifconfig $(cat /usr/local/etc/pfdcontrol/outside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Outside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_nat && exit + fi + +chk_iface_status_on # Pruefung und ggf. Aktualisierung der Iface Einstellungen (Globale Function, Skript head) + + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --title "Achtung" --yesno "Sie wollen NAT aktivieren. Sind Sie Sicher?" 8 30 + + case $? in + 0) + ;; + 1) menu_nat && exit + ;; + esac +# Schreiben der NAT (aktiv) Zeile in pf.conf +sed 's/#---nat---/nat on $out_iface from $in_iface_ip to any -> $out_iface/g' /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + + + # Allgemeine Refresh-Funktion von PF Firewall + sysctl net.inet.ip.forwarding=1 + service pf onestop + service pf onestart + echo "" >> /etc/pf.conf + pfctl -f /etc/pf.conf + + dialog --backtitle "PFDialogControl" \ + --title "INFO NAT" --msgbox "NAT ist aktiviert und laeuft auf\n\nInterface: $str_outside --> IP: $str_outside_ip" 10 50 +} +# <- # + +#---Stop NAT--- +# -> Hier kann NAT deaktiviert werden/ ab dann Default Routing Modus (automatisch) +stop_nat() { + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --title "Achtung" --yesno "Sie wollen NAT deaktivieren. Sind Sie Sicher?" 7 38 + + case $? in + 0) + ;; + 1) menu_nat && exit + ;; + esac +# Loesche NAT Zeile aus pf.conf und ersetze durch Such Flag "#---nat---" +sed 's/nat on $out_iface from $in_iface_ip to any -> $out_iface/#---nat---/g' /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + # Default Refresh-Funtion von PF Firewall + sysctl net.inet.ip.forwarding=1 + service pf onestop + service pf onestart + echo "" >> /etc/pf.conf + pfctl -f /etc/pf.conf + + dialog --backtitle "PFDialogControl" \ + --title "INFO NAT" --msgbox "NAT wurde deaktiviert" 7 25 +} +# <- # + + +######################################################################################################################################################## +############################################################################################################### Sektion NAT EIN/AUS #################### + + + +####### Sektion Firewall ############################################################################################################################### +######################################################################################################################################################## + +chk_iface_fw() { + { + echo "XXX"; echo "Aktive NAT Regeln: $(cat /etc/pf.conf | grep "nat on" | wc -l | cut -d " " -f7-9)"; echo "XXX" + echo 1; sleep 0.18; echo 5; sleep 0.18; echo 13; sleep 0.18; echo 12 ; sleep 0.18 + echo 13; sleep 0.18; echo 16; sleep 0.18; echo 20; sleep 0.18; echo 26; sleep 0.18 + echo "XXX"; echo "Gefundene Portweiterleitungen: $(cat /etc/pf.conf | grep "rdr on" | wc -l | cut -d " " -f7-9)"; echo "XXX" + echo 30; sleep 0.18; echo 36; sleep 0.18; echo 40; sleep 0.18; echo 45; sleep 0.18 + echo 47; sleep 0.18; echo 49; sleep 0.18; echo 50; sleep 0.18; echo 55; sleep 0.18 + echo "XXX"; echo "Gefundene Verbindungssperren: $(cat /etc/pf.conf | grep "block in quick" | wc -l | cut -d " " -f7-9)"; echo "XXX" + echo 57; sleep 0.18; echo 60; sleep 0.18; echo 63; sleep 0.18; echo 67; sleep 0.18 + echo 79; sleep 0.18; echo 82; sleep 0.18; echo 86; sleep 0.18; echo 94; sleep 0.18 + echo "XXX"; echo Komplett; echo "XXX" + echo 100; sleep 1 + } | \ + dialog --backtitle "PFDialogControl" --title "Scanne Regelsaetze..." --gauge "" 6 75 0 +} + +#---Firewall--- +# -> Hier der Menu-Kunstruktor fuer das Firewall Menu mittels dialog +menu_fw() { + # Zwei IFs welche mittels "grep und ifconfig" den aktuellen Status der Ifaces Inside/Outside ermitteln und im Menu darstellen + ifconfig $(cat /usr/local/etc/pfdcontrol/outside_iface) | grep inet + if [ "$?" != "0" ]; then + varRUNNING_OUT="Interface INAKTIV!" + else + varRUNNING_OUT="Interface aktiv" + fi + + ifconfig $(cat /usr/local/etc/pfdcontrol/inside_iface) | grep inet + if [ "$?" != "0" ]; then + varRUNNING_IN="Interface INAKTIV" + else + varRUNNING_IN="Interface aktiv" + fi + + while true; do + _holdFW="/usr/local/etc/pfdcontrol/tmp_fw.$$" + + + dialog --backtitle "PFDialogControl" --title "Firewall Einstellungen"\ + --cancel-label "Zurueck" \ + --menu "Willkommen im Firewall Abschnitt. Hier koennen Sie ueber Portweiterleitung angeben ob eine Verbindung von aussen (Internet: Outside Intrface) nach Innen ueber einen definierten Port zu einem im LAN \ +laufenden Computer hergestellt werden soll. Sie koennen aber auch ueber \"Verbindung sperren\" den Port und die Ziel-IP angeben um zu verhindern, dass ein Computer im LAN eine Verbindung dorthin aufbaut.\n\n \ +Status Outside Interface : $varRUNNING_OUT\n \ +Status Inside Interface: $varRUNNING_IN" 22 130 22\ + "Firewall Status" "Ein kleiner Debugging Auszug fuer Profis und der ZEILENFEHLER AUSZUG fuer" \ + "" "die Pruefung von Falscheingaben" \ + "Portweiterleitung EIN" "Geben Sie hier die Daten ein, die von aussen eine Verbindung zu einem Comuter im LAN zulaest" \ + "Portweiterleitung AUS" "Hier koennen Sie aktive Portweiterleitungen deaktivieren" \ + "" "" \ + "Verbindung sperren" "Hier koennen Sie Verbindungen vom LAN ueber devinierte Ports zu anderen Systemen sperren" \ + "Verbindung loesen" "Hier koennen Sie Regeln im Feld \"Verbindung sperren\" wieder aufheben" \ + "" "" \ + "Zurueck" "Zurueck zum Hauptmenu" 2>$_holdFW + + opt=$? + if [ $opt != 0 ]; then dialog --clear; /usr/bin/pfdctl && exit; fi + menuPoint=`cat $_holdFW` + case $menuPoint in + "Firewall Status") status_fw; + ;; + "Portweiterleitung EIN") list_pw; + ;; + "Portweiterleitung AUS") list_pw_stop; + ;; + "Verbindung sperren") list_block; + ;; + "Verbindung loesen") list_block_stop; + ;; + "Zurueck") dialog --clear; /usr/bin/pfdctl && exit; + ;; + esac + done +} +# <- # + +#---Firewall Status--- +# -> Eine einface Statusanzeige fuer Profis mittels "service pf onestatus" und ein Syntax error Ausgabe (5s Ausgabe) mittels "pfctl -f" +status_fw() { + + dialog --backtitle "PFDialogControl"\ + --title "Auszug fuer Profis (Tabellenstatus)" --msgbox "$(service pf onestatus)" 30 42 + + dialog --backtitle "PFDialogControl"\ + --title "Status der Firewall" --msgbox "Aufgrund einer Restriktion von dieser Firewall Version folgt der Zeilenfehler Auszug fuer 5s unten am Bildschirmrand\n\nSollte in diesem Auszug etwas ueber Zeilenfeler \ +und Nummern stehen, muessen Sie sich keine Sorgen ueber ihre Bedeutung machen. Kontrollieren Sie Ihre Regeln, in den Meisten Faellen hat sich hier ein Schreibfehler eingeschlichen." 15 70 + + pfctl -f /etc/pf.conf + sleep 5 + +} +# <- # + +#---Portweiterleitung EIN--- Teil 1/2 +# -> Listing Menu mittels dialog --yesno zu Darstellen der aktiven Portweiterleitungen/ hier werden wieder Pruefung auf Vorhandensein von Configs vollzogen +# Anmerkung: Diese Kommentare gelten auch fuer "list_pw_stop"; "list_block"; "list_block_stop", es wird nur an dieser Stelle kommentiert, da die Functions im Ablauf identisch bis aehnlich sind +list_pw() { + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_inside` + str_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + str_outside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_outside` + + str_inside_ip_cut=`cat /usr/local/etc/pfdcontrol/ip.$str_inside | cut -d "." -f1-3` + + inside_ip=/usr/local/etc/pfdcontrol/ip.$str_inside + inside=/usr/local/etc/pfdcontrol/inside_iface + + outside_ip=/usr/local/etc/pfdcontrol/ip.$str_outside + outside=/usr/local/etc/pfdcontrol/outside_iface + + netmask_in=`cat /usr/local/etc/pfdcontrol/suffix.$str_inside` + netmask_out=`cat /usr/local/etc/pfdcontrol/suffix.$str_outside` + +chk_iface_status_on # Globale Iface-Einstellungen ueberpruefen und ggf. aktualisieren + # Pruefung auf gesetzte Einstellungen bezueglich Inside/Outside Iface/IP + if [ ! -e $inside ] || [ -z $str_inside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr INTERNES Interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> INSIDE Interface eingeben." 15 50 + menu_fw && exit + elif [ ! -e $inside_ip ] || [ -z $str_inside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_fw && exit + elif [ ! -e $outside ] || [ -z $str_outside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr EXTERNES interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> OUTSIDE Interface eingeben." 15 50 + menu_fw && exit + elif [ ! -e $outside_ip ] || [ -z $str_outside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre EXTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_fw && exit + fi + # Pruefung auf wirklich laufendes Outside Iface mittels "ifconfig" und "grep" + ifconfig $(cat /usr/local/etc/pfdcontrol/outside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Outside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_fw && exit + fi + # Pruefung auf wirklich laufendes Inside Iface mittels "ifconfig" und "grep" + ifconfig $(cat /usr/local/etc/pfdcontrol/inside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Inside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_fw && exit + fi +while true; do +cd /usr/local/etc/pfdcontrol/portfor/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb + +list=$(ls /usr/local/etc/pfdcontrol/portfor/) +# Nachfolgende Variablen sind notwendig, um mittels for-Schleife jede Datei in ...../portfor auszulesen und die Regeln in der --yesno Box Darzustellen +for i in $list + do + fname=`head -1 $i` + sport=`head -2 $i | tail -1` + addr=`head -3 $i | tail -1` + dport=`head -4 $i | tail -1` + proto=`head -5 $i | tail -1` + # Darstellung der Regeln nach statischem Muster, wird in tmp-File geschrieben, welches jedesmal geloescht wird + echo "$fname ==> |Ausenwelt| --> |$sport| $(hostname) |$dport| --> $addr ueber Protokoll $proto">> /usr/local/etc/pfdcontrol/tmp_pw_list + echo "" >> /usr/local/etc/pfdcontrol/tmp_pw_list + done + + # Der Titel der --yesno Box, welcher sagt wie eine neue Regelerstellung funktioniert + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --title "Aktive Regeln: Fuer neue auf yes/ja klicken" --yesno "$(cat /usr/local/etc/pfdcontrol/tmp_pw_list)" 30 100 + + case $? in + 0) rm /usr/local/etc/pfdcontrol/tmp_pw_list; input_pw; + ;; + 1) rm /usr/local/etc/pfdcontrol/tmp_pw_list; menu_fw; + ;; + esac +done +cd /usr/local/etc/pfdcontrol/portfor/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb +} +# <- # + +#---Portweiterleitung EIN--- Teil 2/2 +# -> Von oberer Function hierher weitergeleitet. Hier koennen neue Portweiterleitungen definiert werden +input_pw() { +# Die Counter unten lesen aus dem File und erhoehen die Nummer zur Laufzeit der Function. Erst beim erfolgreichen Abschluss wird die Nummer auf die aktuelle Regel gesetzt und bein naechsten Aufruf wieder erhoet +counter=/usr/local/etc/pfdcontrol/counter_pw +counter_str=`cat /usr/local/etc/pfdcontrol/counter_pw` +new_count=$(expr $counter_str + 1) +# Erzeugen der --yesno Box fuer Regeleingabe +tmp_pw_input=/usr/local/etc/pfdcontrol/portfor/Regel_$new_count + dialog --backtitle "PFDialogControl" \ + --form "Bitte Geben Sie die unten verlangten Informationen ein.\n\nRegelname --> Bitte geben Sie einen aussagekraefiten Namen fuer die Regel ein.\ +\n Ein klenes Beispiel waere \"Hans im 2. Stockwerk\"\n\nAussenport --> Port der von aussen Erreichbar sein soll\n\nZieladresse --> Die IP Adresse \ +des Computers im LAN den Sie erreichen wollen\n\nZielport --> Der Port unter dem der Rechner im LAN erreichbar ist\n\nTransportprotokoll --> Geben Sie an ob Ihre \ +Weiterleitung [tcp/udp] nutzt" 30 85 10 \ + "Regelname" 2 20 "" 2 40 25 40 \ + "Aussenport" 4 20 "" 4 40 6 5\ + "Zieladresse" 6 20 "" 6 40 16 15\ + "Zielport" 8 20 "" 8 40 6 5\ + "Transportprotokoll" 10 20 "" 10 40 4 3\ + 2>$tmp_pw_input + + opt=$? + if [ $opt != 0 ]; then rm $tmp_pw_input; list_pw && exit; fi + # Zusammenstellen der eingegebenen Regel zur ueberpruefung/ Aehnlich wie Listing Funktionen (list_pw und list_stop_pw) + fname=`head -1 $tmp_pw_input` + sport=`head -2 $tmp_pw_input | tail -1` + addr=`head -3 $tmp_pw_input | tail -1` + dport=`head -4 $tmp_pw_input | tail -1` + proto=`head -5 $tmp_pw_input | tail -1` + # for-Schleife welche alle Regelnamen in ...../portfor ausliest und auf momentan eingegebenen Regelnamen abgleicht, falls gleich -> Fehlermeldung ung Abbruch + del_block=`ls /usr/local/etc/pfdcontrol/portfor/` + for i in $del_block + do + str_search_filter=`head -1 $i` + if [ "$str_search_filter" = "$fname" ]; then + if [ $(ls /usr/local/etc/pfdcontrol/portfor/$i) != $(ls $tmp_pw_input) ]; then + dialog --title "Regelsatz" \ + --msgbox "Ihr eingegebener Regelname existiert bereits!" 10 20 + rm $tmp_pw_input + list_pw && exit + fi + fi + done + # Simple Pruefung auf abweichendes Subnetz im Iside Bereich/ Nur Warnung kein Abbruch + equal_pw=$(cat /usr/local/etc/pfdcontrol/ip.`cat /usr/local/etc/pfdcontrol/inside_iface` | cut -d "." -f1-3) + equal_pw_input=$(head -3 $tmp_pw_input | tail -1 | cut -d "." -f1-3) + + if [ "$(echo $equal_pw)" != "$(echo $equal_pw_input)" ]; then + dialog --title "WARNUNG" \ + --yesno "Die von Ihnen eingegebene LAN IP - Adresse scheint sich nicht im gleichen Subnetz zu befinden wie Ihr Inside Interface.\n\nSind Sie sich sicher mit Ihrer Eingabe?" 10 90 + + case $? in + 0) + ;; + 1) rm $tmp_pw_input; list_pw && exit; + ;; + esac + fi + + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_inside` + str_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + str_outside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_outside` + + str_inside_ip_cut=`cat /usr/local/etc/pfdcontrol/ip.$str_inside | cut -d "." -f1-3` + + inside_ip=/usr/local/etc/pfdcontrol/ip.$str_inside + inside=/usr/local/etc/pfdcontrol/inside_iface + + outside_ip=/usr/local/etc/pfdcontrol/ip.$str_outside + outside=/usr/local/etc/pfdcontrol/outside_iface + + netmask_in=`cat /usr/local/etc/pfdcontrol/suffix.$str_inside` + netmask_out=`cat /usr/local/etc/pfdcontrol/suffix.$str_outside` + # Pruefung auf Vorhandensein der Inside/Outside Iface/IP von PFDialogControl/ Bei Fehleren Abbruch mit Warnung und Korrekturhinweis + if [ ! -e $inside ] || [ -z $str_inside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr INTERNES Interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> INSIDE Interface eingeben." 15 50 + rm $tmp_pw_input + menu_fw && exit + elif [ ! -e $inside_ip ] || [ -z $str_inside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + rm $tmp_pw_input + menu_fw && exit + elif [ ! -e $outside ] || [ -z $str_outside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr EXTERNES interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> OUTSIDE Interface eingeben." 15 50 + rm $tmp_pw_input + menu_fw && exit + elif [ ! -e $outside_ip ] || [ -z $str_outside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre EXTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + rm $tmp_pw_input + menu_fw && exit + fi + # Pruefung auf Vorhandensein von noetigen Eingaben in der Regelerstellung + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + + if [ -z $(head -1 $tmp_pw_input) ]; then # -z allgemein Leereingabepruefung + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie einen Regelnamen ein!" 10 20 + rm $tmp_pw_input + list_pw && exit + elif [ -z $(head -2 $tmp_pw_input | tail -1) ] || [ $(head -2 $tmp_pw_input | tail -1) -gt "65535" ]; then # Aussenport Leereingabe und zu hohe Eingabe abfangen + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie das Aussenport Feld ein!" 10 20 + rm $tmp_pw_input + list_pw && exit + elif [ -z $(head -3 $tmp_pw_input | tail -1) ]; then # Abfangen Leereingabe IP Feld + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie das IP Feld ein!" 10 20 + rm $tmp_pw_input + list_pw && exit + elif [ -z $(head -4 $tmp_pw_input | tail -1) ] || [ $(head -4 $tmp_pw_input | tail -1) -gt "65535" ]; then # Aussenport Leereingabe und zu hohe Eingabe abfangen + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie das Zielport Feld ein!" 10 20 + rm $tmp_pw_input + list_pw && exit + elif [ -z $(head -5 $tmp_pw_input | tail -1) ]; then # Abfangen Leereingabe Transportprotokoll + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie das Transportprotokoll Feld ein!" 10 30 + rm $tmp_pw_input + list_pw && exit + elif [ $(head -5 $tmp_pw_input | tail -1) != tcp ] && [ $(head -5 $tmp_pw_input | tail -1) != udp ]; then # Abfangen falscher Text (nur tcp oder udp) + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie das Transportprotokoll Feld korrekt ein!" 10 30 + rm $tmp_pw_input + list_pw && exit + else + dialog --title "Regelsatz" \ + --yesno "Die Regel Lautet wie folgt:\n\n|Ausenwelt| --> |$sport| $(hostname) |$dport| --> $addr ueber Protokoll $proto\n\n\nBitte ueberpruefen Sie die Regel auf Korrektheit.\n\nIst alles OK?" 15 90 + + case $? in + 0) + ;; + 1) rm $tmp_pw_input; list_pw && exit; + ;; + esac + fi + # Zusammenstellen der Regel zur Kontrolle + fname=`head -1 $tmp_pw_input` + sport=`head -2 $tmp_pw_input | tail -1` + addr=`head -3 $tmp_pw_input | tail -1` + dport=`head -4 $tmp_pw_input | tail -1` + proto=`head -5 $tmp_pw_input | tail -1` + + gsed "s/#---REGEL---/rdr on \$out_iface proto\ $proto from any to any port $sport -> $addr port $dport # Regel--$fname--\n#---REGEL---/" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + # Refresh PF Firewall + sysctl net.inet.ip.forwarding=1 + service pf onestop + service pf onestart + echo "" >> /etc/pf.conf + pfctl -f /etc/pf.conf + # Wenn alles bis hier OK wird Counter auf gleichen Wert gesetzt wie aktuelle Regel + expr $counter_str + 1 > $counter + +cd /usr/local/etc/pfdcontrol/portfor/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb +} +# <- # + +#---Portweiterleitung AUS--- Teil 1/2 +# -> Listing Menu mittels dialog --yesno zu Darstellen der aktiven Portweiterleitungen/ hier werden wieder Pruefung auf Vorhandensein von Configs vollzogen +# Anmerkung: Fuer Kommentare siehe Vergleich "list_pw", ist im Ablauf identisch +list_pw_stop() { + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_inside` + str_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + str_outside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_outside` + + str_inside_ip_cut=`cat /usr/local/etc/pfdcontrol/ip.$str_inside | cut -d "." -f1-3` + + inside_ip=/usr/local/etc/pfdcontrol/ip.$str_inside + inside=/usr/local/etc/pfdcontrol/inside_iface + + outside_ip=/usr/local/etc/pfdcontrol/ip.$str_outside + outside=/usr/local/etc/pfdcontrol/outside_iface + + netmask_in=`cat /usr/local/etc/pfdcontrol/suffix.$str_inside` + netmask_out=`cat /usr/local/etc/pfdcontrol/suffix.$str_outside` + +chk_iface_status_on + + if [ ! -e $inside ] || [ -z $str_inside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr INTERNES Interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> INSIDE Interface eingeben." 15 50 + menu_fw && exit + elif [ ! -e $inside_ip ] || [ -z $str_inside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_fw && exit + elif [ ! -e $outside ] || [ -z $str_outside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr EXTERNES interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> OUTSIDE Interface eingeben." 15 50 + menu_fw && exit + elif [ ! -e $outside_ip ] || [ -z $str_outside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre EXTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_fw && exit + fi + ifconfig $(cat /usr/local/etc/pfdcontrol/outside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Outside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_fw && exit + fi + ifconfig $(cat /usr/local/etc/pfdcontrol/inside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Inside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_fw && exit + fi + +while true; do +cd /usr/local/etc/pfdcontrol/portfor/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb + + +list_stop=$(ls /usr/local/etc/pfdcontrol/portfor/) + +for i in $list_stop + do + fname=`head -1 $i` + sport=`head -2 $i | tail -1` + addr=`head -3 $i | tail -1` + dport=`head -4 $i | tail -1` + proto=`head -5 $i | tail -1` + + echo "$fname ==> |Ausenwelt| --> |$sport| $(hostname) |$dport| --> $addr ueber Protokoll $proto">> /usr/local/etc/pfdcontrol/tmp_pw_list_stop + echo "" >> /usr/local/etc/pfdcontrol/tmp_pw_list_stop + done + + list=$(ls /usr/local/etc/pfdcontrol/portfor/) + + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --title "Aktive Regeln: Zum loeschen auf yes/ja klicken" --yesno "$(cat /usr/local/etc/pfdcontrol/tmp_pw_list_stop)" 30 100 + + case $? in + 0) rm /usr/local/etc/pfdcontrol/tmp_pw_list_stop; delete_pw; + ;; + 1) rm /usr/local/etc/pfdcontrol/tmp_pw_list_stop; menu_fw; + ;; + esac +done +cd /usr/local/etc/pfdcontrol/portfor/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb +} +# <- # + +#---Portweiterleitung AUS--- Teil 2/2 +# -> Mit dieser Function kann eine bestehende Portweiterleitung wieder geloescht werden +delete_pw() { + cd /usr/local/etc/pfdcontrol/portfor/ + del_input=/usr/local/etc/pfdcontrol/tmp_pw_del.$$ # Hier wird der eingegebene Regelname Gespeichert + del_str=`cat $del_input` + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie den Namen der Regel ein die Sie Loeschen moechten." 8 40 2>$del_input + + opt=$? + if [ $opt != 0 ]; then list_pw_stop; dialog --clear; fi + + if [ -z $(cat $del_input) ]; then # Pruefung auf Leereingabe + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" \ + --msgbox "Bitte geben Sie einen Regelnamen ein!" 8 40 + list_pw_stop && exit + fi + # Hier wird wieder mittels for-Schleife alles aus ...../portfor ausgelesen und der passende Name in der IF zum loeschen freigegeben, wenn er existiert wird Variable + # chk_input_name_pw auf den Wert 5 gesetzt um die IF Warnung zu umgehen + del_pw=`ls /usr/local/etc/pfdcontrol/portfor/` + chk_input_name_pw=10 + for i in $del_pw + do + str_search_pw=`head -1 $i` + if [ "$str_search_pw" = "$(cat $del_input)" ]; then + dialog --backtitle "PFDialogControl"\ + --title "Regel LOESCHEN!" --yesno "Sind Sie sicher, dass Sie $(cat $del_input) loeschen moechten?" 8 40 + case $? in + 0) + ;; + 1) list_pw_stop && exit; + ;; + esac + chk_input_name_pw=5 + fi + done + if [ $chk_input_name_pw = "10" ]; then # Falls Name nicht existiert bleibt chk_input_name = 10 und hier wird eine Wanrnung erzeugt und abgebrochen + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" \ + --msgbox "Der von Ihnen eingegebene Regelname existiert nicht. Bitte ueberpruefen Sie Ihre Eingabe." 8 40 + list_pw_stop && exit + fi + # Hier wird die Regel aus pf.conf mittels "sed" geloescht + sed "/Regel--$(cat $del_input)--/d" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + # Hier wird alles aus ..../portfor ausgelesen und mittels "head" und "tail" nach dem File mit dem engegebenen Namen gesucht um es zu loeschen + del_pw=`ls /usr/local/etc/pfdcontrol/portfor/` + for i in $del_pw + do + str_search_pw=`head -1 $i` + if [ "$str_search_pw" = "$(cat $del_input)" ]; then + rm $i + fi + done + # PF Refresher + sysctl net.inet.ip.forwarding=1 + service pf onestop + service pf onestart + echo "" >> /etc/pf.conf + pfctl -f /etc/pf.conf + +cd /usr/local/etc/pfdcontrol/portfor/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb +} +# <- # + +#---Verbindung sperren--- Teil 1/2 +# -> Listing Menu mittels dialog --yesno zu Darstellen der aktiven Verbindungssperren/ hier werden wieder Pruefung auf Vorhandensein von Configs vollzogen +# Anmerkung: Fuer Kommentare siehe Vergleich "list_pw", ist im Ablauf identisch, die Darstellung in der Box weicht von der Formatierung ab +list_block() { + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_inside` + str_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + str_outside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_outside` + + str_inside_ip_cut=`cat /usr/local/etc/pfdcontrol/ip.$str_inside | cut -d "." -f1-3` + + inside_ip=/usr/local/etc/pfdcontrol/ip.$str_inside + inside=/usr/local/etc/pfdcontrol/inside_iface + + outside_ip=/usr/local/etc/pfdcontrol/ip.$str_outside + outside=/usr/local/etc/pfdcontrol/outside_iface + + netmask_in=`cat /usr/local/etc/pfdcontrol/suffix.$str_inside` + netmask_out=`cat /usr/local/etc/pfdcontrol/suffix.$str_outside` + +chk_iface_status_on + + if [ ! -e $inside ] || [ -z $str_inside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr INTERNES Interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> INSIDE Interface eingeben." 15 50 + menu_fw && exit + elif [ ! -e $inside_ip ] || [ -z $str_inside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_fw && exit + elif [ ! -e $outside ] || [ -z $str_outside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr EXTERNES interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> OUTSIDE Interface eingeben." 15 50 + menu_fw && exit + elif [ ! -e $outside_ip ] || [ -z $str_outside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre EXTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_fw && exit + fi + ifconfig $(cat /usr/local/etc/pfdcontrol/outside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Outside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_fw && exit + fi + ifconfig $(cat /usr/local/etc/pfdcontrol/inside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Inside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_fw && exit + fi + +while true; do +cd /usr/local/etc/pfdcontrol/block/ + +list_block=$(ls /usr/local/etc/pfdcontrol/block/) + +for i in $list_block + do + bname=`head -1 $i` + sip=`head -2 $i | tail -1` + sport=`head -3 $i | tail -1` + proto=`head -4 $i | tail -1` + tip=`head -5 $i | tail -1` + + echo "$bname ==> |$tip| X <-- ueber $sport und Protokoll $proto <-- $sip" >> /usr/local/etc/pfdcontrol/tmp_block_list + echo "" >> /usr/local/etc/pfdcontrol/tmp_block_list + done + + + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --title "Aktive Regeln: Fuer neue auf yes/ja klicken" --yesno "$(cat /usr/local/etc/pfdcontrol/tmp_block_list)" 30 100 + + case $? in + 0) rm /usr/local/etc/pfdcontrol/tmp_block_list; input_block; + ;; + 1) rm /usr/local/etc/pfdcontrol/tmp_block_list; menu_fw; + ;; + esac +done +cd /usr/local/etc/pfdcontrol/block/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb +} +# <- # + +#---Verbindung sperren--- Teil 2/2 +# -> Hier kann eine Verbindung gesperrt werden +# Anmerkung: Vom Ablauf her entspricht diese Funktion der von "Portweiterleitung EIN Teil 2/2". Es erden nur die Unterschiede kommentiert. -> GENUTZTES Flag um Unterschied zu markieren = UNTERSCHIED-> +input_block() { +counter=/usr/local/etc/pfdcontrol/counter_block +counter_str=`cat /usr/local/etc/pfdcontrol/counter_block` +new_count=$(expr $counter_str + 1) + +tmp_block_input=/usr/local/etc/pfdcontrol/block/Filter_$new_count + dialog --backtitle "PFDialogControl" \ + --form "Bitte Geben Sie die unten verlangten Informationen ein.\n\nRegelname --> Bitte geben Sie einen aussagekraefiten Namen fuer die Regel ein.\ +\n Ein klenes Beispiel waere \"Hans im 2. Stockwerk\"\n\nLokale IP --> Bitte geben Sie die IP Adresse des Computers im LAN ein\n\nZu sperrender Port \ +--> Der Port von dem aus der Computer im LAN nicht mehr kommunizieren darf.\n\ +\nTransportprotokoll --> Geben Sie an ob Ihre Weiterleitung [tcp/udp] nutzt\n\nZu Sperrende IP --> Geben Sie die IP Adresse ein die nicht mehr erreicht werden darf \ +ODER \"any\"\n wenn alle Verbindungen fuer diesen Port gesperrt werden sollen." 30 100 10 \ + "Regel Name" 2 20 "" 2 40 25 40\ + "Lokale IP" 4 20 "" 4 40 16 15\ + "Zu sperrender Port" 6 20 "" 6 40 6 5\ + "Transportprotokoll" 8 20 "" 8 40 4 3\ + "Zu sperrende IP" 10 20 "" 10 40 16 15\ + 2>$tmp_block_input + + opt=$? + if [ $opt != 0 ]; then rm $tmp_block_input; list_block && exit; fi + + bname=`head -1 $tmp_block_input` + sip=`head -2 $tmp_block_input | tail -1` + sport=`head -3 $tmp_block_input | tail -1` + proto=`head -4 $tmp_block_input | tail -1` + tip=`head -5 $tmp_block_input | tail -1` + + del_block=`ls /usr/local/etc/pfdcontrol/block` + for i in $del_block + do + str_search_block=`head -1 $i` + if [ "$str_search_block" = "$bname" ]; then + if [ $(ls /usr/local/etc/pfdcontrol/block/$i) != $(ls $tmp_block_input) ]; then # ACHTUNG Ueberarbeiten (!=) + dialog --title "Regelsatz" \ + --msgbox "Ihr eingegebener Regelname existiert bereits!" 10 20 + rm $tmp_block_input + list_block && exit + fi + fi + done + + equal_block=$(cat /usr/local/etc/pfdcontrol/ip.`cat /usr/local/etc/pfdcontrol/inside_iface` | cut -d "." -f1-3) + equal_block_input=$(head -2 $tmp_block_input | tail -1 | cut -d "." -f1-3) + + if [ "$(echo $equal_block)" != "$(echo $equal_block_input)" ]; then + dialog --title "WARNUNG" \ + --yesno "Die von Ihnen eingegebene LAN IP - Adresse scheint sich nicht im gleichen Subnetz zu befinden wie Ihr Inside Interface.\n\nSind Sie sich sicher mit Ihrer Eingabe?" 10 90 + + case $? in + 0) + ;; + 1) rm $tmp_block_input; list_block && exit; + ;; + esac + fi + + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_inside` + str_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + str_outside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_outside` + + str_inside_ip_cut=`cat /usr/local/etc/pfdcontrol/ip.$str_inside | cut -d "." -f1-3` + + inside_ip=/usr/local/etc/pfdcontrol/ip.$str_inside + inside=/usr/local/etc/pfdcontrol/inside_iface + + outside_ip=/usr/local/etc/pfdcontrol/ip.$str_outside + outside=/usr/local/etc/pfdcontrol/outside_iface + + netmask_in=`cat /usr/local/etc/pfdcontrol/suffix.$str_inside` + netmask_out=`cat /usr/local/etc/pfdcontrol/suffix.$str_outside` + + if [ ! -e $inside ] || [ -z $str_inside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr INTERNES Interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> INSIDE Interface eingeben." 15 50 + rm $tmp_block_input + menu_fw && exit + elif [ ! -e $inside_ip ] || [ -z $str_inside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + rm $tmp_block_input + menu_fw && exit + elif [ ! -e $outside ] || [ -z $str_outside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr EXTERNES interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> OUTSIDE Interface eingeben." 15 50 + rm $tmp_block_input + menu_fw && exit + elif [ ! -e $outside_ip ] || [ -z $str_outside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre EXTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + rm $tmp_block_input + menu_fw && exit + fi + + # UNTERSCHIED-> Anstelle des Feldes "Aussenport" kommt das Feld Externe IP ins Spiel + if [ -z $(head -1 $tmp_block_input) ]; then + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie einen Regelnamen ein!" 10 20 + rm $tmp_block_input + list_block && exit + elif [ -z $(head -2 $tmp_block_input | tail -1) ]; then + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie die LAN IP Adresse ein!" 10 20 + rm $tmp_block_input + list_block && exit + elif [ -z $(head -3 $tmp_block_input | tail -1) ] || [ $(head -3 $tmp_block_input | tail -1) -gt "65535" ]; then + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie den zu sperrenden Port ein!" 10 20 + rm $tmp_block_input + list_block && exit + elif [ -z $(head -5 $tmp_block_input | tail -1) ]; then + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie die Zieladresse ein oder sperren Sie alles mit \"any\"" 10 20 + rm $tmp_block_input + list_block && exit + elif [ -z $(head -4 $tmp_block_input | tail -1) ]; then + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie das Transportprotokoll ein!" 10 30 + rm $tmp_block_input + list_block && exit + elif [ $(head -4 $tmp_block_input | tail -1) != tcp ] && [ $(head -4 $tmp_block_input | tail -1) != udp ]; then + dialog --title "Regelsatz" \ + --msgbox "Bitte tragen Sie das Transportprotokoll ein!" 10 30 + rm $tmp_block_input + list_block && exit + else + dialog --title "Regelsatz" \ + --yesno "Gesperrt wurde folgende Verbindung:\n\n|$tip| X <-- ueber $sport und Protokoll $proto <-- $sip\n\n\nBitte ueberpruefen Sie die Regel auf Korrektheit.\n\nIst alles OK?" 15 90 + + case $? in + 0) + ;; + 1) rm $tmp_block_input; list_block && exit; + ;; + esac + fi + # Die hier ermittelten Felder weichen leicht von "Portweiterleitung EIN" ab (neu: Externe IP/ nicht mehr: Aussenport) + bname=`head -1 $tmp_block_input` + sip=`head -2 $tmp_block_input | tail -1` + sport=`head -3 $tmp_block_input | tail -1` + proto=`head -4 $tmp_block_input | tail -1` + tip=`head -5 $tmp_block_input | tail -1` + # Hier wird die Zeile in pf.conf geschrieben + gsed "s/#---FILTER---/block in quick on \$in_iface\ proto $proto from $sip to $tip port { $sport } # Filter--$bname--\n#---FILTER---/" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + # PF Refresher + sysctl net.inet.ip.forwarding=1 + service pf onestop + service pf onestart + echo "" >> /etc/pf.conf + pfctl -f /etc/pf.conf + # Counter funktionier wie in "Portweiterleitung EIN" + expr $counter_str + 1 > $counter + + cd /usr/local/etc/pfdcontrol/block/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb +} +# <- # + +#---Verbindung loesen--- Teil 1/2 +# -> Listing Menu mittels dialog --yesno zu Darstellen der aktiven Verbindungssperren/ hier werden wieder Pruefung auf Vorhandensein von Configs vollzogen +# Anmerkung: Fuer Kommentare siehe Vergleich "list_pw", ist im Ablauf identisch, die Darstellung in der Box weicht von der Formatierung ab +list_block_stop() { + str_inside=`cat /usr/local/etc/pfdcontrol/inside_iface` + str_inside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_inside` + str_outside=`cat /usr/local/etc/pfdcontrol/outside_iface` + str_outside_ip=`cat /usr/local/etc/pfdcontrol/ip.$str_outside` + + str_inside_ip_cut=`cat /usr/local/etc/pfdcontrol/ip.$str_inside | cut -d "." -f1-3` + + inside_ip=/usr/local/etc/pfdcontrol/ip.$str_inside + inside=/usr/local/etc/pfdcontrol/inside_iface + + outside_ip=/usr/local/etc/pfdcontrol/ip.$str_outside + outside=/usr/local/etc/pfdcontrol/outside_iface + + netmask_in=`cat /usr/local/etc/pfdcontrol/suffix.$str_inside` + netmask_out=`cat /usr/local/etc/pfdcontrol/suffix.$str_outside` + +chk_iface_status_on + + if [ ! -e $inside ] || [ -z $str_inside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr INTERNES Interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> INSIDE Interface eingeben." 15 50 + menu_fw && exit + elif [ ! -e $inside_ip ] || [ -z $str_inside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre INTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_fw && exit + elif [ ! -e $outside ] || [ -z $str_outside ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihr EXTERNES interface ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> OUTSIDE Interface eingeben." 15 50 + menu_fw && exit + elif [ ! -e $outside_ip ] || [ -z $str_outside_ip ];then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Ihre EXTERNE IP Adresse ist nicht gesetzt.\n\nSie koennen dies unter --> Interface Einstellungen --> Interfaces eingeben." 15 50 + menu_fw && exit + fi + ifconfig $(cat /usr/local/etc/pfdcontrol/outside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Outside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_fw && exit + fi + ifconfig $(cat /usr/local/etc/pfdcontrol/inside_iface) | grep inet + if [ "$?" != "0" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" --msgbox "Es schein so, dass Ihr Inside Interface nicht funktioniert!\n\nBitte ueberpruefen Sie das unter --> Interface Einstellungen --> Interfaces." 10 60 + menu_fw && exit + fi + +while true; do +cd /usr/local/etc/pfdcontrol/block/ + +list_stop_block=$(ls /usr/local/etc/pfdcontrol/block/) + +for i in $list_stop_block + do + bname=`head -1 $i` + sip=`head -2 $i | tail -1` + sport=`head -3 $i | tail -1` + proto=`head -4 $i | tail -1` + tip=`head -5 $i | tail -1` + + echo "$bname ==> |$tip| X <-- ueber $sport und Protokoll $proto <-- $sip" >> /usr/local/etc/pfdcontrol/tmp_block_list_stop + echo "" >> /usr/local/etc/pfdcontrol/tmp_block_list_stop + done + + + dialog --backtitle "PFDialogControl"\ + --title "Aktive Regeln: Zum loeschen auf yes/ja klicken" --yesno "$(cat /usr/local/etc/pfdcontrol/tmp_block_list_stop)" 30 100 + + case $? in + 0) rm /usr/local/etc/pfdcontrol/tmp_block_list_stop; delete_block; + ;; + 1) rm /usr/local/etc/pfdcontrol/tmp_block_list_stop; menu_fw; + ;; + esac +done +cd /usr/local/etc/pfdcontrol/block/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb +} +# <- # + +#---Verbindung loesen--- Teil 2/2 +# -> Hier kann eine gesperrte Verbindung wieder befreit werden +# Anmerkung: Vom Ablauf her entspricht diese Funktion der von "Portweiterleitung AUS Teil 2/2". Es erden nur die Unterschiede kommentiert. -> GENUTZTES Flag um Unterschied zu markieren = UNTERSCHIED-> +delete_block() { +cd /usr/local/etc/pfdcontrol/block/ + del_input_block=/usr/local/etc/pfdcontrol/tmp_block_del.$$ + del_str_block=`cat $del_input_block` + dialog --backtitle "PFDialogControl"\ + --cancel-label "Zurueck" \ + --inputbox "Bitte geben Sie den Namen der Regel ein die Sie Loeschen moechten." 10 40 2>$del_input_block + + opt=$? + if [ $opt != 0 ]; then list_block_stop; dialog --clear; fi + + if [ -z $(cat $del_input_block) ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" \ + --msgbox "Bitte geben Sie einen Regelnamen ein!" 8 40 + list_block_stop && exit + fi + + del_block=`ls /usr/local/etc/pfdcontrol/block/` + chk_input_name_fw=10 + for i in $del_block + do + str_search_block=`head -1 $i` + if [ "$str_search_block" = "$(cat $del_input_block)" ]; then + dialog --backtitle "PFDialogControl"\ + --title "Regel LOESCHEN!" --yesno "Sind Sie sicher, dass Sie $(cat $del_input_block) loeschen moechten?" 8 40 + case $? in + 0) + ;; + 1) list_block_stop && exit; + ;; + esac + chk_input_name_fw=5 + fi + done + if [ $chk_input_name_fw = "10" ]; then + dialog --backtitle "PFDialogControl" \ + --title "WARNUNG" \ + --msgbox "Der von Ihnen eingegebene Regelname existiert nicht. Bitte ueberpruefen Sie Ihre Eingabe." 8 40 + list_block_stop && exit + fi + # UNTERSCHIED-> Hiermit wird eine Verbindungssperre aus pf.conf geloescht + sed "/Filter--$(cat $del_input_block)--/d" /etc/pf.conf > /etc/pf.conf.pfdctl && rm /etc/pf.conf && mv /etc/pf.conf.pfdctl /etc/pf.conf + + + del_block=`ls /usr/local/etc/pfdcontrol/block/` + for i in $del_block + do + str_search_block=`head -1 $i` + if [ "$str_search_block" = "$(cat $del_input_block)" ]; then + rm $i + fi + done + # PF Refresher + sysctl net.inet.ip.forwarding=1 + service pf onestop + service pf onestart + echo "" >> /etc/pf.conf + pfctl -f /etc/pf.conf + +cd /usr/local/etc/pfdcontrol/block/ # Diese Anweisung wurde noetig, da Darstellungsfehler in der vierten Ebene einer while-Schleife auftauchten und die Darstellung immer leer blieb + +} +# <- # + + +######################################################################################################################################################## +############################################################################################################### Sektion Firewall ####################### \ No newline at end of file diff --git a/PFDialogControl/pfdialogcontrol-1.0.3/motd b/PFDialogControl/pfdialogcontrol-1.0.3/motd new file mode 100755 index 0000000..ec786a2 --- /dev/null +++ b/PFDialogControl/pfdialogcontrol-1.0.3/motd @@ -0,0 +1,21 @@ + __ ___ __ + ___ / \ / \ / \ + / \--- / / / + /___ // / / / + / / /___ /IALOG/___/ONTROL Release-1.0.3 + +PFDialogControl by Bogdanovic Theodor. Dieser Code untersteht dem +Copyright(c) des Entwicklers. (Hierbei handelt es sich um eine Vor- +diplomarbeit fuer die Hoehere Fachschule Uster, HFU - Fachrichtung +Telekommunikation. Bei Beendigung dieser Arbeit, spaetestens +1. August 2015, wird der Code automatisch und ohne Ankuendigung in +die Standard BSD Lizenz umgewandelt) + +> Fuer eine kleine Anleitung tippen Sie einfach "pfdchelp" +> Um zu PFDialogControl konfigurieren tippen Sie einfach "pfdctl" + +Vergessen Sie nicht sich mittels "su" als "root" anzumelden, falls Sie +es nicht schon sind! + +Viel Spass! + diff --git a/PFDialogControl/pfdialogcontrol-1.0.3/pf.skeleton b/PFDialogControl/pfdialogcontrol-1.0.3/pf.skeleton new file mode 100755 index 0000000..371d298 --- /dev/null +++ b/PFDialogControl/pfdialogcontrol-1.0.3/pf.skeleton @@ -0,0 +1,18 @@ +### Skeleton "pf.conf" modifiziert durch PFDialogControl ### +#---NOTACT--- + + + +### NAT Regel ### + +#---nat--- + + +### RDR Regeln ### + +#---REGEL--- + + +### Block Regeln ### + +#---FILTER--- \ No newline at end of file diff --git a/PFDialogControl/pfdialogcontrol-1.0.3/pfdchelp b/PFDialogControl/pfdialogcontrol-1.0.3/pfdchelp new file mode 100755 index 0000000..3853194 --- /dev/null +++ b/PFDialogControl/pfdialogcontrol-1.0.3/pfdchelp @@ -0,0 +1,80 @@ +#!/bin/sh + +####################################################################### +# Title : PFDialogControl --> Hilfe anzeigen (pfdcthelp) +# Author : Bogdanovic Theodor {t.bogdanovic@hotmail.com} +# Date : 2015-05-05 +# Requires : Shell (sh) +# Category : Dialog Menu zur Steurung von PF Firewall +####################################################################### +# Description +# +# Dieses Skript erzeugt eine kleine Hilfeausgabe in der Shell, um einen +# kleinen Ueberblick ueber PFDialogControl zu verschaffen. +####################################################################### + +clear + +echo "Wie funktioniert diese Software? + +Basierend auf einem FreeBSD 10.0 - 10.1 + +|Inside Interface| <--> |PFDialogControl| <--> |Outside Interface| + ^ ^ + | | + | | + | | +DHCP/DNS mit Autogeneration Verbindung zu Ausenwelt + +(Wenn aktiv muss nichts kon- +figuriert werden. DHCP verteilt +ueber xxx.xxx.xxx.20 - xxx.xxx.xxx.250, +DNS laeft automatisch, Hostname +kann anstelle der IP verwendet werden) + | + | + | +NAT - Network Address Translation + +(wenn aktiv, werden alle Verbindung +ueber |Outside Interface| geleitet. +Wenn inaktiv, laeuft PFDialogControl +im Gateway-Modus. Hierbei muss der +Rest des Netzwerks auch im GW-Modus +betrieben werden) + | + | + | +Firewall - Portweiterleitung / Verbin. sperren + +(Ueber Portweiterleitung kann eine Verbin. +von aussen ins Innere zu einem im LAN laufenden +Computer aufgebaut werden. +Ueber Verbin. sperren kann ein Computer im +LAN nach aussen ueber einen Port gerpert werden. +Die Verbin. kann spezifisch auf eine IP oder +per \"any\" allgemein hin geperrt werden) + + +Wie konfiguriere ich diese Software? + +Im grunde ist alles selbsterklaerend, doch gibt es ein paar Dinge die +beachtet werden muessen. Sie koennen ueberall mit der Konfiguration +beginnen, jedoch verhindern Sicherungen das Starten eines Dienstes +solange nicht saemtliche Punkte im Abschnitt \"Interface Einstellungen\" +gesetzt sind. +Daher wird empfohlen nach dem Top-Down verfahren im Menu zu oberst zu +beginnen und sich durch alle Punkte zu arbeiten. So sollte am Schluss +ein korrekt konfigurierter kleiner Router zur verfuehgung stehen. +Um vergessene Einstellungen muessen Sie sich nicht kuemmern, da +Sicherungen ein starten eines Dienstes im unkonfigurierten Zustand +nicht erlauben. + +Ein kleiner Tipp: +DHCP/DNS und NAT sind dynamisch konfigurierbar. Wenn Sie an den +Interfaces Aenderungen im Betrieb vornehmen, so muessen Sie diese +betreffenden Dienstes lediglich neu starten. Doch die Firewall +Regelsaetze sind statisch und werden nicht mehr stimmen. +Daher gilt der Grundsatz nach einer ersten konfiguration der +Interfaces --> Zuerst denken, dann konfigurieren :)" | more + diff --git a/PFDialogControl/pfdialogcontrol-1.0.3/pfdctl b/PFDialogControl/pfdialogcontrol-1.0.3/pfdctl new file mode 100755 index 0000000..f3fc128 --- /dev/null +++ b/PFDialogControl/pfdialogcontrol-1.0.3/pfdctl @@ -0,0 +1,63 @@ +#!/bin/sh + +####################################################################### +# Title : PFDialogControl (pfdctl) +# Author : Bogdanovic Theodor {t.bogdanovic@hotmail.com} +# Date : 2015-05-05 +# Requires : dialog, Shell (sh), libpfdctl, libchkin12, libnmcalc16 +# Category : Dialog Menu zur Steurung von PF Firewall +####################################################################### +# Description +# +# Dies ist das Main Menu, welches zum Start von PFDialogControl notwendig +# ist. Es stellt lediglich das Hauptmenu dar und besitzt sonst keine +# weiteren Funktionen. +# Anmerkung: +# An Profis, Hardening ist an dieser Stelle noch moeglich (Default +# FreeBSD Rechte). +####################################################################### + +###### Include ######################################################## +. /usr/lib/libpfdctl + + +###### Main Menu ######################################################## + +# -> Ueberpruefung auf Vorhandensein des /etc/pf.con, sonst erstellen aus Skeleton +if [ ! -e /etc/pf.conf ]; then + cp /usr/local/etc/pfdcontrol/skel/pf.skeleton /etc/pf.conf +fi +# <- # +# -> dialog - Konstruktor fuer das Hauptmenu +while true; do +_hold="/usr/local/etc/pfdcontrol/tmp_mm.$$" + +dialog --backtitle "PFDialogControl" --title "Hauptmenu"\ + --cancel-label "ENDE" \ + --menu "Willkommen im Steuermenu von PFDialogControl. Dieses Tool baut auf den Grundlagen eines FreeBSD Systems, dnsmasq und der PF Firewall auf und soll Ihnen helfen einen kleinen, schnell zu konfigurierenden Router aufzubauen. \ +Sie koennen diese Software auf jedem beliebigen System (reale oder virtuelle Hardware) laufen lassen.\n\nBei PFDialogControl handelt es sich um eine Vordiplomarbeit fuer die Hoehere Fachschule \ +Uster (HFU). Entwickelt von Bogdanovic Theodor. PFDialogControl untersteht der gleichen Lizenz wie FreeBSD Version 10 und 10.1, welches es als Grundlage nutzt.\n\nViel Spass!" 21 115 21\ + "Interface Einstellungen" "In diesem Menu koennen Sie Netwerkkonfigurationen vornehmen" \ + "DHCP/DNS Einstellungen" "Hier koennen Sie einstellen wie Ihr Netz mit IPs und Namen umgehen soll" \ + "NAT Einstellungen" "Hier koennen Sie NAT (Network Address Translation) EIN/AUS schalten" \ + "Firewall" "In diesem Untermenu koennen Sie Ihre Firewall steuern" \ + "ENDE" "Abbruch des Programms" 2>$_hold + +opt=$? + if [ $opt != 0 ]; then rm /usr/local/etc/pfdcontrol/tmp_*.*; clear; service pf onestatus; exit; fi + + menuPoint=`cat $_hold` + case $menuPoint in + "Interface Einstellungen") chk_iface_network; menu_network; + ;; + "DHCP/DNS Einstellungen") chk_iface_dnsmasq; menu_dnsmasq; + ;; + "NAT Einstellungen") menu_nat; + ;; + "Firewall") chk_iface_fw; menu_fw; + ;; + "ENDE") rm /usr/local/etc/pfdcontrol/tmp_*.*; clear; service pf onestatus; exit; brake; + ;; + esac +done +# <- # \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..5c22d53 --- /dev/null +++ b/README.txt @@ -0,0 +1,69 @@ +Guten Tag Experte und Betreuer, + +Auf diesem Datentraeger finden Sie folgendes. + +> Dokumentation + | + |-> Docx => Dokumentation im .dockx Format + |-> Pdf => Dokumentation im .pdf Format + +> Formaelles + | + |-> Auftrag + |-> Aufgabenstellung + |-> Betreuungssitzungen + +> Gantt_project + | + |-> Gantt_1 => in den Formaten JPEG, PDF, HTML und Original .gan (Software siehe weiter unten) + |-> Gantt_2 => in den Formaten JPEG, PDF, HTML und Original .gan (Software siehe weiter unten) + |-> Gantt_3 => in den Formaten JPEG, PDF, HTML und Original .gan (Software siehe weiter unten) + +> PFDialogControl + | + |-> pfdialogcontrol-1.0.3 => fertig entpackt und nach dem Kopieren bereit zu installieren mittels ./install + |-> pfdialogcontrol-1.0.3-ZIP => ein mittels gnuzip (gz) erstelltes TAR-Archiv, welches den selben Inhalt wie das enpackte File oben hat + +> Software (fuer Sie, falls noetig) + | + |-> Java + | | + | |-> Editor + | | + | |-> jedit.jar + | + |-> Linux + | | + | |-> Editor + | | | + | | |-> README.txt + | | + | |->Projektplan_Gantt + | | + | |-> ganttproject_2.7.deb + | + |-> MacOS + | | + | |-> Editor + | | | + | | |-> jedit5.2.dmg + | | + | |-> Projekt_Gantt + | | + | |-> ganttproject-2.7.dmg + | + |-> Windows + | + |-> Editor + | | + | |-> jedit5.2.0install.exe + | + |-> Projekt_Gantt + | | + | |-> ganttproject-2.7.exe + | + |-> Putty + | + |-> putty.exe + +