Archives de catégorie : linux

Ip_conntrack ou nf_conntrack: table full, dropping packet.

Un problème assez fréquent lors de petit DDOS, ou de monté en charge de serveur.

Le module ip_conntrack ou nf_conntrack permet le suivi de connections lorsque l’on utilise netfilter. Dans cette table est écrit toutes les connections ouvertes ces 5 derniers jours. Cela peut poser un problème lorsque cette table est pleine. Aucune connections n’est alors possible et la console renvoie le message suivant :

nf_conntrack: table full, dropping packet.

Ou

ip_conntrack: table full, dropping packet.

Il faut commencer par par regarder les valeurs par default :

#/sbin/sysctl -a | grep conntrack

Ce qui devrait donner quelques chose comme ça :

net.ipv4.netfilter.ip_conntrack_generic_timeout = 600
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 432000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 10
net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans = 300
net.ipv4.netfilter.ip_conntrack_tcp_loose = 1
net.ipv4.netfilter.ip_conntrack_tcp_be_liberal = 0
net.ipv4.netfilter.ip_conntrack_tcp_max_retrans = 3
net.ipv4.netfilter.ip_conntrack_udp_timeout = 30
net.ipv4.netfilter.ip_conntrack_udp_timeout_stream = 180
net.ipv4.netfilter.ip_conntrack_icmp_timeout = 30
net.ipv4.netfilter.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_count = 4983
net.ipv4.netfilter.ip_conntrack_buckets = 16384
net.ipv4.netfilter.ip_conntrack_checksum = 1
net.ipv4.netfilter.ip_conntrack_log_invalid = 0
net.netfilter.nf_conntrack_generic_timeout = 600
net.netfilter.nf_conntrack_max = 65536
net.netfilter.nf_conntrack_count = 4983
net.netfilter.nf_conntrack_buckets = 16384
net.netfilter.nf_conntrack_checksum = 1
net.netfilter.nf_conntrack_log_invalid = 0
net.netfilter.nf_conntrack_expect_max = 256
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_loose = 1
net.netfilter.nf_conntrack_tcp_be_liberal = 0
net.netfilter.nf_conntrack_tcp_max_retrans = 3
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.netfilter.nf_conntrack_icmp_timeout = 30

Bon la première chose à faire est de limiter le délai maximum d’une connexion de 432000 secondes ( soit 120 heures ou 5 jours)  à seulement 1 jours (ou moins).

Pour nf_conntrack :

# /sbin/sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400

Pour ip_conntrack :

# /sbin/sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established =86400

Ensuite si ce n’est pas déjà le cas augmenter le conntrack_max. Dans cet exemple je la passe à 64536 mais cela peut être beaucoup plus, tout dépend de la quantité de RAM que vous avez. Plus cette valeur sera élevé plus cela consommera de RAM.

Pour nf_conntrack :

# /sbin/sysctl -w net.netfilter.nf_conntrack_max=65536

Pour ip_conntrack :

# /sbin/sysctl -w net.ipv4.netfilter.ip_conntrack_max =65536

A présent il faut que vos configuration perdurent au prochain reboot. Pour cela rajouter les lignes précédentes dans le sysctl.conf.

# nano /etc/sysctl.conf

net.netfilter.nf_conntrack_max=65536.
net.netfilter.nf_conntrack_tcp_timeout_established=60
net.ipv4.netfilter.ip_conntrack_max =65536
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established =60

Enfin redémarrer votre interface réseau.

# /etc/init.d/network restart

Correction bug munin

Alors une petite liste de bug avec munin :

cat: /proc/net/ip_conntrack: Permission denied

Il n’y a pas les bon droit dans /proc/net/ip_conntrack il faut faire le chmod.

#chmod +xr -R /proc/net

Ensuite on peut aussi avoir :

Plugin « if_eth0 » exited with status 512.

C’est toujours un probleme de droit. Mais cette fois si il faut les corriger dans le fichier :

#nano /etc/munin/plugin-conf.d/munin-node

et

#nano /etc/munin/plugins.conf

Et rajouter ces lignes :

[if_*]
user root

[if_err_*]
user root

Et enfin le plus facile : mysql

mysqladmin: connect to server at ‘localhost’ failed
error: ‘Access denied for user ‘nobody’@’localhost’ (using password: NO)’

Petit piège quand vous mettez le mot de passe contrairement au login il ne faut pas d’espace entre le -p et le mot de passe.

Editer donc :

#nano /etc/munin/plugin-conf.d/munin-node

et

#nano /etc/munin/plugins.conf

[mysql*]
env.mysqlopts -u login -ppass

Firewall pour serveur dédié avec iptables

Firewall pour serveur dédié avec iptables

Ce script ce base sur iptables, il a pour but de bloquer tout le trafic entrant sur le serveur à part les service qui seront listé. Le trafic sortant n’est quand a lui n’est pas impacté.

Je créer un fichier firewall :

# nano /etc/init.d/firewall

#!/bin/bash
echo Setting firewall rules...
#
# config de base dedibox
# Florian Cristina
#v1.1

###### Debut Initialisation ######

# Vider les tables actuelles
iptables -t filter -F
iptables -t filter -X
echo - Vidage : [OK]

# Ne pas casser les connexions etablies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo - Ne pas casser les connexions établies : [OK]

###### Fin Inialisation ######

##### Debut Regles ######

# Autoriser SSH
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
echo - Autoriser SSH : [OK]

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
echo - Autoriser loopback : [OK]

# Autoriser ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
echo - Autoriser ping : [OK]

# HTTP et HTTPS
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT
echo - Autoriser HTTP et HTTPS : [OK]

# DNS
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
echo - Autoriser DNS : [OK]

# FTP
modprobe ip_conntrack_ftp
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
echo - Autoriser FTP : [OK]

# Mail : POP, SMTP, IMAP
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
echo - Autoriser Mail : [OK]

###### Fin Regles ######

###### Interdiction de tout entrant ######
# Interdire toute connexion entrante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
echo - Interdire toute connexion entrante : [OK]

echo Firewall mis a jour avec succes !

Je donne les droits d’exécution :

# chmod +x /etc/init.d/firewall

Une fois que vous l’avez tester et que cela fonctionne vous pouvez le mettre à chaque démarrage du serveur.

# update-rc.d firewall defaults 99

Merci à Rusty Russell et son How-To, il est la base de cette page. Et merci surtout pour son travail au sein de l’équipe de développement de Netfilter 🙂

Tester votre Firewall avec nmap

Tester votre Firewall avec nmap

Attention un scan de port sur un serveur qui ne vous appartient pas est considéré comme une attaque.

Afin de savoir si votre firewall fonctionne, vous pouvez utiliser l’utilitaire nmap (http://insecure.org/nmap/). Avec nmap vous allez chercher à savoir quel est l’état de vos ports.

Il y a 3 états possibles :

* open : Le port est ouvert et un service écoute le port.
* closed : Le port est ouvert mais il n’y a aucun service qui écoute le port.
* filtered : Le port est fermé.

Pour utiliser nmap, vous devez vous situer sur un autre serveur (ou de chez vous) et procéder ainsi :

#nmap IPduserveurcible -p leport

Gestion avec BIND et nssec.dedibox.fr de nom de domaine en .fr

Déclaration du nom de domaine sur nssec.dedibox.fr

Pour commencer, comme cela prend 24h pour que nssec.dedibox.fr se mette à jour, vous devez ajouter votre domaine en .fr dans l’interface dedibox le plus tôt possible.

Note du relecteur : L’installation initiale du domaine secondaire prends 24 heures environs (toutes les nuits à 2h45 du matin), ensuite les mises à jour sont effectuées dans le délais “refresh” indiqué dans la SOA du DNS primaire de votre nom de domaine.

Aprés avoir sélectionne votre serveur, dans l’onglet “Dns secondaire”.

A présent, cliquez sur Gestion DNS secondaire. Vérifiez que le serveur DNS primaire est bien celui qui doit gérer les DNS. Rajouter votre nom de domaine (sans http ni www).

Configuration de BIND

Le fichier de configuration général

Si vous utilisez un panel de gestion, commencez par installer le domaine avec le panel de gestion. Pour configurer BIND vous devez vous logger en root en ssh sur votre dedibox et éditer 2 fichiers.

Editez le fichier de configuration général de bind /etc/bind/named.conf. Placez-vous à la suite (ou sur la configuration faite par le panel) pour que la configuration de votre domaine ressemble à ceci (remplacer domaine.fr par votre domaine) :

zone "domaine.fr" {
       type master;
       notify yes;
       allow-transfer { 88.191.254.7; };
       file "/var/cache/bind/domaine.fr.db";
};

Comme vous l’avez surement remarqué le allow-transfer n’est pas configuré sur 88.191.254.71, l’ip de nssec.dedibox.fr, mais sur 88.191.254.7 car c’est ce serveur qui s’occupe de gerer les AXFR. Dans cet exemple le fichier de zone sera contenu dans /var/cache/bind/domaine.fr.db

Le fichier de zone

A présent il faut éditer le fichier pointé par le file. Dans cet exemple ce sera donc /var/cache/bind/domaine.fr.db Editer votre fichier pour qu’il ressemble à ceci :

$TTL 86400
@       IN      SOA     sd-xxxx.dedibox.fr. root.domaine.fr. (
                        2006081720
                        8H
                        2H
                        4W
                        1D )
        IN      NS      sd-xxxx.dedibox.fr.
        IN      NS      nssec.dedibox.fr.
        IN      MX      10 mail.domaine.fr.

domaine.fr.    A       88.191.xx.xx
ns             IN      A       88.191.xx.xx
mail           IN      A       88.191.xx.xx
www            CNAME   domaine.fr.
ftp            CNAME   domaine.fr.

Remplacer domaine.fr par votre propre nom de domaine. Remplacer sd-xxxx.dedibox.fr par le nom de votre dedibox. Remplacer 88.191.xx.xx par l’ip de votre dedibox. Faite bien attention de laisser les ”.” comme ils sont indiqués. Metter à jour le numero de serie.

A présent il vous reste à relancer BIND pour prendre en compte les modifications.

# /etc/init.d/bind9 reload

L’Afnic arg…

Avant de vous rendre sur le site de l’afnic pour tester votre domaine, pensez à créer un mail en postmaster (faite un catch-all) sur le domaine en .fr.

Après avoir attendu les 24h réglementaires, il vous reste l’étape si redoutée du passage du test zonecheck de l’afnic ici http://www.afnic.fr/outils/zonecheck/form

* Dans « zone » rentrer votre domaine sans www, ni http.
* Dans « primaire » rentrer le reverse (sd-xxxx.dedibox.fr) de votre dedibox et son IP.
* Dans « secondaire » rentrer nssec.dedibox.fr et 88.191.254.71 pour IP.

Si le test provoque des erreurs lisez les messages d’erreur générés par le zonecheck et corrigez les problèmes.

Sinon, si le test affiche SUCCES c’est que tout est bon, vous pouvez vous rendre chez votre registrar pour modifier vos serveurs de nom. Votre registrar enverra la demande à l’afnic qui procédera à la mise à jour du lundi au vendredi 9h-12h et 14h-17h…

Bref pour ce qui concerne la migration des DNS d’un nom de domaine en .fr, la meilleure des qualités c’est d’être patient. 😀

Merci à Mickael Moreira, Raphael Clerc, et achtungbaby pour leurs conseils.

Celui que j’avais écris pour le support ce trouve ici : http://documentation.dedibox.fr/doku.php?id=admin:dns

Des vieux articles sur documentation.dedibox.fr

Je viens de retrouver des vieux tuto que j’avais écris pour le support de dedibox.fr http://documentation.dedibox.fr/doku.php

Le premier traite de l’utilisation d’un firewall (iptables) pour un serveur dédié de façon très basique. Et le second sur la configuration de bind pour validé les ndd en .fr qui est plus rigoureuse que celles des .com/.net/.org.

Je vais un peu les rafraichir et les mettres sur le blog 😀

du -h –max-depth=N

Alors si il y a bien des commandes que j’oublie c’est bien celle la. Le bon du qui est une vrai merveille, peut s’avérer vite illisible sans les bonnes options.

Alors tout le monde connait le -h pour rendre le résultat lisible par un humain (les geek eux ils ont pas besoin).

Et le –max-depth=N permet de définir la profondeur d’exploration des dossier. Donc si on veut uniquement les dossier N-1 en lecture humaine. Cela donne :

du -h –max-depth=1

rpmdb: Lock table is out of available locker entries

L’erreur : rpmdb: Lock table is out of available locker entries

Quand le rpm accéde à sa BDD type Berkeley, il crée un « lock » temporaire lors de sa recherche de donnée. Si durant ce processus un crontol-c est fait, le processus est donc arreter, le lock n’est jamais relâché et cette erreur peut se produire.

Pour résoudre le problème :
On commence par faire le backup de /var/lib/rpm au cas ou on casse quelque chose :

# tar cvzf rpmdb-backup.tar.gz /var/lib/rpm

On supprime la base berkeley lié aux rpm:

# rm /var/lib/rpm/__db.00*

On recrée la bdd rpm (cela peut prendre un certain temps):

# rpm –rebuilddb

Enfin, on verifie que les rpm sont correct :

rpm -qa | sort