bash script - iptables block port 25 & 587

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
fulltilt
Beiträge: 1157
Registriert: 03.12.2006 20:10:57

bash script - iptables block port 25 & 587

Beitrag von fulltilt » 20.11.2016 12:05:47

Moin,
ich bastele gerade an einem script welches die Anzahl der Mails im Queue per Cronjob überprüft und eine Benachrichtigung schickt sowie die Ports blockiert wenn z.b. mehr als 1000 Mails im Queue sind ...
Wie kann man das ganze noch verbessern, z.b. das nur einmal eine Benachrichtigung versendet wird und die Doppelaktion mit den 2 Ports ...
ist das so OK wenn ich && verwende?

Code: Alles auswählen

#!/bin/bash
EMAIL="user@example.com"
LIMIT=1000
QVALUE=`find /var/spool/postfix/deferred -type f -print | wc -l`
WARNING="Your mail queue is over $LIMIT, please investigate."
if
[ "$QVALUE" -ge "$LIMIT" ] ; then
echo "Check the Mailqueue!" | mail -s "$WARNING" $EMAIL 
/sbin/iptables -A OUTPUT -p tcp --dport 25 -j REJECT && iptables -A OUTPUT -p tcp --dport 587 -j REJECT
fi
Debian: Testing
Desktop: KDE Plasma 5

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: bash script - iptables block port 25 & 587

Beitrag von eggy » 20.11.2016 12:50:19

Bei dem zweiten iptables fehlt der Pfad. Und je nachdem was Du erreichen willst, ist es bei REJECT Regeln ganz gut statt -A (anfügen) lieber -I (voranstellen) zu nehmen, falls man vorher ne entsprechende ACCEPT Regel drin hatte greift das späte REJECT nicht mehr. Für mehrere Ports in einer Regel gabs auch mal was, schau mal nach multiport in der Manpage von iptables-extensions nach.

Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bash script - iptables block port 25 & 587

Beitrag von heisenberg » 20.11.2016 13:07:50

ich bastele gerade an einem script welches die Anzahl der Mails im Queue per Cronjob überprüft und eine Benachrichtigung schickt sowie die Ports blockiert wenn z.b. mehr als 1000 Mails im Queue sind ...
Hört sich so an, als ob Dein Server evtl. ein Spamproblem hat. Da wäre es vielleicht gut die Konfiguration des Mailservers zu prüfen oder ggf. die auch die Konfiguration und Aktivität Deines Webservers, falls die Mails darüber erzeugt werden.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
fulltilt
Beiträge: 1157
Registriert: 03.12.2006 20:10:57

Re: bash script - iptables block port 25 & 587

Beitrag von fulltilt » 20.11.2016 13:18:15

heisenberg hat geschrieben:
ich bastele gerade an einem script welches die Anzahl der Mails im Queue per Cronjob überprüft und eine Benachrichtigung schickt sowie die Ports blockiert wenn z.b. mehr als 1000 Mails im Queue sind ...
Hört sich so an, als ob Dein Server evtl. ein Spamproblem hat. Da wäre es vielleicht gut die Konfiguration des Mailservers zu prüfen oder ggf. die auch die Konfiguration und Aktivität Deines Webservers, falls die Mails darüber erzeugt werden.
Nee kein Spamproblem, alle Mailserver sind save und werden überwacht ... ist nur ne automatisierte Vorsichtsmassnahme, stört dich etwas daran?
Es sind halt ne Menge Mailkonten drauf und CMS ... solche Probleme treten auf wenn ein Mailkonto wg. unsicheren Passwd gehackt wird oder eine unsichere PHP Anwendung gehackt wurde, hab ich oft genug erlebt :mrgreen:
Debian: Testing
Desktop: KDE Plasma 5

Benutzeravatar
fulltilt
Beiträge: 1157
Registriert: 03.12.2006 20:10:57

Re: bash script - iptables block port 25 & 587

Beitrag von fulltilt » 20.11.2016 13:23:22

hier mal das überarbeitete Script ...
wenn eine Warn Mail gesendet werden soll, wird vorher geprüft ob die Datei mailqsend bereits existiert, wenn nicht wird eine Warnemail versendet.
Falls die Mails unter dem Mail Warn Limit liegen, werden die Ports wieder aufgemacht und die mailqsend wieder entfernt ...

Könnt ihr mal drüberschauen ob es so stimmt?

Code: Alles auswählen

#!/bin/bash
EMAIL="user@example.com"
LIMIT=200  
QVALUE=`find /var/spool/postfix/deferred -type f -print | wc -l`
WARNING="Host1 Mail Queue is over $LIMIT"
if
 [ "$QVALUE" -ge "$LIMIT" && ! -f /root/mailqsend ] ; then
 echo "Host1 - Check the Mailqueue!" | mail -s "$WARNING" $EMAIL && touch /root/mailqsend
fi

LIMIT2=500  
if
 [ "$QVALUE" -ge "$LIMIT2" ] ; then
 /sbin/iptables -I OUTPUT -p tcp --dport 25 -j REJECT && /sbin/iptables -I OUTPUT -p tcp --dport 587 -j REJECT 
fi

if
 [ ! -f "$QVALUE" -ge "$LIMIT" ] ; then
 rm /root/mailqsend && /sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT && /sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 587 -j ACCEPT
fi
Debian: Testing
Desktop: KDE Plasma 5

Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bash script - iptables block port 25 & 587

Beitrag von heisenberg » 20.11.2016 13:54:50

Mich stört da nix dran. Bisher war so etwas nur nicht unbedingt mein Ansatz, was mich dazu veranlasst, darüber nachzudenken, ob ich so eine Massnahme für mich als sinnvoll erachte. Mit der Problematik bin ich auch ganz gut vertraut.

Eine Art automatischer Notstop ist eine Massnahme, die durchaus einen gewissen Sinn hat.

Die Mailqueue überwache ich unter anderem auch. Wenn allerdings 1000 Mails in der Queue sind, dann ist das Kind eigentlich schon in den Brunnen gefallen, weil so viele Mails verzögert werden bzw. abgelehnt werden, weil schon extrem viel Spam(oder auch nicht Spam) versandt wurde. Deswegen habe ich mich dazu entschieden, die Anzahl der verarbeiteten Mails zu überwachen

Meine Massnahmen hier sind:
  • Fail2Ban einsetzen inkl. längerer Sperrzeiten für hartnäckigere Scripte (Google: f2b-loop) gegen BruteForce-Attacken auf den Mailserver
  • Überwachen der Zahlen von gesendeten, verzögerten und abgelehnten Mails mit meinem Monitoring Plugin(postfix processed mails). Das kann man auch ohne das dahinterliegende Monitoringsystem einsetzen.
  • Regelmässiges überwachen der Blacklistings, da ich auch schon Fälle hatte, in der eine relativ geringe Menge an versendeten Spams Störungen verursacht hat. Hier ist ein Script dazu: postfix_rbl. Das Script ist etwas krude, aber es tut seinen Job.
  • pflogsumm.pl ist auch immer ganz hilfreich und mailgraph
Zuletzt geändert von heisenberg am 20.11.2016 13:59:12, insgesamt 1-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
fulltilt
Beiträge: 1157
Registriert: 03.12.2006 20:10:57

Re: bash script - iptables block port 25 & 587

Beitrag von fulltilt » 20.11.2016 13:58:06

heisenberg hat geschrieben: Meine Massnahmen hier sind:
  • Fail2Ban einsetzen inkl. längerer Sperrzeiten für hartnäckigere Scripte (Google: f2b-loop) gegen BruteForce-Attacken auf den Mailserver
  • Überwachen der Zahlen von gesendeten, verzögerten und abgelehnten Mails mit meinem Monitoring Plugin(postfix processed mails). Das kann man auch ohne das dahinterliegende Monitoringsystem einsetzen.
  • Regelmässiges überwachen der Blacklistings, da ich auch schon Fälle hatte, in der eine relativ geringe Menge an versendeten Spams Störungen verursacht hat. Hier ist ein Script dazu: postfix_rbl. Das Script ist etwas krude, aber es tut seinen Job. Es prüft welche IPs von Postfix zum Versand verwendet werden(oder alle) und prüft bei mehreren Aufrufen alle 15 Min die wichtigsten Blacklisten und alle 24 Stunden alle Blacklisten für die betreffenden IPs.
  • pflogsumm.pl ist auch immer ganz hilfreich und mailgraph
Danke, das postfix_rbl Script sieht gut aus :mrgreen:
pflogsumm und mailgraph verwende ich bereits
Debian: Testing
Desktop: KDE Plasma 5

Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bash script - iptables block port 25 & 587

Beitrag von heisenberg » 20.11.2016 14:04:17

Nachtrag

Die veröffentlichte Variante hat das wohl noch nicht drin mit den 15 Min für die wichtigsten Listen und 24 Stunden für alle Blacklisten.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
fulltilt
Beiträge: 1157
Registriert: 03.12.2006 20:10:57

Re: bash script - iptables block port 25 & 587

Beitrag von fulltilt » 20.11.2016 14:13:33

hier nochmal die verbesserte Variante, sollte jetzt klappen :mrgreen:

Code: Alles auswählen

#!/bin/bash
EMAIL="user@example.com"
LIMIT=200  
QVALUE=`find /var/spool/postfix/deferred -type f -print | wc -l`
WARNING="Host1 Mail Queue is over $LIMIT"
if
 [ "$QVALUE" -ge "$LIMIT" ] && [ ! -f /root/mailqsend ] ; then
 echo "Host1 - Check the Mailqueue!" | mail -s "$WARNING" $EMAIL && touch /root/mailqsend
fi

LIMIT2=500  
if
 [ "$QVALUE" -ge "$LIMIT2" ] ; then
 /sbin/iptables -I OUTPUT -p tcp --dport 25 -j REJECT && /sbin/iptables -I OUTPUT -p tcp --dport 587 -j REJECT 
fi

if
[ "$QVALUE" -lt "$LIMIT" ] && [ -f /root/mailqsend ] ; then
 rm /root/mailqsend && /sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT && /sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 587 -j ACCEPT
fi
Debian: Testing
Desktop: KDE Plasma 5

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: bash script - iptables block port 25 & 587

Beitrag von eggy » 20.11.2016 14:27:36

Ich glaub da ist noch nen Problem mit dem was Du erreichen willst gegen das was das Script tut ...
geh ich richtig in der Annahme, dass der letzte Block des Scripts das ganze wieder freischalten soll?

Dann solltest Du lieber -D (Regel entfernen) nehmen, denn was zur Zeit passiert: Die REJECT Regeln bleiben drin, und gelten immer, egal was das Script am Ende noch an ACCEPT angefügt hat. Allerdings ist die richtige Regel finden unter Umständen nicht ganz so einfach, insbesondere falls eh mehrere von Ihnen gibt. Ich würde daher eher ne neue Kette "MAIL" anfügen, alles auf den entsprechenden Ports darein umleiten und dort dann nur eine Regel haben, die kannst Du dann treffsicher mit "iptables --list MAILKETTE --line-numbers" auslesen und deren Zustand gezielt mit -R (glaub ich, schau nochmal in die manpage) ändern.

Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bash script - iptables block port 25 & 587

Beitrag von heisenberg » 20.11.2016 14:36:15

Ich arbeite beim Sperren und wiederaufheben der Sperren von Iptables mit comments. Hier mal ein Beispiel, wie eine Anwendung bei mir aussieht:

Code: Alles auswählen


LOCK_ID=MAILLOCKDOWN
PORTS="25 587"

function lock_ports {

        local PORTS="$1"
        local LOCK_ID="$2"
        RULE_IDS="$( iptables -L INPUT -v -n --line-numbers| grep "$LOCK_ID" | awk '{print $1}' | tac )"
        read -r -a PORTS <<< "$PORTS"
        local PORTLIST=$(IFS=, ; echo "${PORTS[*]}")
        iptables -N LOCKDOWN
        iptables -A LOCKDOWN -p tcp -m multiport -m comment --dports $PORTLIST --comment="$LOCK_ID" -j REJECT
        iptables -I INPUT 1 -p tcp -m comment --comment="$LOCK_ID" -j LOCKDOWN

}

function unlock_ports {
 
        local LOCK_ID="$1"
        RULE_IDS="$( iptables -L INPUT -v -n --line-numbers| grep "$LOCK_ID" | awk '{print $1}' | tac )"
        for RULE in $RULE_IDS;do
            iptables -D INPUT $RULE
        done
        iptables -F LOCKDOWN
        iptables -X LOCKDOWN
}

# sperren
lock_ports "$PORTS" "$LOCK_ID"

# freigeben
unlock_ports "$LOCK_ID"
Zuletzt geändert von heisenberg am 20.11.2016 14:41:25, insgesamt 2-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
fulltilt
Beiträge: 1157
Registriert: 03.12.2006 20:10:57

Re: bash script - iptables block port 25 & 587

Beitrag von fulltilt » 20.11.2016 14:39:38

eggy hat geschrieben:Ich glaub da ist noch nen Problem mit dem was Du erreichen willst gegen das was das Script tut ...
geh ich richtig in der Annahme, dass der letzte Block des Scripts das ganze wieder freischalten soll?
danke eggy, reicht es so aus mit -D oder besser noch die ACCEPT rules anschliessend mit anhängen?

Code: Alles auswählen

#!/bin/bash
EMAIL="user@example.com"
LIMIT=200
QVALUE=`find /var/spool/postfix/deferred -type f -print | wc -l`
WARNING="Host1 Mail Queue is over $LIMIT"
if
 [ "$QVALUE" -ge "$LIMIT" ] && [ ! -f /root/mailqsend ] ; then
 echo "Host1 - Check the Mailqueue!" | mail -s "$WARNING" $EMAIL && touch /root/mailqsend
fi

LIMIT2=1000
if
 [ "$QVALUE" -ge "$LIMIT2" ] ; then
 /sbin/iptables -I OUTPUT -p tcp --dport 25 -j REJECT && /sbin/iptables -I OUTPUT -p tcp --dport 587 -j REJECT 
fi

if
 [ "$QVALUE" -lt "$LIMIT" ] && [ -f /root/mailqsend ] ; then
 rm /root/mailqsend && /sbin/iptables -D OUTPUT -p tcp --dport 25 -j REJECT && /sbin/iptables -D OUTPUT -p tcp --dport 587 -j REJECT
fi
Debian: Testing
Desktop: KDE Plasma 5

Benutzeravatar
fulltilt
Beiträge: 1157
Registriert: 03.12.2006 20:10:57

Re: bash script - iptables block port 25 & 587

Beitrag von fulltilt » 20.11.2016 14:42:15

wow, sehr geil ... werd ich gelich mal testen.
heisenberg hat geschrieben:Ich arbeite beim Sperren und wiederaufheben der Sperren von Iptables mit comments. Hier mal ein Beispiel, wie eine Anwendung bei mir aussieht:

Code: Alles auswählen


LOCK_ID=MAILLOCKDOWN
PORTS="25 587"

function lock_ports {

                local PORTS="$1"
                local LOCK_ID="$2"
                RULE_IDS="$( iptables -L INPUT -v -n --line-numbers| grep "$LOCK_ID" | awk '{print $1}' | tac )"
                read -r -a PORTS <<< "$PORTS"
                local PORTLIST=$(IFS=, ; echo "${PORTS[*]}")
                iptables -N LOCKDOWN
                iptables -A LOCKDOWN -p tcp -m multiport -m comment --dports $PORTLIST --comment="$LOCK_ID" -j REJECT
                iptables -I INPUT 1 -p tcp -m comment --comment="$LOCK_ID" -j LOCKDOWN
        fi
}

function unlock_ports {
        local LOCK_ID="$1"
        RULE_IDS="$( iptables -L INPUT -v -n --line-numbers| grep "$LOCK_ID" | awk '{print $1}' | tac )"
        for RULE in $RULE_IDS;do
            iptables -D INPUT $RULE
        done
        iptables -F LOCKDOWN
        iptables -X LOCKDOWN
}

# sperren
lock_ports "$PORTS" "$LOCK_ID"

# freigeben
unlock_ports "$LOCK_ID"

Debian: Testing
Desktop: KDE Plasma 5

Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bash script - iptables block port 25 & 587

Beitrag von heisenberg » 20.11.2016 14:44:07

Vorsicht, in der zitierten Variante war noch ein Fehler drin, den ich oben nochmal korrigiert habe.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
fulltilt
Beiträge: 1157
Registriert: 03.12.2006 20:10:57

Re: bash script - iptables block port 25 & 587

Beitrag von fulltilt » 20.11.2016 14:47:52

heisenberg hat geschrieben:Vorsicht, in der zitierten Variante war noch ein Fehler drin, den ich oben nochmal korrigiert habe.
TOP, danke dir!
Debian: Testing
Desktop: KDE Plasma 5

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: bash script - iptables block port 25 & 587

Beitrag von eggy » 20.11.2016 14:55:27

Ob du am Ende noch ein ACCEPT brauchst oder nicht hängt von der POLICY ab.
Schau dir mal die Ausgabe von iptables --list -nv --line-numbers an. Ganz grob kannst Du sagen iptables geht immer von oben nach unten durch, der erste Treffer gewinnt (Log targets und co ignorieren wir erstmal), und wenns keinen Treffer gab, dann greift die Policy.

vereinfachtes Beispiel:
INPUT Policy DROP
1. ... -dport 23 -j ACCEPT
2. ... -dport 23 -j DROP

a) Pakete mit dport 23 werden akzeptiert (Regel 1 greift, Regel 2 wird nicht mehr angesehn, Policy ebenfalls nicht)
b) Pakete mit dport 42 werden verworfen (Keine Regel hat gepasst, Policy muss einspringen)

Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bash script - iptables block port 25 & 587

Beitrag von heisenberg » 20.11.2016 15:06:19

eggy hat geschrieben:Ob du am Ende noch ein ACCEPT brauchst oder nicht hängt von der POLICY ab.
Schau dir mal die Ausgabe von iptables --list -nv --line-numbers an. Ganz grob kannst Du sagen iptables geht immer von oben nach unten durch, der erste Treffer gewinnt (Log targets und co ignorieren wir erstmal), und wenns keinen Treffer gab, dann greift die Policy.
WARNUNG Ist die Policy auf Drop, ist alles abgeschaltet, was nicht explizit freigschaltet ist. Das heisst, da ist auch mal ganz schnell der SSH-Zugang weggeschossen und wenn man's brav sofort rebootfest gemacht hat, kommt man nur noch mit dem Rettungssystem/RemoteConsole/Lokaler Konsole dran oder darf neuinstallieren, wenn die Optionen nicht zur Verfügung stehen.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
fulltilt
Beiträge: 1157
Registriert: 03.12.2006 20:10:57

Re: bash script - iptables block port 25 & 587

Beitrag von fulltilt » 20.11.2016 15:26:17

Danke Jungs, hat mir sehr viel weiter geholfen :THX:
Debian: Testing
Desktop: KDE Plasma 5

Antworten