Pour gérer le pare-feu Linux c'est traditionnellement iptables, qui fonctionne par chaînes avec des règles ; une règle est un filtre qui amène à une décision, au choix :
ACCEPT
pour laisser passer le message ;
DROP
pour jeter le message aux oubliettes ;
REJECT
pour jeter le message aux oubliettes, mais en disant à l'émetteur que l'on a jeté le message aux oubliettes.
REJECT
est généralement préférable à
DROP
; l'utilisateur aura instantanément un message d'erreur « connexion refusée », là où
DROP
ne répondra pas et il se fera timed out après quelques minutes.
Il y a deux chaînes par défaut,
INPUT
et
OUTPUT
pour respectivement les messages entrants et sortants. Les chaînes ont aussi une décision par défaut si aucune règle ne correspond, généralement on
ACCEPT
pour
OUTPUT
(e.g. toutes les connexions sortantes sont autorisées), et on
DROP
pour
INPUT
(e.g. toutes les connexions entrantes sont refusées).
Il y a aussi une troisième chaîne par défaut
FORWARD
, mais c'est plus destiné aux routeurs, on la mettra à
DROP
.
Du coup pour les règles en
INPUT
, l'on a :
- On accepte tous les messages venant de connexions déjà établies ;
- On accepte tous les messages venant de localhost ;
- On jette tous les messages invalides ;
- On accepte les pings ;
- On applique la chaîne
UDP
pour les connexions UDP entrantes ;
- On rejette les connexions UDP entrantes qui n'ont pas été acceptées ;
- On applique la chaîne
TCP
pour les connexions TCP entrantes ;
- On rejette les connexions TCP entrantes qui n'ont pas été acceptées ;
- On rejette les connexions entrantes qui ne sont ni TCP, ni UDP.
L'on ne met rien dans la chaîne UDP ; dans la chaîne TCP, on autorise les connexions sur le port SSH, et les serveurs webs.
Des robots scannent les serveurs accessibles depuis Internet afin de les zombifier, donc il faut :
- Mettre un mot de passe costaud, ou mieux désactiver la connexion par mot de passe et utiliser un certificat à la place ;
- Éviter d'utiliser les ports par défaut (e.g. changer le port SSH). Ça permet surtout de réduire le traffic vu que t'auras moins de bots pour bruteforce le mdp.
Une fausse bonne idée est d'autoriser uniquement les connexions venant de ton IP, mais c'est plutôt simple de forger des messages venant de n'importe quelle adresse IP.
Du coup pour mettre en place ça ;
Code:
apt update
apt upgrade
apt install iptables-persistent
systemctl stop netfilter-persistent.service
mv /etc/iptables/rules.v4 ~
mv /etc/iptables/rules.v6 ~
export EDITOR=nano
sudoedit /etc/iptables/rules.v4
Si t'as jamais utilisé Nano les raccourcis clavier sont écrits en bas,
^
correspond à CTRL et
M-
à la touche méta (Windows, à gauche de la barre espace).
Copie-colle ça dedans (clique droit > Coller, ou
CTRL
SHIFT
V
) :
INI:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
--append INPUT -m conntrack --ctstate RELATED,ESTABLISHED --jump ACCEPT
--append INPUT --in-interface lo --jump ACCEPT
--append INPUT -m conntrack --ctstate INVALID --jump DROP
--append INPUT --protocol icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW --jump ACCEPT
--append INPUT --protocol udp -m conntrack --ctstate NEW --jump UDP
--append INPUT --protocol udp --jump REJECT --reject-with icmp-port-unreachable
--append INPUT --protocol tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW --jump TCP
--append TCP --protocol tcp -m tcp --dport 22 --jump ACCEPT # ssh
--append TCP --protocol tcp -m tcp --dport 80 --jump ACCEPT # pterodactyl (http)
--append TCP --protocol tcp -m tcp --dport 4574 --jump ACCEPT # spark (http)
--append INPUT --protocol tcp --jump REJECT --reject-with tcp-reset
--append INPUT --jump REJECT --reject-with icmp-proto-unreachable
COMMIT
Sauvegarde
^O
+
y
, puis ferme
^X
.
Pour IPv6 :
Code:
cp /etc/iptables/rules.v4 /etc/iptables/rules.v6
sudoedit /etc/iptables/rules.v6
Et modifie-le comme ceci :
Diff:
# Accepte les pings.
- --append INPUT --protocol icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW --jump ACCEPT
+ --append INPUT --protocol ipv6-icmp --icmpv6-type 128 -m conntrack --ctstate NEW --jump ACCEPT
# Redirige les nouvelles connexions UDP vers la chaîne UDP.
--append INPUT --protocol udp -m conntrack --ctstate NEW --jump UDP
+# Neighbor Discovery Protocol
+ --append INPUT --source fe80::/10 --protocol ipv6-icmp --jump ACCEPT
+# Dynamic Host Configuration Protocol
+ --append INPUT --protocl udp --sport 547 --dport 546 -j ACCEPT
# Sinon, rejette la connexion UDP.
- --append INPUT --protocol udp --jump REJECT --reject-with icmp-port-unreachable
+ --append INPUT --protocol udp --jump REJECT --reject-with icmp6-adm-prohibited
[ ... ]
# Rejette toutes les connexions qui ne sont ni TCP, ni UDP, ni ICMP.
- --append INPUT --jump REJECT --reject-with icmp-proto-unreachable
+ --append INPUT --jump REJECT --reject-with icmp6-adm-prohibited
Ensuite sauvegarde (
^O
+
y
,
^X
).
Applique les changements :
Code:
systemctl enable netfilter-persistent.service --now
systemctl status netfilter-persistent.service
Ça devrait être vert (“Active: active (exited)”).
Ouvre
un autre terminal et vérifie que tu peux toujours te connecter en ssh (lol). Dans tous les cas OVH propose un terminal sur leur site, mais il est pas très pratique.
Tu devrais pouvoir accéder à
http://ipv4:4574
.