Iptables règle localhost

Salut.

J’essai d’interdire l’accès au port 3306 (de mysql) via iptables de l’extérieur.
Comme j’arrives pas à tester de l’extérieur, j’essaie de tester sur le localhost.

Mais j’y arrive pas, ça arrive encore à se connecter via: mysql --host=localhost --port=3306 -u utilisateur -p

Mon iptables basique:

iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -A OUTPUT -p udp -m udp --dport 53 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT 
iptables -t filter -A INPUT -p udp -m udp --sport 53 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT  
iptables -t filter -A INPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
iptables -t filter -A INPUT -i lo -j ACCEPT

J’ai ajouter tous ces règles:

iptables -A INPUT -p tcp --dport 3306 -j DROP
iptables -A OUTPUT -p tcp --dport 3306 -j DROP
ip6tables -A INPUT -p tcp --dport 3306 -j DROP
ip6tables -A OUTPUT -p tcp --dport 3306 -j DROP

iptables -A INPUT -p tcp -s localhost --dport 3306 -j DROP
iptables -A OUTPUT -p tcp -s localhost --dport 3306 -j DROP
ip6tables -A INPUT -p tcp -s localhost --dport 3306 -j DROP
ip6tables -A OUTPUT -p tcp -s localhost --dport 3306 -j DROP

iptables -A INPUT -p tcp --dport 3306 -s 127.0.0.1 -d 127.0.0.1 -j DROP
ip6tables -A INPUT -p tcp --dport 3306 -s ::1 -d ::1 -j DROP

Les règles sont bien sauvegarder dans iptables -L.

La connection arrive encore à s’établir sans soucis.

Je fais une erreur quelque part ?
Est-ce que la règle ci-dessous, empêche de bloquer le port 3306 ?

iptables -t filter -A OUTPUT -o lo -j ACCEPT
iptables -t filter -A INPUT -i lo -j ACCEPT

Ce n’est pas cohérent. Si l’accès doit être interdit de l’extérieur, il faut tester depuis l’extérieur qu’il est bloqué, et tester en local qu’il n’est pas bloqué.

En local, oui, puisque la règle qui accepte est placée avant la règle qui bloque.

J’ai mise à jours le sens, c’est pareil.
Alors, j’ai vider tout l’iptables ip6tables et ajouter un drop total input/forward/output autre règles, bien sauvegarder/charger.

J’y suis quand même parvenu à me connecter en ligne de commande:
mysql --host=localhost --port=3306 -u utilisateur -p

En tous cas, mes autres règles perso fonctionnent.
J’imagine que la connection mysql se fait d’une manière qui m’échappe.

Existe-t-il un moyen de savoir si un port est ouvert ou fermé ?

C’est-à-dire ? Il faut vérifier le jeu de règles actif avec iptables-save pour IPv4 et ip6tables-save pour IPv6.

Mais je répète : ça n’a pas de sens de tester en local si un port est inaccessible depuis l’extérieur. Le résultat n’est pas significatif.
Il faut quand même que MySQL soit accessible en local, non ? Sinon, autant ne pas le faire écouter sur une socket TCP mais seulement sur une socket Unix (s’il supporte ce mode de connexion), voire ne pas le faire tourner du tout.

Des commandes comme netstat, ss, lsof, fuser… permettent de voir les sockets TCP et UDP ouvertes sur la machine locale et les ports correspondants.

Il faut bien comprendre qu’iptables ne sert pas à ouvrir ni fermer des ports mais à accepter ou bloquer des paquets IP.

Bonjour,

Quelques petites notes à part :

  • Est-il possible d’avoir toutes tes règles iptables appliquées avec le retour de la commande iptables-save et ip6tables-save ?
  • Pour appliquer automatiquement tes règles iptables au démarrage, tu peux utiliser le paquet iptables-persistent, le configurateur du paquet te propose même d’importer automatiquement les règles appliquées dans la configuration qui se trouvera dans le dossier /etc/iptables/.

Voilà, bonne journée.

Pour ce qui est du tcp / unix.
Ne connaissant pas le socket unix, j’avais pas trop donné suite dessus quand j’avais vu.
Je crois qu’il s’agit pour les connexions en local, j’y jetterais un oeil sur web.

Dans ma base de donnée mysql pour root j’ai ceci:

+-----------+---------+-------------------------------------------+-------------+
| Host      | User    | Password                                  | plugin      |
+-----------+---------+-------------------------------------------+-------------+
| localhost | root    |xxxx 					  | unix_socket |

C’est bien un socket unix je crois.

J’essai d’interdire l’accès au port 3306 (de mysql) via iptables de l’extérieur.
Comme j’arrives pas à tester de l’extérieur, j’essaie de tester sur le localhost.

Quand je disais cela, je voulais dire cela:

  • comme j’ai pas d’autres connexions/ordinateurs pour me connecter réellement de l’extérieur.
  • je vais faire pareil mais au lieu de l’extérieur, je vais tester de l’intérrieur
  • en interdisant l’accès intérrieur et essayer de me connecter de l’intérrieur
  • <donc blocker le local au port 3306 et essayer de me connecter du local au port 3306>

J’ai trouver un moyen pour me connecter de l’extérrieur en configurant ma box et en utilisant mon ip publique.
Mais au moment de cet configuration j’avais tester autre choses, tester mysql ne m’est pas venu à l’idée.
Je sais pas si je recommencerais un jour ce même teste et vérifier pour le port mysql.
En tout cas ça m’intéresse plus en ce moment.

C’était juste pour bien être sûr qu’il n’y ai pas d’accès de l’extérrieur.
J’ai bloqué tout ce qui est entrant, sauf le web et quelques port spécifique, donc il n’y devrait pas y avoir de soucis.

Merci à vous.