Avis sur mon script netfilter/iptables

Tags: #<Tag:0x00007f99424977c0>

Je me suis inscrit pour vous poser la sempiternelle question : est-ce que mon script netfilter/iptables tient la route ?

J’ai un serveur maison fait avec un mini-PC peu gourmand connecté à un routeur grand public d’une marque bien connue derrière une bonne connexion (1000/100 Mbps).
Les services ouverts sur le web sont Apache (site statique), SSH et Deluge, ce sont les trois seuls ports entrants ouverts sur le routeur (redirection vers la machine locale).

Je voulais un bon pare-feu en plus sur le serveur lui-même (serveur qui est avec mes autres machines sur le LAN du routeur), alors j’ai essayé de faire de mon mieux avec netfilter/iptables et j’ai lentement réussi à obtenir un ensemble de règles :

#!/bin/sh

### BEGIN INIT INFO
# Provides:          firewall
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Démarre les règles iptables
# Description:       Charge la configuration du pare-feu iptables
### END INIT INFO

#Réinitialise les règles
iptables -t filter -F
iptables -t filter -X

# Stratégie drop par defaut (pas de forwarding non plus)
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

# Autoriser les connexions déja établies et le loopback (pas les related car vulnérables au packet forging, module state préféré à cstate même si obselete)
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

# ICMP
#Autoriser
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
#Drop les requêtes ping non sollicitées et limiter à 1/s (ne joue que sur le ping tout en gardant les infos ICMP d'intégrité utiles pour IPv4)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m state ! --state ESTABLISHED -j DROP

# SSH (sur port 443, sert aussi pour SFTP, avec une limite anti-DDOS)
/sbin/iptables -N LOGDROP
/sbin/iptables -A LOGDROP -j LOG
/sbin/iptables -A LOGDROP -j DROP
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 443 -i eth0 -m state --state NEW -m recent  --update --seconds 60 --hitcount 4 -j LOGDROP


# DNS (sortant seulement, pas de service DNS sur la machine)
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

# HTTP (Apache et navigation web sur la machine)
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT

# HTTPS (Pour la navigation https sur la machine. Input inactif car déjà ouvert pour le port SSH actuel)
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT

# Deluge (port d'entrée personnalisé, + large plage aléatoire pour connection au nuage de pairs)
iptables -t filter -A OUTPUT -p tcp --dport 1024:65535 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 1024:65535 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 56000 -j ACCEPT

#Module FTP passif (actuellement non utilisé)
#modprobe ip_conntrack_ftp
#modprobe ip_nat_ftp

# FTP (actuellement non utilisé)
#iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
#iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT

#SMTP SSL (exim en smarthost avec Gmail pour les logs)
iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT

# NTP (synchro de l'horloge avec les serveurs de temps internet)
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

#DHCP (Le routeur local attribue une adresse statique par DHCP, évite l'erreur de renouvellement dans les logs du serveur)
iptables -A OUTPUT -p UDP --dport 67:68 -j ACCEPT

#Eviter les DDOS sur le serveur web (pas de log pour éviter la surcharge, srcmask arbitraire pour éviter la surcharge et l'encombrement des règles)
#Limite 50 connexions par masque IP /28
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 28 -j DROP
#Limite requêtes syn 30/s par masque IP /28
iptables -N SYN-LIMIT
iptables -A SYN-LIMIT -m hashlimit --hashlimit 30/second --hashlimit-mode srcip --hashlimit-srcmask 28 --hashlimit-name SYN-LIMIT -j RETURN
iptables -A SYN-LIMIT -j DROP
iptables -I INPUT -p tcp --dport 80 --syn -j SYN-LIMIT

#IPs bannies à la main si nécessaire
#iptables -I INPUT -s IP_Bannies -j DROP

#Réinitialise les règles IPv6
ip6tables -t filter -F
ip6tables -t filter -X

#Stratégie IPv6 drop par defaut
ip6tables -t filter -P INPUT DROP
ip6tables -t filter -P OUTPUT DROP
ip6tables -t filter -P FORWARD DROP

#Autoriser loopback IPv6
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT

En bon noob qui touche du Debian depuis trois ans à petite dose, j’ai vraiment fait de mon mieux, j’ai lu le MAN et regardé des schémas fonctionnels, tout cela en deux semaines sur quelques mois. J’ai même fait des tests avec (Ze)nmap (bouuh !) et bien regardé le retour d’iptables -L -nv.
D’après les logs il y a des trucs qui marchent, fail2ban fonctionne bien lui aussi.

Mais j’ai encore beaucoup de difficultés, et j’aimerais vraiment avoir des conseils sur mes règles, si elles sont fonctionnelles et sans trou de sécurité majeur, ou si je me suis trompé dans l’ordre d’exécution… Pas facile de travailler seul sans un regard extérieur.

Je suis conscient que le pare-feu ne fait pas tout, et que la limitation des DDOS ne protège que le serveur et non la connexion qui y mène.

Voilà, je vous saurais gré d’éclairer ma lanterne, si tant est que mon niveau soit compatible avec vos explications, car mon but premier est bien que ça marche !

Merci de m’avoir lu !

salut,

je ne saurais pas valider avec certitude les règles iptables, mais ça me semble cohérent avec ce que j’ai pu apercevoir ailleurs.

d’un point de vue strictement rédaction du script, j’aurais créé des fonctions, par exemple input() :

input() { iptables -A INPUT "$@";}
accept_input() { input "$@" -j ACCEPT;}
drop_input() { input "$@" -j DROP;}

que j’utiliserais ainsi :

accept_input -i lo
accept_input -p icmp

pareil pour output…

d’ailleurs, -t filter n’est pas indispensable : filter est la table par défaut si aucune n’est spécifiée.

Merci, en effet je peux retirer les “-t filter”, les “/sbin/” aussi je crois.
Je suis un piètre programmeur, j’ignorais qu’on pouvait faire des variables, c’est vrai que c’est du bash :slight_smile:

Bonjour

si tu le sens pas, tu peut utiliser ufw qui est amplement suffisant dans ton cas.

Bonjour, je vais me rabattre sur ufw si j’ai trop de mal, mais au point où j’en suis, je veux vraiment savoir pour progresser :wink:

En fait, c’est surtout sur la partie protection ICMP/port80 que j’hésite.
Je crois que j’ai involontairement mis la ligne d’autorisation du port 80 en Append dans la table en Chaîne INPUT et que ça invalide toutes les règles ultérieures qui sont insérées avant, j’ai faux ?

# iptables -L -nv
Chain INPUT (policy DROP 98857 packets, 9631K bytes)
 pkts bytes target     prot opt in     out     source               destination
 160K   13M fail2ban-ssh  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 443
 1042 46192 SYN-LIMIT  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 flags:0x17/0x02
  151  6040 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 #conn src/28 > 50
    4   240 LOGDROP    tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 state NEW recent: UPDATE seconds: 60 hit_count: 4 name: DEFAULT side: source mask: 255.255.255.255
   52  2668            tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 state NEW recent: SET name: DEFAULT side: source mask: 255.255.255.255
  12M 1302M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
  119  8853 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
10647 1533K ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 limit: avg 1/sec burst 5
    0     0 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 ! state ESTABLISHED
   52  2668 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
  899 40460 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
 1600 89838 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:56000

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy DROP 252 packets, 25389 bytes)
 pkts bytes target     prot opt in     out     source               destination
  22M   32G ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
  119  8853 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
  205 12300 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
 1996  125K ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
 1522 91320 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
13115  800K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpts:1024:65535
 126K   16M ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpts:1024:65535
    2   120 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:587
  589 44764 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:123
    4  1312 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpts:67:68

Chain LOGDROP (1 references)
 pkts bytes target     prot opt in     out     source               destination
    4   240 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4
    4   240 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain SYN-LIMIT (1 references)
 pkts bytes target     prot opt in     out     source               destination
 1041 46140 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: up to 30/sec burst 5 mode srcip srcmask 28
    1    52 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
 pkts bytes target     prot opt in     out     source               destination
 160K   13M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Ufw n’est pas une régression.

Pour ma part, je met un logiciel que je maitrise bien en prod.
Et ensuite je m’exerce avec l’autre, dans ton cas ip dans une vm.
Ensuite je passe à celui-ci si il est superieur à ce que j’ai d’abord.

1 J'aime

Je vais faire les sempiternels mêmes commentaires.

Pas besoin de fonctions. Une fonction, c’est bien pour remplacer plusieurs instructions. Si c’est pour remplacer une seule instruction, ça nuit à la lisibilité pour qui est habitué à lire des jeux de règles iptables.

Etat RELATED
Tu as choisi de ne pas accepter systématiquement tous les paquets dans l’état RELATED. C’est bien, mais cela donne plus de travail car il y a des paquets dans cet état qu’il vaut mieux accepter (voir plus bas). Note que cet état n’est pas plus “vulnérable au forging” que les autres.

Règles ICMP
La première règle ayant déjà accepté tous les paquets ICMP entrants, les deux règles traitant les paquets de type echo-request sont inutiles et sans effet.
Pour en revenir aux deux premières règles ICMP, je les trouve permissives. Les seuls paquets ICMP qu’il est recommandé d’accepter sont des messages d’erreur de certains types liés à des connexions existantes (donc dans l’état RELATED). Ces types sont destination-unreachable, time-exceeded et parameter-problem. D’autres types comme source-quench et redirect peuvent servir à des attaques et sont déconseillés. Pour le reste, à chacun de voir.

SSH
Il y a une raison pour traiter les paquets reçus par l’interface eth0 plus sévèrement que sur les autres interfaces (lesquelles) ?
Ah, la limitation du nombre de connexions par seconde et par source avec la correspondance recent… Pour n’importe quel attaquant capable de forger son adresse IP source, il est facile de contourner cette limitation voire de l’exploiter pour provoquer un déni de service contre n’importe quelle adresse cliente. Attention aussi à ne pas te bloquer toi-même, 4 connexions par minute ce n’est pas énorme, et peut être limitant si on fait du scp.

Prévention de DDoS sur le serveur web
L’insertion de règles en début de chaîne avec -I, c’est moyennement lisible notamment parce qu’elles sont insérées dans l’ordre inverse des lignes (puisque la seconde sera insérée avant la première et ainsi de suite).

Il me semble que la règle connlimit devrait s’appliquer seulement aux paquets SYN. Au passage, elle prend en compte toutes les connexions de l’adresse source, et pas seulement celles à destination du port 80.

Très instructif, merci :ok_hand:

Mes craintes venaient de la lecture de cette page, et j’avoue que je n’ai pas été chercher la solution plus loin.
Sécurité avec iptables et l’option RELATED

Je me disais bien aussi, zéro paquet bloqué…

Je vais adapter tout ça en conséquence.

Une seule interface, c’est du basique de chez basique, je n’ai même pas de port PCI :sweat_smile:
Bref, il faut que j’arrête le copier-coller et que je pense par moi-même.

En effet, je réalise à présent que le seul effet est de bloquer les bruteforce, même si sans la clé…
Les 4 connexions/min me suffisent à l’usage, si (et seulement si) la connexion est stable :slight_smile:
A modifier lourdement.

Hum, d’une manière générale, j’aime l’idée de limiter toutes sortes de connexions quelque soit le paquet, aussi parce que j’ai lu que les attaques n’utilisent pas toutes le flag SYN (mon traffic est très faible, seul le volume échangé reste élevé).

Bon, je crois que tout ça répond largement à mes interrogations, plus qu’à passer au boulot.
Mes lectures n’auront pas été vaines !
Et je retiens une chose : [quote]As a packet traverses a chain, each rule in turn is examined. If a rule does not match the packet, the packet is passed to the next rule. If a rule does match the packet, the rule takes the action indicated by the target/verdict, which may result in the packet being allowed to continue along the chain or it may not. [/quote](Source : Wikipedia)

Sans vouloir vexer personne, j’ai plus de mal à comprendre l’action d’UFW qui automatise un peu les choses même si c’est pour mon bien, alors je tente le difficile :wink:

« qui est habitué à lire des jeux de règles iptables » lit la sortie d’iptables -L.
:stuck_out_tongue_closed_eyes:

quant aux fonctions, si ça peut éviter de retaper des instructions, ça évitera autant de fautes de frappes.

Bonsoir, me revoilà après une tentative de réorganisation complète…

Bon, j’ai encore fait des bêtises c’est sûr, vous n’allez plus vouloir de moi :smiling_imp:
Ce que je sais, c’est que j’ai bloqué le port 80, après j’ai perdu le fil.

#!/bin/sh

### BEGIN INIT INFO
# Provides:          firewall
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Demarre les regles iptables
# Description:       Charge la configuration du pare-feu iptables
### END INIT INFO

# Reinitialise les regles
iptables -F
iptables -X

# Strategie drop par defaut (pas de forwarding)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# IPs bannies a la main si necessaire
# iptables -A INPUT -s IP_Bannies -j DROP

# Autoriser les connexions deja etablies et le loopback
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# ICMP
# Autoriser ping et les limiter a 1/s
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# Autoriser certains types utiles (related seulement)
iptables -A INPUT -m state --state RELATED -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -m state --state RELATED -p icmp --icmp-type 11 -j ACCEPT
iptables -A INPUT -m state --state RELATED -p icmp --icmp-type 12 -j ACCEPT
iptables -A OUTPUT -m state --state RELATED -p icmp -j ACCEPT

# DNS (sortant seulement)
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Eviter les DDOS sur le serveur web
# Limite 50 connexions par masque IP /28
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 28 -j DROP
# Limite requêtes syn 30/s par masque IP /28
iptables -A INPUT -p tcp --syn --dport 80 -m hashlimit --hashlimit 30/second --hashlimit-mode srcip --hashlimit-srcmask 28 --hashlimit-name SYN-LIMIT -j DROP

# HTTP (Apache et navigation web sur la machine)
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# SSH limitation des connexions (attenuer les DDOS)
iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 6 --connlimit-mask 28 -j DROP

# HTTPS (Navigation https sur la machine et Input pour le port SSH actuel)
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Deluge (port d'entree personnalise, + large plage aleatoire pour connection au nuage de pairs)
iptables -A OUTPUT -p tcp --dport 1025:65535 -j ACCEPT
iptables -A OUTPUT -p udp --dport 1025:65535 -j ACCEPT
iptables -A INPUT -p tcp --dport 53360 -j ACCEPT

# SMTP SSL (exim)
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

# NTP (synchro de l'horloge avec les serveurs de temps internet)
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

# DHCP
iptables -A OUTPUT -p udp --dport 67:68 -j ACCEPT

# Reinitialise les regles IPv6
ip6tables -F
ip6tables -X

# Strategie IPv6 drop par defaut
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP

# Autoriser loopback IPv6
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT

Et la sortie :

# iptables -L -nv
Chain INPUT (policy DROP 4 packets, 377 bytes)
 pkts bytes target     prot opt in     out     source               destination
   12   864 fail2ban-ssh  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 443
  650  442K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    1    60 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 limit: avg 1/sec burst 5
    2   314 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED icmptype 3
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED icmptype 11
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED icmptype 12
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 #conn src/28 > 50
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 flags:0x17/0x02 limit: up to 30/sec burst 5 mode srcip srcmask 28
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 flags:0x17/0x02 #conn src/28 > 6
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53360

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
  739  490K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
    0     0 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    1    64 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    1    60 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
    2   120 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpts:1025:65535
   29  3741 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpts:1025:65535
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:587
    1    76 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:123
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpts:67:68

Chain fail2ban-ssh (1 references)
 pkts bytes target     prot opt in     out     source               destination
   12   864 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0 

Inutile de me corriger si c’est sans espoir, je passerai à UFW :flushed:

Salut,

pour un script d’init, en général, on ne fait pas la même chose pour démarrer le service et l’arrêter :slight_smile:
Et si tu utilises systemd comme init, autant supprimer le début et faire un vrai fichier services qui se contentera de lancer ton script.

Enfin, lancer des commandes iptables les unes après les autres, c’est pas terrible, si tu fais une erreur de syntaxe juste après avoir tout nettoyé et passer les poliques à DROP, tu coupe tout (si c’est un pc perso, ça peut passer, pour un serveur, c’est pénible en général…)
Les solutions pour éviter ça sont d’utiliser iptables-restoresur un jeu de règle (au lieu de faire iptables <bla>, tu fais echo <bla> >> fichier_temporaire et à la fin tu le charges) ou, directement utiliser nftables qui installe un service (désactivé par défaut) qui charge automatiquement au démarrage /etc/nftables.conf, mais pour ça, il vaut utiliser debian stable (stretch :smiley: oui je sais, ça fait pas longtemps qu’elle est sortie…).

Enfin, pour les DDoS, avec une connexion, même gigabit, tu ne peux simplement rien faire si on veut vraiment t’attaquer (il suffit de t’envoyer 2 Gbit/s pour que tu ne puisses absolument plus rien faire…)

SSH en port 443 ?

Tu n’as pas d’IPv6 ou tu ne veux juste pas t’en servir ?

Pour DHCP, je pense que tu n’as besoin que tu à mis comme port de destination un port qui est le port source (mais c’est à vérifier, je ne suis plus sûr).

Ahah, c’est vrai que sur le net, on trouve pas mal d’horreurs comme recommandations pour netfilter et les scripts, surtout des tutos périmés ou dangereux (je l’ai réalisé après en avoir utilisé certains), et j’ai progressé depuis même si c’est peu :slight_smile:
Il faut que je relise ça attentivement, ça semble correspondre à mon niveau : https://www.debian-fr.org/t/installation-parefeu-iptables-ip6tables-pour-les-nuls/2183

Pour iptables-restore, c’est pas trop grave si je suis à la porte car j’ai un accès physique permanent à la machine (elle est chez moi, ce n’est qu’un petit serveur personnel peu important).

Ah, Stretch est déjà stable, depuis hier c’est ça ? Je vais attendre un chouilla avant de migrer ma Jessie qui a quelques mois, mais je vais tout de même jeter un œil à nftables.

Les règles contre les DDOS, c’est une simple précaution pour limiter la casse, mais je sais bien que c’est un placébo si c’est plus sérieux que trois gars à mettre un presse-papier sur la touche F5 :grin:
Après tout, je peux aussi me contenter d’ouvrir le port normalement et advienne que pourra.

SSH sur le 443, c’est pour contourner les limitations des pare-feu si je ne suis pas chez moi, même si ça ne fonctionne pas partout. Accessoirement je peux aussi faire des tunnels, et comme j’ai la flemme d’installer let’s encrypt, je n’ai pas besoin d’SSLH.

Edit : j’oubliais IPv6, non je n’en dispose pas en effet, j’ai même besoin de ddclient car pas d’IP fixe… Facile de deviner qui me fournit internet :eyes:

Je rappelle aussi que je suis derrière mon routeur (grand public non flashé en firmware alternatif), et donc le pare-feu intégré limite les dégâts.

Bonsoir, je passe en résolu car vos suggestions très complémentaires forment une très bonne base de travail.
Je vais continuer à m’exercer à faire de vrais scripts d’init, et je repasserai à l’occasion.
Linux, c’est à la fois dur, logique et passionnant !

Merci à tous :wink:

Darkblue

1 J'aime