404_crazy Tux's lil' helper
Joined: 22 Jan 2008 Posts: 145
|
Posted: Fri Jan 30, 2009 11:37 am Post subject: [SRIPT-PHP] Dns dynamique |
|
|
Bonjour je vous post un petit script sans pretention qui permet de faire un DNS Dynamique avec PHP
Dans cette exemple il est configuré pour un domain "test.net." avec un serveur nomé "www"
il faut aussi que votre dns soit configuré avec nsupdate
Ca fonctionne avec une authentification LDAP (Vous pouvez biensure changer ca)
le script crée un fichier par utilisateur (login_ldap) puis il excute nsupdate
n'esiter pas a mettre vos commentaires, j'ai une version plus aboutie mais je ne l'ai pas sous la main je vous post ca dés que possible.
Code: |
<html>
<br>
<?
//Detection IPv4 ou IPv6
class ipv6
{
function is_ipv6($ip = "")
{
if ($ip == "")
{ $ip = ipv6::get_ip(); }
if (substr_count($ip,":") > 0 && substr_count($ip,".") == 0)
{ return true; } else { return false; } }
function is_ipv4($ip = "")
{ return !ipv6::is_ipv6($ip); }
function get_ip()
{ return getenv ("REMOTE_ADDR"); }
}
echo "<center>";
//Affiche @ IP et nom DNS (reverse)
$ip_client = $_SERVER["REMOTE_ADDR"]; //Recuperation de l'ip de la station cliente
echo "<br><center><h1>Votre Adresse IP = ";
echo (ipv6::is_ipv6())? "IPv6/":"IPv4/";
echo ipv6::get_ip();
echo "</center></h1>";
$hostname = gethostbyaddr($ip_client);
echo "<center><h2>".$hostname."</center></h2>";
// A faire
// => afficher FAI
// tester IPv4 / IPv6
// ------------- ANTI BOT ----------------------------------
$captcha="";//mise a zero de la variable
//caractères utilisés
$car="0123456789";
//compte le nombre de caracteres pour $car
$wlong=strlen($car);
// definition de wpas et wpas2
$wpas="";
$wpas2="";
// Taille des operandes
$taille=2;
//Initialisation de la fonction aleatoire
srand((double)microtime()*1000000);
// depart de la boucle for pour le nombre de caracteres voulut
for($i=0;$i<$taille;$i++){
$wpos=rand(0,$wlong-1);
$wpas=$wpas.substr($car,$wpos,1);}
// On continue avec le caractère suivant à générer
srand((double)microtime()*100000);
for($i=0;$i<$taille;$i++){
$wpos2=rand(0,$wlong-1);
$wpas2=$wpas2.substr($car,$wpos2,1);
}
?>
<FORM METHOD=POST ACTION="index.php">
<table border=1>
<tbody>
<tr>
<td>Login :</td>
<td><INPUT type="text" value="" name="ldaplogin"></td>
</tr>
<tr>
<td>Password : </td>
<td><INPUT type="password" value="" name="ldappass"></td>
</tr>
<tr>
<td><?echo $wpas."+".$wpas2?><INPUT type="hidden" name= "verif" value="<?echo $wpas+$wpas2?>"> </td>
<td><INPUT type="text" value="" name="captcha"></td>
</tr>
<tr>
<tr>
<td>Groupe</td>
<td>
<SELECT name="ou">
<OPTION VALUE="grp1">grp1</OPTION>
<OPTION VALUE="grp2">grp2</OPTION>
<OPTION VALUE="grp3">grp3</OPTION>
<OPTION VALUE="grp4">grp4</OPTION>
<OPTION VALUE="grp5">grp5</OPTION>
</SELECT>
</td>
</tr>
</tbody>
</table>
<br>
<INPUT type="submit" value="Connexion">
</form>
</center>
<?php
/*
Connection a la base ldap puis generation d'un fichier portant le nom de l'utilisateur
version du 6/11/08
*/
error_reporting(E_ERROR | E_PARSE ); // on affiche toutes les erreurs sauf les erreurs de type E_WARNING
//(Pour evité les message d'erreurs si le login n'est pas bon ou la connexion n'est pas OK...)
$ldaplogin = "cn=".$_POST['ldaplogin'].",ou=".$_POST['ou'].",dc=test,dc=net"; // Definition de l'enregistrement dn
$ldappass = $_POST['ldappass']; //Definition de la variable contenant le mot de passe
$ip_client = $_SERVER["REMOTE_ADDR"]; //Recuperation de l'@ ip de la station cliente
$captcha = $_POST['captcha'];
$fichier_nom =$_POST['ldaplogin'] ; //Definition de la variable contenant le nom du fichier créé
// definition du contenu du fichier créé
$fichier =
"server 127.0.0.1
zone ".$_POST['ldaplogin'].".test.net
update delete ".$_POST['ldaplogin'].".test.net. A
update add ".$_POST['ldaplogin'].".test.net. 60 A ".$ip_client."
send
";
$nomDNS = $_POST['ldaplogin'].".test.net";
// Connection sur le serveur LDAP
$connect = ldap_connect("www.test.net")
or die("Impossible de se connecter au serveur LDAP.");
// Passage de ldap en version 3
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
//Connexion en anonymous si la captcha est valide.
if ($captcha==NULL){ echo "<center>Veuillez remplir tous les champs ci-dessus</center>";}
else
{
if ($captcha==$_POST['verif'])
{
$bind_test = ldap_bind($connect);
if ($bind_test != TRUE) { echo "Connexion LDAP échouée..."; }
else //serveur LDAP répond
{
$bind = ldap_bind($connect, $ldaplogin, $ldappass);
if ($bind != FALSE)
{ // Si LDAP accepte les login et mot de passe
echo "Authentification LDAP réussie ...<p>";
$inF = fopen("DDNS/".$fichier_nom,"w"); //Creation du fichier au nom de l'utilisateur
fwrite($inF,$fichier); //ecriture de $fichier de le fichier login.txt
fclose($inF); // fermeture du fichier
exec("nsupdate DDNS/".$fichier_nom , $out, $err ); // MAJ DDNS
if ($err !=0) { echo "code erreur = ".$err." " ;}
else {
if ( gethostbyname($nomDNS) == $ip_client )
{ echo $nomDNS." a pour adresse IP ".gethostbyname($nomDNS);
echo "<p><p>Services accessibles dans moins de 5 minutes";
echo "<p><p>Actualiser avant ce délai !";
//fichier avec seulement l'adresse IP
//".IPv4";
$inF = fopen("IPv4/".$fichier_nom,"w"); //Creation
fwrite($inF,$ip_client); //ecriture
fclose($inF); // fermeture
}// modif DDNS correspond à demande
else { echo "Echec mise à jour" ;} // @IP changée <> lue !!!
}// pas d'erreur DDNS
} //authentifié
else { echo "Mauvais mot de passe ou mauvais identifiant de login"; }
ldap_close($connect); // fermeture de la connexion LDAP
}// connexion LDAP
}//captcha
else { // si le captcha est vide ou faux
if ($captcha==NULL){ echo "<center>Veuillez remplir tous les champs ci-dessus</center>";}
else {echo "Code de verification incorrect !"; }
}//captcha vide
}//captcha pas vide
// <Copyleft 404_crazy 2008>
?>
<html>
|
|
|