C’est loin d’être fini, mais je vous livre mes règles iptables actuelles, brutes de fonderie (désolé, pas de commentaires, faudra faire le tri vous-mêmes pour le moment). Mais ça peut quand même servir.
Ce qu’on ne voit pas vraiment ici, c’est que c’est généré par un ensemble de scripts plus improbables les uns que les autres, et qu’une fois le firewall en place je peux (pourrai) ajouter/supprimer des services particuliers (ie. des règles iptables) avec une bête commande du genre :fw-service add tcp4 3306 @192.168.1.100
Pour le moment l’ensemble de scripts est encore hyper instable (c’est le moins qu’on puisse dire) donc je préfère bosser encore dessus avant de le publier. Le but est de rendre tout ça entièrement configurable (c’est déjà bien parti à ce niveau là), d’ajouter la gestion IPv6 (ouch), gestion d’IPs multiples couplée à ifconfig, etc etc (le tout à chaud bien sûr, hors de question de recharger l’ensemble des règles à chaque petit changement). Y’a plein d’autres goodies (mode panique qui interdit toute autre connexion que la session SSH qui en a fait la demande, etc) mais ça reste à fignoler.
Quelques remarques :
- le bazar avec LOGDROP-LIMITER et toutes les chaînes LOGDROP-* permet d’une part de limiter globalement (par IP et toutes IPs confondues) la vitesse de remplissage des logs, et d’autre part d’avoir quand même des préfixes différents pour chaque type de problème (et, bien sûr, possibilité de désactiver les logs pour un type donné si besoin est)
- accessoirement, j’utilise ulogd et non pas syslog, ça permet d’avoir un log propre et bien séparé sans bidouillages crado
- le tout, comme je le disais, avec une syntaxe vachement plus attrayante (et simplifiée) que les règles iptables de base
Bref, sans plus attendre, le dump de mon usine à gaz…
Enjoy.
[code]*filter
init/flush-rules IN=DROP OUT=ACCEPT FWD=DROP
-P INPUT DROP
-P OUTPUT ACCEPT
-P FORWARD DROP
-F
-X
init/logdrop (limit 10/10 pkt/sec/source && 10/second burst 100)
-N “LOGDROP-LIMITER”
-A “LOGDROP-LIMITER” -j DROP -m recent --name “LOGDROP-LIMITER” --rcheck --seconds 10 --hitcount 10
-A “LOGDROP-LIMITER” -m recent --name “LOGDROP-LIMITER” --set
-A “LOGDROP-LIMITER” -j RETURN -m limit --limit 10/second --limit-burst 100
-A “LOGDROP-LIMITER” -j DROP
blacklist/init
-N “BLACKLIST”
custom-logdrop LOGDROP-BLACKLIST
-N “LOGDROP-BLACKLIST”
-A “LOGDROP-BLACKLIST” -j “LOGDROP-LIMITER”
-A “LOGDROP-BLACKLIST” -j ULOG --ulog-nlgroup 1 --ulog-prefix "BLACKLIST: "
-A “LOGDROP-BLACKLIST” -j DROP
custom-logdrop LOGDROP-UNMATCHED
-N “LOGDROP-UNMATCHED”
-A “LOGDROP-UNMATCHED” -j “LOGDROP-LIMITER”
-A “LOGDROP-UNMATCHED” -j ULOG --ulog-nlgroup 1 --ulog-prefix "UNMATCHED: "
-A “LOGDROP-UNMATCHED” -j DROP
loopback/accept @INPUT
-A “INPUT” -j ACCEPT -i lo
custom-logdrop LOGDROP-LOCALHOST
-N “LOGDROP-LOCALHOST”
-A “LOGDROP-LOCALHOST” -j “LOGDROP-LIMITER”
-A “LOGDROP-LOCALHOST” -j ULOG --ulog-nlgroup 1 --ulog-prefix "LOCALHOST: "
-A “LOGDROP-LOCALHOST” -j DROP
ipv4/loopback/block-spoofed @INPUT >LOGDROP-LOCALHOST
-A “INPUT” -j “LOGDROP-LOCALHOST” -s 127.0.0.0/8 ! -i lo
-A “INPUT” -j “LOGDROP-LOCALHOST” -d 127.0.0.0/8 ! -i lo
custom-logdrop LOGDROP-INVALID
-N “LOGDROP-INVALID”
-A “LOGDROP-INVALID” -j “LOGDROP-LIMITER”
-A “LOGDROP-INVALID” -j ULOG --ulog-nlgroup 1 --ulog-prefix "INVALID: "
-A “LOGDROP-INVALID” -j DROP
state/block INVALID @INPUT >LOGDROP-INVALID
-A “INPUT” -j “LOGDROP-INVALID” -m state --state INVALID
create-jump @INPUT >TCP -p tcp
-N “TCP”
-A “INPUT” -p tcp -j “TCP”
create-jump @INPUT >UDP -p udp
-N “UDP”
-A “INPUT” -p udp -j “UDP”
create-jump @INPUT >ICMP -p icmp
-N “ICMP”
-A “INPUT” -p icmp -j “ICMP”
custom-logdrop LOGDROP-ALIENPROTOCOL
-N “LOGDROP-ALIENPROTOCOL”
-A “LOGDROP-ALIENPROTOCOL” -j “LOGDROP-LIMITER”
-A “LOGDROP-ALIENPROTOCOL” -j ULOG --ulog-nlgroup 1 --ulog-prefix "ALIEN PROTOCOL: "
-A “LOGDROP-ALIENPROTOCOL” -j DROP
block-unmatched @INPUT >LOGDROP-ALIENPROTOCOL
-A “INPUT” -j “LOGDROP-ALIENPROTOCOL”
custom-logdrop LOGDROP-MALFORMED
-N “LOGDROP-MALFORMED”
-A “LOGDROP-MALFORMED” -j “LOGDROP-LIMITER”
-A “LOGDROP-MALFORMED” -j ULOG --ulog-nlgroup 1 --ulog-prefix "MALFORMED: "
-A “LOGDROP-MALFORMED” -j DROP
ipv4/tcp/block-malformed @TCP >LOGDROP-MALFORMED
-A “TCP” -j “LOGDROP-MALFORMED” -p tcp --tcp-flags ACK,FIN FIN
-A “TCP” -j “LOGDROP-MALFORMED” -p tcp --tcp-flags ACK,PSH PSH
-A “TCP” -j “LOGDROP-MALFORMED” -p tcp --tcp-flags ACK,URG URG
-A “TCP” -j “LOGDROP-MALFORMED” -p tcp --tcp-flags SYN,FIN SYN,FIN
-A “TCP” -j “LOGDROP-MALFORMED” -p tcp --tcp-flags SYN,RST SYN,RST
-A “TCP” -j “LOGDROP-MALFORMED” -p tcp --tcp-flags FIN,RST FIN,RST
-A “TCP” -j “LOGDROP-MALFORMED” -p tcp --tcp-flags ALL NONE
-A “TCP” -j “LOGDROP-MALFORMED” -p tcp --tcp-flags ALL ALL
custom-logdrop LOGDROP-RSTFLOOD
-N “LOGDROP-RSTFLOOD”
-A “LOGDROP-RSTFLOOD” -j “LOGDROP-LIMITER”
-A “LOGDROP-RSTFLOOD” -j ULOG --ulog-nlgroup 1 --ulog-prefix "RST FLOOD: "
-A “LOGDROP-RSTFLOOD” -j DROP
ipv4/tcp/throttle-rst-flood @TCP >LOGDROP-RSTFLOOD (limit 2/1 pkt/sec/source && 50/second burst 100)
-N “TCP-RSTFLOOD”
-A “TCP” -p tcp --tcp-flags RST RST -j “TCP-RSTFLOOD”
-A “TCP-RSTFLOOD” -j “LOGDROP-RSTFLOOD” -m recent --name “TCP-RSTFLOOD” --rcheck --seconds 1 --hitcount 2
-A “TCP-RSTFLOOD” -m recent --name “TCP-RSTFLOOD” --set
-A “TCP-RSTFLOOD” -j ACCEPT -m limit --limit 50/second --limit-burst 100
-A “TCP-RSTFLOOD” -j “LOGDROP-RSTFLOOD”
state/accept ESTABLISHED @TCP
-A “TCP” -j ACCEPT -m state --state ESTABLISHED
custom-logdrop LOGDROP-NOTNEW
-N “LOGDROP-NOTNEW”
-A “LOGDROP-NOTNEW” -j “LOGDROP-LIMITER”
-A “LOGDROP-NOTNEW” -j ULOG --ulog-nlgroup 1 --ulog-prefix "NOT NEW: "
-A “LOGDROP-NOTNEW” -j DROP
state/enforce NEW @TCP >LOGDROP-NOTNEW
-A “TCP” -j “LOGDROP-NOTNEW” -m state ! --state NEW
custom-logdrop LOGDROP-NEW-SYNACK
-N “LOGDROP-NEW-SYNACK”
-A “LOGDROP-NEW-SYNACK” -j “LOGDROP-LIMITER”
-A “LOGDROP-NEW-SYNACK” -j ULOG --ulog-nlgroup 1 --ulog-prefix "NEW SYN+ACK: "
-A “LOGDROP-NEW-SYNACK” -j DROP
ipv4/tcp/new/throttle-syn-ack-rst @TCP >LOGDROP-NEW-SYNACK (limit 1/1 pkt/sec/source)
-N “TCP-NEW-SYNACK”
-A “TCP” -p tcp --tcp-flags SYN,ACK SYN,ACK -j “TCP-NEW-SYNACK”
-A “TCP-NEW-SYNACK” -j “LOGDROP-NEW-SYNACK” -m recent --name “TCP-NEW-SYNACK” --rcheck --seconds 1 --hitcount 1
-A “TCP-NEW-SYNACK” -m recent --name “TCP-NEW-SYNACK” --set
-A “TCP-NEW-SYNACK” -j REJECT --reject-with tcp-reset -p tcp
custom-logdrop LOGDROP-NEW-NOTSYN
-N “LOGDROP-NEW-NOTSYN”
-A “LOGDROP-NEW-NOTSYN” -j “LOGDROP-LIMITER”
-A “LOGDROP-NEW-NOTSYN” -j ULOG --ulog-nlgroup 1 --ulog-prefix "NEW NOT SYN: "
-A “LOGDROP-NEW-NOTSYN” -j DROP
ipv4/tcp/new/block-not-syn @TCP >LOGDROP-NEW-NOTSYN
-A “TCP” -j “LOGDROP-NEW-NOTSYN” -p tcp ! --syn
custom-logdrop LOGDROP-SYNFLOOD
-N “LOGDROP-SYNFLOOD”
-A “LOGDROP-SYNFLOOD” -j “LOGDROP-LIMITER”
-A “LOGDROP-SYNFLOOD” -j ULOG --ulog-nlgroup 1 --ulog-prefix "SYN FLOOD: "
-A “LOGDROP-SYNFLOOD” -j DROP
ipv4/tcp/new/throttle-syn-flood @TCP >LOGDROP-SYNFLOOD (limit 20/1 pkt/sec/source)
-A “TCP” -j “LOGDROP-SYNFLOOD” -m recent --name “TCP-SYNFLOOD” --rcheck --seconds 1 --hitcount 20
-A “TCP” -m recent --name “TCP-SYNFLOOD” --set
blacklist/enforce @TCP
-A “TCP” -j “BLACKLIST”
tcp/ssh-service @TCP
-A “TCP” -j ACCEPT -p tcp --dport 22
tcp/services @TCP
-N “TCP-SERVICES”
-A “TCP” -j “TCP-SERVICES”
block-unmatched @TCP >LOGDROP-UNMATCHED
-A “TCP” -j “LOGDROP-UNMATCHED”
udp/ntp-replies @UDP
-A “UDP” -j ACCEPT -p udp --sport 123 --dport 123 -m state --state ESTABLISHED
udp/dns-replies @UDP
-A “UDP” -j ACCEPT -p udp --sport 53 -m state --state ESTABLISHED
blacklist/enforce @UDP
-A “UDP” -j “BLACKLIST”
udp/services @UDP
-N “UDP-SERVICES”
-A “UDP” -j “UDP-SERVICES”
block-unmatched @UDP >LOGDROP-UNMATCHED
-A “UDP” -j “LOGDROP-UNMATCHED”
custom-logdrop LOGDROP-ICMPFRAG
-N “LOGDROP-ICMPFRAG”
-A “LOGDROP-ICMPFRAG” -j “LOGDROP-LIMITER”
-A “LOGDROP-ICMPFRAG” -j ULOG --ulog-nlgroup 1 --ulog-prefix "ICMP FRAGMENT: "
-A “LOGDROP-ICMPFRAG” -j DROP
ipv4/icmp/block-fragments @ICMP >LOGDROP-ICMPFRAG
-A “ICMP” -j “LOGDROP-ICMPFRAG” -p icmp --fragment
icmp/ping-replies @ICMP
-A “ICMP” -j ACCEPT -p icmp --icmp-type echo-reply -m state --state ESTABLISHED
ipv4/icmp/required-replies @ICMP
-A “ICMP” -j ACCEPT -p icmp --icmp-type time-exceeded -m state --state RELATED
-A “ICMP” -j ACCEPT -p icmp --icmp-type fragmentation-needed -m state --state RELATED
ipv4/icmp/additional-replies @ICMP
-A “ICMP” -j ACCEPT -p icmp --icmp-type network-unreachable -m state --state RELATED
-A “ICMP” -j ACCEPT -p icmp --icmp-type host-unreachable -m state --state RELATED
icmp/ping-whitelist/init
-N “ICMP-PING-WHITELIST”
icmp/ping-whitelist/enforce @ICMP
-A “ICMP” -p icmp --icmp-type echo-request -j “ICMP-PING-WHITELIST”
blacklist/enforce @ICMP
-A “ICMP” -j “BLACKLIST”
custom-logdrop LOGDROP-PINGFLOOD
-N “LOGDROP-PINGFLOOD”
-A “LOGDROP-PINGFLOOD” -j “LOGDROP-LIMITER”
-A “LOGDROP-PINGFLOOD” -j ULOG --ulog-nlgroup 1 --ulog-prefix "PING FLOOD: "
-A “LOGDROP-PINGFLOOD” -j DROP
icmp/block-ping-flood @ICMP >LOGDROP-PINGFLOOD (limit 3/2 pkt/sec/source)
-A “ICMP” -j “LOGDROP-PINGFLOOD” -p icmp --icmp-type echo-request -m recent --name “ICMP-PING-FLOOD” --rcheck --seconds 2 --hitcount 3
-A “ICMP” -p icmp --icmp-type echo-request -m recent --name “ICMP-PING-FLOOD” --set
custom-logdrop LOGDROP-DPINGFLOOD
-N “LOGDROP-DPINGFLOOD”
-A “LOGDROP-DPINGFLOOD” -j “LOGDROP-LIMITER”
-A “LOGDROP-DPINGFLOOD” -j ULOG --ulog-nlgroup 1 --ulog-prefix "DISTRIBUTED PING FLOOD: "
-A “LOGDROP-DPINGFLOOD” -j DROP
icmp/throttle-ping @ICMP >LOGDROP-DPINGFLOOD (limit 100/second burst 150)
-A “ICMP” -j ACCEPT -p icmp --icmp-type echo-request -m limit --limit 100/second --limit-burst 150
-A “ICMP” -j “LOGDROP-DPINGFLOOD” -p icmp --icmp-type echo-request
block-unmatched @ICMP >LOGDROP-UNMATCHED
-A “ICMP” -j “LOGDROP-UNMATCHED”
tout le reste peut s’effectuer dynamiquement une fois le firewall en place
blacklist/reload
-F “BLACKLIST”
-A “BLACKLIST” -j “LOGDROP-BLACKLIST” -s <méchant-pas-beau>
-A “BLACKLIST” -j “LOGDROP-BLACKLIST” -s
tcp/services-reload
-F “TCP-SERVICES”
-A “TCP-SERVICES” -j ACCEPT -p tcp --dport 80
-A “TCP-SERVICES” -p tcp --dport 443
fw-service add tcp4 3306 @
-A “TCP-SERVICES” -p tcp --dport 3306 -s
udp/services-reload
-F “UDP-SERVICES”
-A “UDP-SERVICES” -j ACCEPT -p udp --dport <j’ai-pas-de-service-udp-mais-vous-avez-compris-le-principe>
icmp/ping-whitelist/reload
-F “ICMP-PING-WHITELIST”
-A “ICMP-PING-WHITELIST” -j ACCEPT -s
-A “ICMP-PING-WHITELIST” -j ACCEPT -s
COMMIT[/code]