Portál AbcLinuxu, 7. května 2025 14:43
#!/bin/bash iptables -F iptables -X iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP iptables -N spoofing iptables -A spoofing -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables spoofing: " iptables -A spoofing -s 192.168.0.0/16 -j DROP iptables -A spoofing -s 172.16.0.0/12 -j DROP iptables -A spoofing -s 10.0.0.0/8 -j DROP iptables -N syn_flood iptables -A syn_flood -m limit --limit 1/s --limit-burst 5 -j ACCEPT iptables -A syn_flood -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables syn_flood: " iptables -A syn_flood -p TCP --tcp-flags SYN,ACK SYN,ACK -m conntrack --ctstate NEW -j REJECT --reject-with tcp-reset iptables -A syn_flood -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables syn_flood_drop: " iptables -A syn_flood -j DROP iptables -N ssh-whitelist iptables -A ssh-whitelist -j RETURN iptables -N ssh-blacklist iptables -A ssh-blacklist -m recent --name blacklist --set iptables -A ssh-blacklist -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables ssh-blacklist: " iptables -A ssh-blacklist -j DROP iptables -N ssh iptables -A ssh -j ssh-whitelist iptables -A ssh -m recent --update --name blacklist --seconds 43200 --hitcount 1 -j DROP iptables -A ssh -m recent --set --name short iptables -A ssh -m recent --set --name long iptables -A ssh -m recent --update --name short --seconds 60 --hitcount 5 -j ssh-blacklist iptables -A ssh -m recent --update --name long --seconds 1800 --hitcount 20 -j ssh-blacklist iptables -A ssh -j ACCEPT iptables -N tcp_p iptables -A tcp_p -p TCP --dport 465 -j ACCEPT iptables -A tcp_p -p TCP --dport 993 -j ACCEPT iptables -A tcp_p -p TCP --dport 995 -j ACCEPT iptables -A tcp_p -p TCP --dport 113 -j REJECT iptables -A tcp_p -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A tcp_p -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables tcp_p: " iptables -A tcp_p -p TCP -j DROP iptables -N udp_p iptables -A udp_p -p UDP -d 224.0.0.251 --dport 5353 -j ACCEPT #multicast DNS iptables -A udp_p -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A udp_p -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables udp_p: " iptables -A udp_p -p UDP -j DROP iptables -N icmp_p iptables -A icmp_p -p ICMP --icmp-type echo-request -m limit --limit 2/s --limit-burst 5 -j ACCEPT iptables -A icmp_p -p ICMP --icmp-type 0 -j ACCEPT iptables -A icmp_p -p ICMP --icmp-type 3 -j ACCEPT iptables -A icmp_p -p ICMP --icmp-type 11 -j ACCEPT iptables -A icmp_p -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables icmp_p: " iptables -A icmp_p -p ICMP -j DROP iptables -A INPUT -p ALL -i lo -j ACCEPT iptables -A tcp_p -i eth0 -p TCP --syn -j syn_flood iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ssh iptables -A INPUT -i eth0 -j spoofing iptables -A INPUT -p TCP -j tcp_p iptables -A INPUT -p UDP -j udp_p iptables -A INPUT -p ICMP -j icmp_p
iptables -A tcp_p -i eth0 -p TCP --syn -j syn_flood ... iptables -A syn_flood -p TCP --tcp-flags SYN,ACK SYN,ACK -m conntrack --ctstate NEW -j REJECT --reject-with tcp-reset
Pokud mne paměť neklame, součástí podmínky --syn
je i to, že ACK není nastaven, takže to druhé pravidlo by nemělo mít žádný smysl.
Podobně je zbytečné testovat znovu protokol v chainech tcp_p
, udp_p
a icmp_p
, když do nich stejně posíláte jen pakety s příslušným protokolem.
Také mi nedává smysl to (jediné) pravidlo v ssh-whitelist
: cokoli přidáte za něj, nebude mít žádný efekt; a pokud budete vkládat před něj, tak nebude mít pro změnu žádný efekt tohle pravidlo.
Imho kazdy rozumny ISP resi spoofing rezervovanych rozsahu za tebe a stejne zadne site neforwardujes.
Naopak by bylo dobré u spojení zvenku kontrolovat cílovou adresu, jestli je to ta správná, zejména pokud tam jsou nějací démoni, kteří jsou nakonfigurovaní, aby "poslouchali jen na vnitřním rozhraní / lokální smyčce".
UDP multicast ma skutecne RELATED,ESTABLISHED stav?
Proč? To jsou dvě různá pravidla.
Pokud mne paměť neklame, součástí podmínky --syn je i to, že ACK není nastaven, takže to druhé pravidlo by nemělo mít žádný smysl.
Také mi nedává smysl to (jediné) pravidlo v ssh-whitelist: cokoli přidáte za něj, nebude mít žádný efekt; a pokud budete vkládat před něj, tak nebude mít pro změnu žádný efekt tohle pravidlo.
Udelej ten 'limit burst' globalne na cele rozhrani, usetris 10 pravidel a cele to divadlo kolem filtrovani.
Osobne davam 'connecting tracking' na zacatek..
#!/bin/bash iptables -F iptables -X iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP iptables -N spoofing iptables -A spoofing -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables spoofing: " iptables -A spoofing -s 192.168.0.0/16 -j DROP iptables -A spoofing -s 172.16.0.0/12 -j DROP iptables -A spoofing -s 10.0.0.0/8 -j DROP iptables -N syn_flood iptables -A syn_flood -m limit --limit 1/s --limit-burst 5 -j ACCEPT iptables -A syn_flood -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables syn_flood: " iptables -A syn_flood -j DROP iptables -N ssh-whitelist iptables -A ssh-whitelist -s 1.2.3.4 -j ACCEPT #IP adresu lze podvrhnout iptables -A ssh-whitelist -j RETURN iptables -N ssh-blacklist iptables -A ssh-blacklist -m recent --name blacklist --set iptables -A ssh-blacklist -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables ssh-blacklist: " iptables -A ssh-blacklist -j DROP iptables -N ssh iptables -A ssh -j ssh-whitelist iptables -A ssh -m recent --update --name blacklist --seconds 43200 --hitcount 1 -j DROP iptables -A ssh -m recent --set --name short iptables -A ssh -m recent --set --name long iptables -A ssh -m recent --update --name short --seconds 60 --hitcount 5 -j ssh-blacklist iptables -A ssh -m recent --update --name long --seconds 1800 --hitcount 20 -j ssh-blacklist iptables -A ssh -j ACCEPT iptables -N tcp_p iptables -A tcp_p --dport 465 -j ACCEPT iptables -A tcp_p --dport 993 -j ACCEPT iptables -A tcp_p --dport 995 -j ACCEPT iptables -A tcp_p --dport 113 -j REJECT iptables -A tcp_p -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A tcp_p -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables tcp_p: " iptables -A tcp_p -j DROP iptables -N udp_p iptables -A udp_p -d 224.0.0.251 --dport 5353 -j ACCEPT #multicast DNS iptables -A udp_p -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A udp_p -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables udp_p: " iptables -A udp_p -j DROP iptables -N icmp_p iptables -A icmp_p --icmp-type echo-request -m limit --limit 2/s --limit-burst 5 -j ACCEPT iptables -A icmp_p --icmp-type 0 -j ACCEPT iptables -A icmp_p --icmp-type 3 -j ACCEPT iptables -A icmp_p --icmp-type 11 -j ACCEPT iptables -A icmp_p -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables icmp_p: " iptables -A icmp_p -j DROP iptables -A INPUT -p ALL -i lo -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ssh iptables -A INPUT -p TCP --tcp-flags SYN,ACK SYN,ACK -m conntrack --ctstate NEW -j REJECT --reject-with tcp-reset iptables -A INPUT -i eth0 -p TCP --syn -j syn_flood iptables -A INPUT -i eth0 -j spoofing iptables -A INPUT -p TCP -j tcp_p iptables -A INPUT -p UDP -j udp_p iptables -A INPUT -p ICMP -j icmp_p
iptables -A tcp_p -m state --state ESTABLISHED,RELATED -j ACCEPTTzn. protoze duveruji sestavenym spojenim, dam pravidlo na zacatek, abych urychlil prochazeni paketu firewallem. UDP pakety "zadne" stavy nemaji, tzn. nasledujici pravidlo neni uplne korektni:
iptables -A udp_p -m state --state ESTABLISHED,RELATED -j ACCEPTStejne mi cela ta sarada kolem SSH prijde proste zbytecna, ale asi to proste vidim jinak a jeste jedne veci nerozumim, rikas postovni server, ale nevidim 25, jak to?
iptables -A INPUT --p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT --p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A syn_flood -m limit --limit 1/s --limit-burst 5 -j tcp_p
" kde jsem měl ACCEPT
.#!/bin/bash iptables -F iptables -X iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p ALL -i lo -j ACCEPT iptables -N ssh-whitelist iptables -A ssh-whitelist -s 1.2.3.4 -j ACCEPT iptables -A ssh-whitelist -j RETURN iptables -N ssh-blacklist iptables -A ssh-blacklist -m recent --name blacklist --set iptables -A ssh-blacklist -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables ssh-black: " iptables -A ssh-blacklist -j DROP iptables -N ssh iptables -A ssh -j ssh-whitelist iptables -A ssh -m recent --update --name blacklist --seconds 43200 --hitcount 1 -j DROP iptables -A ssh -m recent --set --name short iptables -A ssh -m recent --set --name long iptables -A ssh -m recent --update --name short --seconds 60 --hitcount 5 -j ssh-blacklist iptables -A ssh -m recent --update --name long --seconds 3600 --hitcount 20 -j ssh-blacklist iptables -A ssh -j ACCEPT iptables -N spoofing iptables -A spoofing -s 192.168.0.0/16 -j DROP iptables -A spoofing -s 172.16.0.0/12 -j DROP iptables -A spoofing -s 10.0.0.0/8 -j DROP iptables -N tcp_p iptables -A tcp_p -p TCP --dport 25 -j ACCEPT iptables -A tcp_p -p TCP --dport 465 -j ACCEPT iptables -A tcp_p -p TCP --dport 993 -j ACCEPT iptables -A tcp_p -p TCP --dport 995 -j ACCEPT iptables -A tcp_p -p TCP --dport 113 -j REJECT iptables -A tcp_p -p TCP --sport 443 -j ACCEPT iptables -A tcp_p -j RETURN iptables -N syn_flood iptables -A syn_flood -m limit --limit 1/s --limit-burst 5 -j tcp_p iptables -A syn_flood -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables syn_flood: " iptables -A syn_flood -j DROP iptables -N udp_p iptables -A udp_p -p UDP -d 224.0.0.251 --dport 5353 -j ACCEPT #multicast DNS iptables -A udp_p -j RETURN iptables -N icmp_p iptables -A icmp_p -p ICMP --icmp-type echo-request -m limit --limit 2/s --limit-burst 5 -j ACCEPT iptables -A icmp_p -p ICMP --icmp-type 0 -j ACCEPT iptables -A icmp_p -p ICMP --icmp-type 3 -j ACCEPT iptables -A icmp_p -p ICMP --icmp-type 11 -j ACCEPT iptables -A icmp_p -j RETURN iptables -A INPUT -p TCP --dport 22 -m state --state NEW -j ssh iptables -A tcp_p -p TCP --tcp-flags SYN,ACK SYN,ACK -m conntrack --ctstate NEW -j REJECT --reject-with tcp-reset #DRDoS" iptables -A tcp_p -i eth0 -p TCP --syn -j syn_flood #vyzaduji venkovni rozhrani iptables -A INPUT -i eth0 -j spoofing #venkovni rozhrani iptables -A INPUT -p TCP -j tcp_p iptables -A INPUT -p UDP -j udp_p iptables -A INPUT -p ICMP -j icmp_p iptables -A INPUT -m limit --limit 1/minute --limit-burst 10 -j LOG --log-prefix "iptables drop: "
Pro pripojeni na SSH z nepredvidatelnych mist mam VPNKolik si navlikas kondomu pri soulozi? Navic SSH potrebuje jednoduche TCP spojeni, to ti pusti ven i v blbem pakistanskem hotelu narozdil od VPN. Uz od prehistorickych dob v minulem tisicleti provozuji na mnoha serverech SSH na vysokych portech (hlavne kvuli tomu, aby mi to nelogovalo automaty) a nemam sebemensi problem.
Je opravdu tak přínosné ušetřit několik pravidel?Velice, samozrejme zalezi na konfiguraci a zatizeni serveru v provozu, ale netfilter je obecne v performance killer. Osobne znam pripady, kdy unload celeho netfilteru dovoli serveru obsluhovat o 50k spojeni za vterinu vice. Opravdu kazde pravidlo skrze ktere paket projde je znat, takze opravdu se vyplati ESTABLISED spojeni povolit hned na zacatku. A pak podle poctu paketu, ktere skrze ne projdou, takze obecne nasledovane asi nestavovymi sluzbami, jako je DNS, pak sluzby s velkym poctem kratkych spojeni (http,smtp) a nakonec veci jako je SSH kde na vterine nesejde. Dal z pohledu bezpecnosti bych Vam doporucil zamyslet se nad tabulkou OUTPUT, hodilo by se zakazat navazovani spojeni jinam nez na povolene/zname sluzby a servery. Zanesnadni to pripadnemu utocnikovy, ktery ovladne nejakou sluzbu, aby zneuzil server ke svym nekalym zamerum (dokud nema roota).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.