Eh, je n’ai encore rien dit !
Certe tout n’est pas possible. En particulier les résolutions DNS ne sont pas utilisables pendant l’application des règles iptables à un paquet (car cela se passe dans le noyau, et le noyau ne fait pas de résolution DNS). On peut spécifier une source ou une destination avec un nom de domaine dans une adresse lors de la création d’une règle, mais alors le nom est résolu en adresse qui est inscrite dans la règle. Si le nom de domaine se résoud en plusieurs adresses, alors une règle est créée pour chaque adresse.
On voit immédiatement le problème avec un nom de domaine dynamique : on peut créer une règle avec l’adresse correspondante à un moment donné, mais cette règle ne sera plus valable si l’adresse change. Il faut donc remplacer la règle avec la nouvelle adresse à jour après chaque changement. Comme on ne peut pas savoir quand l’adresse change (à moins que le client DNS dynamique notifie le serveur d’une manière ou d’une autre), on n’a pas d’autre choix que de vérifier l’adresse périodiquement pour remplacer la règle iptables en cas de changement ou bien de mettre à jour la règle périodiquement. La période doit être réglée avec le temps minimum d’indisponibilité qu’on accepte (si l’adresse change juste après la vérification).
De façon très rustique, cela pourrait donner quelque chose comme ceci (j’omets volontairement le reste des règles iptables) :
[code]# periode de verification en secondes
periode=60
iptables -N acl_dyn
iptables -A INPUT -p tcp --dport 80 --syn -j acl_dyn
iptables -A INPUT -p tcp --dport 80 --syn -j REJECT --reject-with tcp-reset
boucle infinie
while true
do
effacement des regles de la chaine
iptables -F acl_dyn
creation des regles dynamiques
iptables -A acl_dyn domaine1.dyndns.org -j ACCEPT
iptables -A acl_dyn domaine2.no-ip.org -j ACCEPT
etc.
sleep $periode
done
[/code]
Edit : vider une chaîne = -F ; -X = supprimer la chaîne