Iptables et dns dynamique

Fermé
brice2suisse Messages postés 3 Date d'inscription mardi 27 décembre 2005 Statut Membre Dernière intervention 27 décembre 2005 - 27 déc. 2005 à 01:51
caledo120 Messages postés 7 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 31 août 2012 - 23 juil. 2010 à 01:12
Salut

J'utilise actuellement iptable pour "blinder" mes accés sur mon serveur linux. Actuellement tout est bloqué par :
iptables -P INPUT DROP
iptables -P OUTUT DROP
en dehors de mes accès sur mon lan :
iptables -A INPUT -s 192.168.x.y/24 -j ACCEPT
iptables -A OUTPUT -s 192.168.x.y/24 -j ACCEPT

MAIS je voudrais donner accès uniquement à mon serveur qui héberge des albums de photos à quelques membres de ma famille qui ont une addresse de domaine du style truc.dyndns.org, or :
iptables -A INPUT -s truc.dyndns.org -j ACCEPT
iptables -A OUTPUT -s truc.dyndns.org -j ACCEPT

ne marchent pas !

Y'a-t-il des experts qui pourraient m'aider ?
A voir également:

7 réponses

caledo120 Messages postés 7 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 31 août 2012 2
18 sept. 2008 à 10:38
Bonjour,

Ayant le même problème et en complément de KMF31, voici une fonction bash qui va vous rendres bien service :)

#!/bin/bash
#************************************************#
#           UPDATE IPTABLE  v1.0                 #
#                                                #
#           written by Caledo120                 #
#           Contact : 120@caledonien.org         #
#                18/09/2008                      #
#                                                #
#************************************************#

# - > Permet de faire la mise a jour de votre ip, dans IPTABLE.
# - > Activer une tache cron pour exécuter le script toutes les 60 sec (par exemple) 
# - > 60 * * * * update_iptable.sh

# ARG1(IP) ARG2(PORT) ARG3(NOM DE LA CHAINE IPTABLE} ARG4{INTERFACE RESEAU})
maj_ipdyn_iptable ()
{
	! test -z ${1} && ! test -z ${2} && ! test -z ${3} && ! test -z ${4} || echo "fct 'maj_ipdyn_iptable' Paramètre Manquant P1(${1}) P2(${2}) P3(${3})"
		
	IP_CHECK=${1}; PORT=${2}; CHAINE_IPTABLE=${3}; INTERFACE=${4};
	
	if [ ! -d ${DOSSIER_LOG} ]; then mkdir ${DOSSIER_LOG} || exit;  fi;
	

	LOG_DYN="${DOSSIER_LOG}/${IP_CHECK}.ip"
	ADR_IP=`host ${IP_CHECK} | cut -d \  -f 4`
	

	if [ -f "${LOG_DYN}" ]
	then

		diff <(cat ${LOG_DYN}) <(echo "${ADR_IP}") &>/dev/null
		if [ ${?} != 0 ]
		then

			OLD_IP=$(cat ${LOG_DYN});
			echo ${ADR_IP} > ${LOG_DYN}

			if [ ${?} != 0 ]; then echo "PB !! ECRITURE < ${LOG_DYN} > !! PB"; exit; fi

	    iptables -D ${CHAINE_IPTABLE} -i ${INTERFACE} -p tcp --dport ${PORT} -s ${OLD_IP} -j ACCEPT || echo "PB !! Suppression de l'ancienne règle !! PB";
	    iptables -I ${CHAINE_IPTABLE} -i  ${INTERFACE} -p tcp --dport ${PORT} -s ${ADR_IP} -j ACCEPT || echo "PB !! Création de la nouvelle règle !! PB";

		else
			echo "IP IDENTIQUE"
		fi
		
	else
		echo ${ADR_IP} > ${LOG_DYN}
		iptables -I ${CHAINE_IPTABLE} -i  ${INTERFACE} -p tcp --dport ${PORT} -s ${ADR_IP} -j ACCEPT && echo "${ADR_IP} UPDATE" || echo "PB !! Création de la nouvelle règle !! PB";
		
	fi
}

# INIT #
CHROOT_PATH="/home/vincent/maj_iptable"
DOSSIER_LOG="${CHROOT_PATH}/log"
# fin INIT #

# Exemple : 
maj_ipdyn_iptable "120.ath.cx" 10000 "RH-Firewall-1-INPUT" "eth0"


Si vous avez des questions, n'hésitez pas.

Bonne journée
2
Salut,

Ton script me génère une erreur que je nne sais corrigé :

update_iptable.sh: line 32: syntax error near unexpected token `('
update_iptable.sh: line 32: ` diff <(cat ${LOG_DYN}) <(echo "${ADR_IP}") &>/dev/null'

Saurais-tu me dire ce qui ne va pas stp ?

Merci.
0
kmf31 Messages postés 1564 Date d'inscription mercredi 30 mars 2005 Statut Contributeur Dernière intervention 22 juin 2007 501
27 déc. 2005 à 11:42
Si ton serveur change d'adresse dynamiquement ce n'est pas evident (a ma connaissance). Il te faut faire un script qui cherche avec la commande host l'adresse IP actuelle pour faire la regle iptables et apres regulierement executer ce script dans le crontab, par exemple le copier dans /etc/cron.hourly.
En principe tu peux ajouter dans ton script general pour faire le pare feu un truc:
ADR_IP=`host truc.dyndns.org | cut -d \   -f 4`
iptables -A INPUT -s $ADR_IP -j ACCEPT
iptables -A OUTPUT -s $ADR_IP -j ACCEPT 

Bien sur ce n'est pas ideal si le numero IP change et ce n'est pas encore actualise. De plus ton script doit etre tel qu'il annulle les anciennes regles, c.-a-d. qu'il refait tout le pare feu des le debut.

A part ca tu as de regles super restrictives, c.-a-d. avec ces regles tu n'as meme pas internet sur le serveur.
De facon generale pour bien configurer un pare feu il faut faire un truc comme ca:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j ACCEPT

(si internet passe par "eth0", ca peut aussi etre "eth1" ou "ppp0" pour une connexion PPPoE ou modem 56 K).
car:
1) Il faut ouvrir le device local "lo" pour le bon fonctionnement de certaines choses.
2) Tu peux resteindre l'acces INPUT a de requetes qui sont de reponses a d'autres requetes de ta part precedents.
3) Tu peux normalement bien ouvrir OUTPUT si tu as le controle sur ton serveur. C'est seulement en Windows ou on ne peut pas faire confiance a son pc.
Avec ces regles tu as un pare feu bien ferme depuis l'exterieur (pour les requetes non-sollicites) mais quand meme assez ouvert pour faire toi meme internet sur ce serveur.

Apres tu peux faire plus severement en mettant le port 80 (http, ou 20/21 pour ftp), disons avec un truc:
-p tcp --dport 80

avant le "-j ACCEPT" (pour INPUT ou avec "-p tcp --sport 80" pour OUTPUT).
Tu peux aussi mettre de plages entieres de numeros IPs si tu sais a peu pres les plages d'IPs de ton "truc.dyndns.org" mais ce qui compte c'est de combiner ca avec le machin "RELATED,ESTABLISHED" pour securiser, sauf si ton "truc.dyndns.org" a besoin d'un acces completement libre sur ton serveur (si "truc.dyndns.org" fait un ftp/http vers ton serveur). Par contre si tu veux seulement faire un ftp de ton serveur vers le "truc.dyndns.org" la regle "RELATED,ESTABLISHED" pour INPUT et OUTPUT ouvert suffit largement.
Mais bien tout ca est un choix personnel.
0
brice2suisse Messages postés 3 Date d'inscription mardi 27 décembre 2005 Statut Membre Dernière intervention 27 décembre 2005
27 déc. 2005 à 13:57
Merci kmf31
Effectivement comme tu le signale, je suis super restrictif et il me faut ouvrir un peu plus le fw pour certains process locaux ou ne serait-ce que pour l'intallation de certains packages.

Reste effectivement mon probleme de client ayant des adresse IP dynamique...
Si je dois effacer les iptables et les réécrire toutes les heures, il suffit qu'une ip change la seconde plus tard et pendant 59m59s je ne pourrais pas autoriser l'accès à mon serveur :-( :-( :-(
0
kmf31 Messages postés 1564 Date d'inscription mercredi 30 mars 2005 Statut Contributeur Dernière intervention 22 juin 2007 501
27 déc. 2005 à 16:46
Je ne vois toujours pas pourquoi une regle de genre ESTABISHED,RELATED ne ferait pas l'affaire mais si toute fois tu as vraiement besoin pour ouvrir pour exactement la bonne IP actuelle tu peux faire un petit programme, soit en C, soit en perl ou soit meme en shell-script simple (c'est possible) qui verifie regulierement l'IP (par exemple toutes les 60 secondes) de ton dyndns par la commande host et qui change la regle iptables uniquement si cette IP a change:
Exemple pour un script:
#!/bin/bash

ADR_IP=`host truc.dyndns.org | cut -d \   -f 4`
iptables -I INPUT -s $ADR_IP -j ACCEPT
iptables -I OUTPUT -s $ADR_IP -j ACCEPT

while true ; do
  # attendre 60 secondes
  sleep 60

  NEW_IP=`host truc.dyndns.org | cut -d \   -f 4`

  # actualiser les regles si l'IP a change
  if ! [ "$NEW_PI" = "$ADR_IP" ] ; then
    # effacer les anciennes regles:
    iptables -D INPUT -s $ADR_IP -j ACCEPT
    iptables -D OUTPUT -s $ADR_IP -j ACCEPT
  
    ADR_IP=$NEW_IP
    # ecrire les nouvelles regles: 
    iptables -I INPUT -s $ADR_IP -j ACCEPT
    iptables -I OUTPUT -s $ADR_IP -j ACCEPT
  fi
done


Je ne suis pas 100% pour tous les details de syntax (notamment pour le "if" avec le "!" devant et le "while") mais l'idee est claire. Tu te debrouilleras pour ca. Ce qui importe est que l'ajout ou l'effacemment des regles n'est pas tres cher au niveau cpu. Pas besoin de refaire chaque fois le pare feu completement. On peut avoir d'autres regles pare feu en parallel (a mettre avant lancement du script) qui ne sont pas concernees par ca.
Il te faut lancer ce script en permanence (peut-etre dans les scripts de boot) et apres ca devrait marcher. Tu peux aussi decider de reduire ou augmenter les 60 secondes. Peut-etre tu dois aussi mettre de chemins absolus ("/bin/sleep", "/sbin/iptables" etc. au lieu se "sleep" ou "iptables", ...) pour que ca marche correctement.
A savoir avec iptables:
"-I" pour ajouter une regle au debut
"-A" pour ajouter une regle a la fin
"-D" pour eliminer une regle existente (il faut exactement mettre la meme regle qu'on souhaite effacer et apres il la trouve tout seul).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
caledo120 Messages postés 7 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 31 août 2012 2
12 août 2009 à 03:26
Bonjour,

J'ai refais un topic avec la nouvelle version du script :

https://forums.commentcamarche.net/forum/affich-13839538-script-ip-dynamique-iptables

Bonne journée
0
caledo120 Messages postés 7 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 31 août 2012 2
23 juil. 2010 à 01:12
et la V3 (dernière au 23/07/2010)

https://forums.commentcamarche.net/forum/affich-18583089-script-ip-dynamique-iptables-v-0-3
0
Thx
0
brice2suisse Messages postés 3 Date d'inscription mardi 27 décembre 2005 Statut Membre Dernière intervention 27 décembre 2005
27 déc. 2005 à 18:07
Ben là je m'incline.... t'es mon sauveur ! Ce soir je teste tout ça.
-1