Vraag iptables Tips & Tricks


Ik weet zeker dat Linux-sysadmins heel vertrouwd zijn met iptables, de userland-interface naar de netfilter pakketfilteringskader.

Nu, deze "Vraag" is bedoeld als een Community Wiki voor het verzamelen van verschillende bits-n-stukken van iptables wijsheid. Niets is te gewoon of te obscuur. Plaats alles waarvan u weet dat het anderen kan helpen er het beste van te maken iptables.


57
2018-03-10 14:15


oorsprong




antwoorden:


Witte lijst en zwarte lijst gebruiken met iptables

#!/bin/bash

WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt

#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F

#
## Whitelist
#

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
        echo "Permitting $x..."
        $IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done

#
## Blacklist
#

for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
        echo "Denying $x..."
        $IPTABLES -A INPUT -t filter -s $x -j DROP
done

Script om poorten te openen

#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"

#
## Permitted Ports
#

for port in $ALLOWEDTCP; do
       echo "Accepting port TCP $port..."
       $IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done

for port in $ALLOWEDUDP; do
        echo "Accepting port UDP $port..."
        $IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done

Portscan blokkeren

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

Spoofed / ongeldige pakketten

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

Smurfaanvallen blokkeren

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

ICMP blokkeren (ook bekend als ping)

# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

25



Overweeg een opmerking toe te voegen aan de "vervalste" opmerkingen, zodat minder ervaren gebruikers weten waarom de bronadressen als vervalst worden beschouwd (... bij aankomst op een wan-interface). - 3molo
Goed gesprek :-). Gedaan. - Bart De Vos
Wacht. Is ICMP (aka ping) -regel niet blokkeren overbodig voor Block smurf attack line: iptables -A INPUT -p icmp -m icmp -j DROP? - Stann
ook - hier is de uitleg voor veel items die hier worden beschreven: newartisans.com/2007/09/neat-tricks-with-iptables.html - Stann
Zie het whitelistscript: Theres iptables op regel 8 en dan $IPTABLES later. Is het voldoende om gewoon te gebruiken iptables overal? Anders denk ik dat je zoiets zou moeten toewijzen IPTABLES=/sbin/iptables rechts? - UpTheCreek


Optimaliseer het gebruik van netfilter met ipset

Als je een schrijft lot van vergelijkbare regels op basis van louter IP, poort, of beide, overweeg gebruik ipset om de prestaties van netfilter te optimaliseren.

Bijvoorbeeld:

iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT

Dit betekent dat een pakket met het bronadres van 192.168.251.177 eerst moet worden doorlopen honderden van regels voordat het zijn oordeel over ACCEPT kan krijgen.

Uiteraard zullen ervaren sysadmins de regels opsplitsen per subnet. Maar dat nog steeds betekent honderden regels.

ipset te hulp schieten!

Definieer eerst een IP-set van ipmap type:

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

Vul het dan met de adressen in:

for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done

Vervang tot slot de honderden iptables-regels hierboven met een regel:

iptables -m set --match-set Allowed_Hosts src -j ACCEPT

Wanneer een pakket arriveert, voert netfilter een uit heel snel bitmap zoeken naar broncode van het pakket (src) tegen de Allowed_Hosts IP-instelling. Alle pakketten die afkomstig zijn van 192.168.0.0/16 zullen ervaren worden een regel. En geloof me dat het doorzoeken van een bitmap minstens twee orden van grootte sneller is dan het uitvoeren van honderden iptables-regels controleren.

ipset is niet beperkt tot IP-adressen. Het kan ook overeenkomen op basis van poorten, IP-poort tuple, netwerk / subnet-adressen, IP-MAC-tuple, enzovoort, enzovoort. En het kan voldoen aan die criteria als bron of bestemming of een combinatie van beide (in het geval van tuples).

En tot slot, met ipset u kunt IP-adressen automatisch in blacklists / whitelists plaatsen. Deze zwarte lijsten / whitelists kunnen ook 'verouderen', waardoor automatisch het IP-adres wordt verwijderd nadat een configureerbare hoeveelheid tijd is verstreken.

Raadpleeg alstublieft ipsetmanpagina voor meer details.

ZEER BELANGRIJKE OPMERKING:

Sommige Linux-distributies mogelijk niet hebben 'out-of-the-box'-ondersteuning voor ipset (bijvoorbeeld Ubuntu 10.04 had dit probleem). Op deze systemen is een methode om te installeren ipset van broncode.

In plaats daarvan downloaden ipset's bron van zijn website: http://ipset.netfilter.org/install.html

Als alternatief, als je gebruikt xtables-addons, ipset is opgenomen in de bron: http://xtables-addons.sourceforge.net/


23



Dat is heel jammer, het wordt niet standaard ondersteund door Debian en Ubuntu. Ik dacht dat je een aantal obsessieve distros ging opsommen: / - UpTheCreek
@UpTheCreek Ik heb mijn antwoord bewerkt ... de 'speciale opmerking' was van toepassing tijdens het plaatsen van het antwoord, maar is nu niet meer van toepassing. - pepoluan


Voeg opmerkingen toe aan uw regels:

-m comment --comment "Comments help to read output of iptables -nvL"

21





Blokkeer bekende TCP-aanvallen

Voeg de volgende regels toe, bij voorkeur in -t raw -A PREROUTING

-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP

De aanvallen die geblokkeerd worden zijn respectievelijk:

  • SYN-FIN aanval
  • SYN-RST-aanval
  • X-Mas aanval
  • nmap FIN-scan
  • NULLvlaggen vallen aan
  • ALLflags vallen aan

(voel je vrij om de namen van de aanvallen hierboven te bewerken)


16



De -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP kan worden verwijderd, zoals de -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP zal elk pakket vangen dat het zou kunnen blokkeren. - Ael Ombreglace
Volgens security.stackexchange.com/questions/4603/.... "Het is niet nodig om ongeldige of misvormde pakketten te laten vallen, al deze aanvallen zijn tien jaar oud. De Linux-kernel-ontwikkelaars zijn veel actueler dan jij over welke soorten pakketten geldig zijn en welke niet." Hoe zit het met toekomstige fouten? " , kunnen sommigen beweren. Nou, hoe weet je dat de toekomstige fout in de TCP-handler zal zitten en niet in de iptables TCP-parser? " - Matt
Is dit nog steeds van toepassing? - Vlastimil
@VlastimilBurian theoretisch ze zijn niet langer nodig. Maar het toevoegen van deze set regels vertraagt ​​noch het netwerk noch de CPU-belasting, dus ik zie geen reden om ze niet toe te voegen en te vergeten - pepoluan


NAT inschakelen

  1. echo 1 > /proc/sys/net/ipv4/ip_forward 
  2. /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Stap 1 stelt de kernelparameter in om ip-forwarding toe te staan, stap 2 stelt een iptables-regel in die NAT op interface eth0 mogelijk maakt.


7



Dat zal niet blijvend zijn door een herstart, toch? U moet bewerken /etc/sysctl.conf  net.ipv4.ip_forward = 1. (Veronderstellend Red Hat of derivaat.) - Aaron Copley


ICMP-aanvallen blokkeren

Voeg de volgende regels toe, bij voorkeur in -t raw -A PREROUTING

-p icmp -m u32 ! --u32 "4&0x3FFF=0"   -j DROP
-p icmp -m length --length 1492:65535 -j DROP

De eerste regel blokkeert alle ICMP-pakketten waarvan de "fragmentatievlag" niet 0 is (ICMP zou dit moeten doen nooit gefragmenteerd zijn; ze moeten kleine payloads hebben)

De tweede regel blokkeert te grote niet-gefragmenteerde ICMP-pakketten.


6



Zou dat niet breken MTU Discovery? - Matt
@Matt nee, omdat Path MTU-ontdekking pakketten gebruikt die net zo groot zijn als de Ethernet-payload-grootte, d.w.z. 1500 bytes, waarvan 8 bytes worden gebruikt door de IP-header en ICMP-header. - pepoluan
Bedankt voor de verduidelijking, maar 1492-64k? waarom is dat niet 1500-65k. Ik kan 1492 voor PPPoE maar straight ethernet begrijpen. - Matt
Is dit nog steeds van toepassing? - Vlastimil
@VlastimilBurian Ik zou ja zeggen. Er is nog steeds geen behoefte aan te grote ICMP-pakketten. - pepoluan


gebruik makend van firehol - handige iptables-wikkel

Ik vond het veel intuïtiever dan directe iptables-commando's. Vooral voor mensen met eerdere ervaringen met andere firewalls:

FireHOL is een iptables-firewall   generator die stateful iptables produceert   packet filtering firewalls, op Linux   hosts en routers met een willekeurig aantal   netwerkinterfaces, een willekeurig aantal   routes, een onbeperkt aantal diensten,   een willekeurig aantal complexiteit tussen   variaties van de services (inclusief   positieve en negatieve uitdrukkingen).


4



Ik geef de voorkeur aan Shorewall die actief is ontwikkeld, IPv4 en IPv6 ondersteunt en firewalls voor andere iptables-systemen kan genereren. - BillThor
@BillThor klinkt als een goed hulpmiddel - bedankt - Ophir Yoktan


(uit mijn iptables_tricks.txt bestand, opnieuw gecompileerd van veel plaatsen: P)

Laat iptables 15 seconden wachten tussen nieuwe verbindingen van hetzelfde IP op poort 22 (SSH):

 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

4



Hetzelfde, maar met het tellen van pogingen: -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH  -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP - alexm


IPTABLES videohandleidingen

Aflevering 1 http://www.youtube.com/watch?v=ldB8kDEtTZA&feature=player_embedded

Aflevering 2 http://www.youtube.com/watch?v=aDaEXxRHeXY&feature=related

Laatste aflevering

http://www.youtube.com/watch?v=JojqHKcSxpo&feature=player_embedded

Zal een goed begin zijn voor elke newbie.


3



zeer goede tutorial - Stann


IP-sets opnieuw bezocht

Er is al een antwoord met IP-sets. Het is echter eerder eendimensionaal in die zin dat het zich concentreert op de prestatieverbeteringen ten opzichte van klassieke regels en het feit dat IP-sets het probleem dat men heeft met veel individueel IP-adres dat niet gemakkelijk kan worden uitgedrukt als een subnet in CIDR-notatie, verminderen.

Notatie hieronder gebruikt

Voor ipset Ik zal de door mij gelezen notatie gebruiken ipset restore en geschreven door ipset save.

Overeenkomstig voor iptables (en ip6tables) regels Ik zal de notatie gebruiken als gelezen door iptables-restore en geschreven door iptables-save. Dit zorgt voor een kortere notatie en laat me potentiële IPv4-only markeren (voorafgegaan) -4) of alleen IPv6 (voorafgegaan -6) reglement.

In sommige voorbeelden leiden we de pakketstroom om naar een andere keten. Er wordt aangenomen dat de ketting op dat moment bestaat, dus de lijnen om de kettingen te maken worden niet geproduceerd (noch wordt de tabelnaam genoemd of de opdrachten COMMITop het einde).

Geavanceerde IP-sets

IP-sets kunnen veel meer doen dan werd vermeld in het andere antwoord en je moet zeker de IP-set documentatie lezen (ipset(8)) samen met iptables-extensions(8) in aanvulling op deze korte vermelding hier.

Ik zal me bijvoorbeeld voornamelijk richten op drie settypen: hash:ip, hash:net en list:set, maar er zijn er meer dan die en ze hebben allemaal geldige use-cases.

Je kunt bijvoorbeeld ook matchen poortnummers, niet alleen IP-adressen.

IP-sets opslaan en herstellen zoals met iptables-save en iptables-restore

U kunt declaraties van IP-sets bulksgewijs maken en deze importeren door er een piping in te geven ipset restore. Als u uw opdracht veerkrachtiger wilt maken tegen reeds bestaande items, gebruikt u ipset -exist restore.

Als uw regels in een bestand voorkomen dat wordt genoemd default.set je zou gebruiken:

ipset -exist restore < default.set

Een bestand als dat kan vermeldingen bevatten create sets en naar add ingangen in hen. Maar over het algemeen lijken de meeste opdrachten uit de opdrachtregel een overeenkomstige versie in de bestanden te hebben. Voorbeeld (een set DNS-servers maken):

create dns4 hash:ip family inet
create dns6 hash:ip family inet6
# Google DNS servers
add dns4 8.8.8.8
add dns4 8.8.4.4
add dns6 2001:4860:4860::8888
add dns6 2001:4860:4860::8844

Hier is een set gemaakt voor IPv4 (dns4) en één voor IPv6 (dns6).

Time-outs voor IP-sets

Time-outs in IP-sets kunnen worden ingesteld als een standaard per set en ook per item. Dit is erg handig voor scenario's waarbij u iemand tijdelijk wilt blokkeren (bijvoorbeeld voor poortscannen of een poging om uw SSH-server bruut te forceren).

De manier waarop dit werkt is als volgt (standaard bij het maken van IP-sets):

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800

We komen terug bij deze specifieke sets hieronder en de reden waarom ze zijn ingesteld zoals ze zijn.

Als u uw time-out voor een bepaald IP-adres wilt instellen, kunt u eenvoudigweg zeggen:

add ssh_dynblock4 1.2.3.4 timeout 7200

Om IP 1.2.3.4 gedurende twee uur te blokkeren in plaats van het (ingestelde) standaard half uur.

Als je daarnaar zou kijken ipset save ssh_dynblock4 na een korte tijd zou je iets zien in de trant van:

create ssh_dynblock4 hash:ip family inet hashsize 1024 maxelem 65536 timeout 1800
add ssh_dynblock4 1.2.3.4 timeout 6954

Timeout-restricties

  • time-outs zijn een functie op elke set. Als de set dat niet was aangemaakt met ondersteuning voor time-outs ontvangt u een foutmelding (bijv. Kernel error received: Unknown error -1).
  • time-outs worden gegeven in seconden. Gebruik Bash-rekenkundige uitdrukkingen om bijvoorbeeld van minuten tot seconden te komen. bijv .: sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))

Controleren of een item bestaat in een bepaalde IP-set

Binnen in uw scripts kan het handig zijn om te zien of een item al bestaat. Dit kan worden bereikt met ipset test die als resultaat nul geeft als de invoer bestaat en anders niet als nul. Dus de gebruikelijke controles kunnen in een script worden toegepast:

if ipset test dns4 8.8.8.8; then
  echo "Google DNS is in the set"
fi

In veel gevallen wilt u echter liever de -exist overschakelen naar ipset om het te sturen om niet te klagen over bestaande inzendingen.

Bevat IP-sets van iptables reglement

Dit is naar mijn mening een van de geweldige functies van IP-sets. U kunt niet alleen matchen met de vermeldingen van een IP-set, maar u kunt ook nieuwe items toevoegen aan een bestaande IP-set.

Bijvoorbeeld in dit antwoord op deze vraag heb je:

-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

... met de bedoeling om verbindingspogingen naar SSH (TCP-poort 22) te beperken. De gebruikte module recent houdt recente verbindingspogingen bij. In plaats van de state module, ik geef de voorkeur aan de conntrack module.

# Say on your input chain of the filter table you have
   -A INPUT -i eth+ -p tcp --dport ssh -j SSH
# Then inside the SSH chain you can
# 1. create an entry in the recent list on new connections
   -A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
# 2. check whether 3 connection attempts were made within 2 minutes
#    and if so add or update an entry in the ssh_dynblock4 IP set
-4 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock4 src --exist
-6 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock6 src --exist
# 3. last but not least reject the packets if the source IP is in our
#    IP set
-4 -A SSH -m set --match-set ssh_dynblock4 src -j REJECT
-6 -A SSH -m set --match-set ssh_dynblock6 src -j REJECT

In dit geval stuur ik de stroom door naar de SSH ketting zodanig dat ik mezelf niet hoef te herhalen -p tcp --dport ssh voor elke regel.

Om te herhalen:

  • -m set merken iptables zich ervan bewust dat we schakelaars gebruiken van de set module (die IP-sets verwerkt)
  • --match-set ssh_dynblock4 src vertelt iptablesovereenkomen met de bron (src) adres tegen de benoemde set (ssh_dynblock4)
    • dit komt overeen met sudo ipset test ssh_dynblock4 $IP (waar $IP bevat het bron-IP-adres voor het pakket)
  • -j SET --add-set ssh_dynblock4 src --exist voegt het of voegt het toe bron (src) adres van het pakket in de IP-set ssh_dynblock4. Als er een vermelding bestaat (--exist) het zal eenvoudig worden bijgewerkt.
    • dit komt overeen met sudo ipset -exist add ssh_dynblock4 $IP (waar $IP bevat het bron-IP-adres voor het pakket)

Als u in plaats daarvan het doel / bestemmingsadres wilde vergelijken, zou u gebruiken dst in plaats van src. Raadpleeg de handleiding voor meer opties.

Sets van sets

IP-sets kunnen andere sets bevatten. Als je het artikel tot hier hebt gevolgd, heb je je afgevraagd of het mogelijk is om sets te combineren. En dat is het natuurlijk ook. Voor de IP-sets van bovenaf kunnen we twee gezamenlijke sets maken ssh_dynblock en ssh_loggedon respectievelijk om de IPv4-only en IPv6-sets te bevatten:

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800
# Sets of sets
create ssh_loggedon  list:set
create ssh_dynblock  list:set
# Populate the sets of sets
add ssh_loggedon ssh_loggedon4
add ssh_loggedon ssh_loggedon6
add ssh_dynblock ssh_dynblock4
add ssh_dynblock ssh_dynblock6

En de volgende vraag die in je hoofd zou moeten opduiken, is of dit ons dat toestaat wedstrijd en en IP-sets manipuleren op een IP-versie - agnostische manier.

En het antwoord daarop is een volmondig: JA! (helaas, dit was niet expliciet gedocumenteerd vorige keer dat ik het controleerde)

Daarom kunnen de regels uit de vorige paragraaf herschreven worden om te lezen:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

dat is veel beknopter. En ja, dit is beproefd en getest en werkt als een charme.

Alles bij elkaar: SSH brute-force verdediging

Op mijn servers heb ik een scriptrun als een cron taak die een aantal hostnamen nodig heeft en die naar IP-adressen worden omgezet en vervolgens in de IP-set voor "vertrouwde hosts" wordt ingevoerd. Het idee is dat vertrouwde hosts meer pogingen zullen doen om in te loggen op de server en niet noodzakelijkerwijs worden geblokkeerd voor zo lang als iemand anders.

Omgekeerd heb ik hele landen geblokkeerd om verbinding te maken met mijn SSH-server, met de (potentiële) uitzondering van vertrouwde hosts (dat wil zeggen volgorde van regels is van belang).

Dat blijft echter een oefening voor de lezer. Hier zou ik graag een nette oplossing willen toevoegen die gebruik zal maken van de sets in de ssh_loggedon ingesteld om toe te staan ​​dat aansluitende verbindingspogingen worden doorgegeven en niet aan dezelfde controle worden onderworpen als de andere pakketten.

Het is belangrijk om de standaard time-out van 90 minuten te onthouden ssh_loggedon en 30 minuten voor ssh_dynblock wanneer je kijkt naar het volgende iptables reglement:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m set --match-set ssh_loggedon src -j ACCEPT
-A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

Inmiddels zou je jezelf moeten afvragen hoe het verbindende IP-adres terecht komt in de ssh_loggedon sub-sets. Dus lees verder ...

Bonus: het IP-adres toevoegen waarmee u inlogt tijdens de SSH-aanmelding

Als je hebt geëxperimenteerd met sshrc en vrienden, je hebt van de tekortkomingen gehoord. Maar PAM komt te hulp. Een module met de naam pam_exec.so staat ons toe om een ​​script op te roepen tijdens de SSH-aanmelding op een punt waar we weten dat de gebruiker wordt toegelaten.

In /etc/pam.d/sshd onder de pam_env en pam_selinux ingangen voeg de volgende regel toe:

session    optional     pam_exec.so stdout /path/to/your/script

en zorg ervoor dat je versie van het script (/path/to/your/script hierboven) bestaat en is uitvoerbaar.

PAM gebruikt omgevingsvariabelen om te communiceren wat er aan de hand is, zodat u een eenvoudig script zoals dit kunt gebruiken:

#!/bin/bash
# When called via pam_exec.so ...
SETNAME=ssh_loggedon
if [[ "$PAM_TYPE" == "open_session" ]] && [[ -n "$PAM_RHOST" ]]; then
    [[ "x$PAM_RHOST" != "x${PAM_RHOST//:/}" ]] && SETNAME="${SETNAME}6" || SETNAME="${SETNAME}4"
    ipset -exist add $SETNAME "$PAM_RHOST"
fi

Helaas, de ipset utility lijkt niet de ingebouwde slimmigheid van netfilter te hebben. We moeten dus onderscheid maken tussen IPv4 en IPv6 IP-set bij het toevoegen van onze invoer. Anders ipset gaat ervan uit dat we er nog een willen toevoegen reeks naar de set sets, in plaats van het IP. En natuurlijk is het onwaarschijnlijk dat er een set is met de naam na een IP :)

Dus we controleren het : in het IP-adres en voeg toe 6 naar de ingestelde naam in een dergelijk geval en 4 anders.

Het einde.


3





Een andere GUI die kan worden gebruikt om iptables te configureren is Firewall Builder. Hiermee kunnen gebruikers regelelementen als objecten in een database maken en deze objecten vervolgens slepen en neerzetten in een regelseditor om het gewenste firewallbeleid te maken. De applicatie genereert vervolgens een scriptbestand met alle iptables-commando's die vereist zijn om de regels te implementeren.

In tegenstelling tot sommige andere iptables GUI-oplossingen waarbij u slechts één iptables-configuratie tegelijk kunt beheren, kunt u met Firewall Builder een groot aantal iptables-configuraties allemaal vanuit één applicatie beheren. Firewall Builder werkt onder Linux, Windows en Mac OS X, bestaat al meer dan 10 jaar en heeft duizenden actieve gebruikers over de hele wereld.

Volledige onthulling - Ik ben de mede-oprichter van NetCitadel, het bedrijf dat Firewall Builder ontwikkelt.


2