Serveur DNS derrière pare feux.

Tyller
Messages : 2
Inscription : 25 mars 2012, 18:01

Serveur DNS derrière pare feux.

Message par Tyller » 08 avril 2013, 01:55

Bonjour à tous,

Je viens vers vous car je ne trouve pas la solution à mon problème qui dans l'idée parait simple.

J'ai dans mon réseau un serveur nommé serveur avec 2 cartes réseaux. La première eth0 connecté au wan avec une adresse ip publique.
La seconde pour le lan avec le réseau 192.168.0.0/24.

J'ai un autre serveur nommé network qui contient bind et dhcp, il est branché sur la carte eth1 de serveur et à pour adresse 192.168.0.1

J'ai aussi un nom de domaine renouveaux.fr à qui j'ai fait une redirection dns vers l'ip publique de mon serveur.

Actuellement, j'ai accès à mes différents serveurs grâce à leur hostname. Je peu aller sur serveur.renouveaux.fr, network.renouveaux.fr, www.renouveaux.fr etc...

Problème, ces différents domaines ne sont pas accessible depuis l’extérieur.
Ce que je voudrais, c'est que le serveur dns réponde aux requêtes extérieurs pour les domaines choisi. Par exemple que l'on ne puisse accéder à prive.renouveaux.fr sauf dans le lan.
Le truc, c'est que je ne trouve pas d'info sur le montage d'un dns dans un lan privé accessible depuis l’extérieur en passant à travers un pare feux.

J'ai essayer de faire un masquerade sur le port 53, de transiter se port depuis eth0 vers eth1, mais rien n'y fait.

Si vous avez la solution, je suis preneur.

Merci.

Nils
Messages : 89
Inscription : 22 octobre 2009, 18:55

Re: Serveur DNS derrière pare feux.

Message par Nils » 19 juillet 2013, 13:53

Salut,

concernant l'accessibilité de ton serveur DNS depuis l'extérieur au niveau TCP/IP (et UDP), il te faut effectuer au niveau de ta machine "serveur" non seulement une ouverture de port, mais aussi une translation de port (d'après ton message, il me semble que ça, tu t'en es déjà rendu compte). Pour cela, moi j'effectue du DNAT au niveau de Netfilter. Voici quelques extraits de mon /etc/sysconfig/iptables (qui contient la configuration sauvegardée) :

Code : Tout sélectionner

-A PREROUTING -d @ip_publique@ -i eth0 -p tcp -m tcp --dport 53 -j DNAT --to-destination @ip_privee@:53 
-A PREROUTING -d @ip_publique@ -i eth0 -p udp -m udp --dport 53 -j DNAT --to-destination @ip_privee@:53
Ça, c'était la partie DNAT, mais si le port n'est pas ouvert, tu rediriges vers un port fermé, et ça marche moins bien. Donc, on ouvre le port 53 :

Code : Tout sélectionner

-A INPUT -d @ip_publique@ -i eth0 -p tcp --dport 53, -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -d @ip_publique@ -i eth0 -p udp --dport 53, -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
Si jamais tu as besoin d'ouvrir plusieurs ports en une règle, tu peux utiliser -m multiport --dports au lieu de --dport, et lister ensuite tes ports, séparés par une virgule.

Maintenant que ton accès est ouvert, parlons DNS. Ton problème est que tu souhaites que certains noms soient accessibles de l'extérieur de ton LAN, et d'autres non. Et pour couronner le tout, je vais partir du principe que tu aimerais que certains noms soient accessibles des deux côtés. Cela est faisable (la preuve, je le fais, et je ne suis très certainement pas le seul) et se pratique en utilisant deux possibilités de Bind : les ACL et les vues (view dans la terminologie de Bind). En fait, la solution, c'est d'avoir deux fichiers de zone que tu maintiens en parallèle : un pour ton lan (adressage 192.168.0.0/24) et un pour le reste du monde (adressage autre). Cela peut sembler un peu laborieux, mais ça se maintient relativement facilement.

Tu crées (dans ton named.conf) en premier lieu une ACL listant ton LAN, mais tu peux en mettre plusieurs. Voici un exemple :

Code : Tout sélectionner

acl "lan_hosts" {
        192.168.0.0/24; # ton lan
        192.168.1.0/24; # imaginons que tu crees un deuxieme lan
        127.0.0.1;  # ne pas oublier la loopback
};
Et ensuite (toujours dans le named.conf), tu insères tes déclarations de zone dans une vue. Exemple pour la vue de ton lan :

Code : Tout sélectionner

view "internal" {
        match-clients { lan_hosts; };
        recursion yes;
        notify no;


zone "example.org" {
        type master;
        notify no;
        file "internal/example.org"; # pense à changer l'endroit du fichier selon ta configuration    
};

zone "0.168.192.in-addr.arpa" {
        type master;    
        notify no;
        file "internal/0.168.192"; # pareil
};      

# plein d'autres zones ici, genre ".", "localhost", "127 bidule truc"
# et on n'oublie pas de fermer la déclaration de la vue :
}; 
Il te faut aussi la vue "de l'extérieur". Appelons-là "external" :

Code : Tout sélectionner

view "external" {
        match-clients { !lan_hosts; any; };
        match-recursive-only no;
        recursion no;
        notify yes;
        allow-query { any; };


zone "example.org" IN {
        type master;
        file "master/example.org";
        allow-transfer {@ip_du_dns_secondaire@; };
        allow-update { none; };  
};      

# encore d'autres zones ici selon le besoin, la zone inverse...
# et on n'oublie toujours pas de fermer la déclaration de la vue :
}; 
Voilà. Bon, c'est incomplet, mais ça te donne une base de départ (tu pourras regarder plus en détail dans un moteur de recherche ou dans la doc officielle Bind). Fais attention à l'emplacement des fichiers de zone, à SELinux et à ne pas déclarer d'adresse IP locale dans la vue "externe", car tes clients externes ne pourront pas accéder à "ton" 192.168.0.0/24 ;)

J'espère t'avoir aidé.

Répondre