亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: b.s.d
打印 上一主題 下一主題

[FreeBSD] [發(fā)表]FreeBSD全能服務(wù)器安裝手冊v0.0.7 [復(fù)制鏈接]

論壇徽章:
0
21 [報(bào)告]
發(fā)表于 2006-06-20 11:49 |只看該作者
if(!mysql_query("UPDATE users SET Password='".md5($_POST['password_box'])."',
                                              Uid='".$_POST['uid_box']."',
                                              Gid='".$_POST['gid_box']."',
                                              Dir='".$_POST['dir_box']."',
                                              QuotaFiles='".$_POST['quotafiles_box']."',
                                              QuotaSize='".$_POST['quotasize_box']."',
                                              ULBandwidth='".$_POST['ulbandwidth_box']."',
                                              DLBandwidth='".$_POST['dlbandwidth_box']."'
                                              WHERE User='".$_POST['user_box']."'",$mysql_ftp))
            {
              echo $Translate[5][$LANG];
            }else
            {
              echo ("<script language=\"JavaScript\" type=\"text/javascript\">\n");
                         echo ("<!--\n\n");
                         echo ("  alert(\"".$Translate[6][$LANG]."\");\n\n");
                  echo ("-->\n");
                         echo ("</script>\n");
            }

          }
        }

      }else
      {
        // echo ("empty_password  = $empty_password <br>\n");
        // echo ("vallid_password = $vallid_password <br>\n");

        /* Create new User */
        if ($vallid_password == 0 || $empty_password == 1)
        {
          echo ("<script language=\"JavaScript\" type=\"text/javascript\">\n");
                     echo ("<!--\n\n");
                     echo ("  alert(\"".$Translate[3][$LANG]."\");\n\n");
                     echo ("-->\n");
                     echo ("</script>\n");
                     $data_saved = 0;
        }else
        {
          if(!mysql_query("INSERT INTO users (User,Password,Uid,Gid,Dir,QuotaFiles,QuotaSize,ULBandwidth,DLBandwidth)
                                             VALUES ('".$_POST['user_box']."',
                                                     '".md5($_POST['password_box'])."',
                                                     '".$_POST['uid_box']."',
                                                     '".$_POST['gid_box']."',
                                                     '".$_POST['dir_box']."',
                                                     '".$_POST['quotafiles']."',
                                                     '".$_POST['quotasize']."',
                                                     '".$_POST['ulbandwidth_box']."',
                                                     '".$_POST['dlbandwidth_box']."')",$mysql_ftp))
          {
            echo $Translate[5][$LANG];
          }
        }
      }
      $table_archief  = "SELECT * FROM users ORDER BY User ASC";
      $query_archief  = mysql_query($table_archief);
      $length_archief = mysql_numrows($query_archief);
    }


    if(isset($_GET['delete']))
    {

      if(!mysql_query("DELETE FROM users WHERE User='".$_GET['user_box']."'",$mysql_ftp))
      {
         echo $Translate[5][$LANG];
      }else
      {
        $table_archief  = "SELECT * FROM users ORDER BY User ASC";
        $query_archief  = mysql_query($table_archief);
        $length_archief = mysql_numrows($query_archief);
      }
      $new=1;
    }

    function help($help_text)
    {
      global $LocationImages;
      echo ("<img class=help src=\"$LocationImages/info.gif\" height=\"16\" width=\"16\"");
      echo (" title=\"$help_text\" hspace=\"1\" align=\"middle\" border=\"0\">");
    }


    echo ("<html>\n");
    echo ("<head>\n");
    echo ("<title>".$Translate[0][$LANG]." (".$Translate[1][$LANG].")</title>\n");
    echo ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\n");
?>

<script language="JavaScript" type="text/javascript">
<!--

function danger_url(user,urlv)
{
  var user_input = confirm('<?=$Translate[7][$LANG]?> "'+user+'" <?=$Translate[8][$LANG]?>');
  if (user_input == true)
  {
        location =  urlv;
  }

}

-->
</script>


<?php

   print("<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\" />\n");
   echo ("</head>\n");
   echo ("<body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#000000\" >\n");


   // phpinfo();



   echo ("<form action=\"$_SERVER[PHP_SELF]\" method=\"post\" name=\"newuserform\">\n");
   echo ("<div align=\"center\">\n");


   echo ("<table bgcolor=\"3F4F70\" border=\"0\" cellpadding=\"1\" cellspacing=\"1\" width=\"850\">\n");
   echo ("<tr bgcolor=\"#FFFFFF\">\n");
   echo ("<td>\n");

   echo ("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"850\">\n");
     echo ("<tr>\n");
     echo ("<td>\n");
     echo ("<font size=\"+1\">&nbsp;".$Translate[0][$LANG]."</font>\n");
     echo ("</td>\n");
     echo ("<td align=\"right\">");
     echo ("<a href=\"$_SERVER[PHP_SELF]?new=1\">");
     echo ("<img hspace=\"1\" src=\"$LocationImages/new_ftpuser.gif\" width=\"16\" height=\"21\" align=\"absmiddle\" border=\"0\">");
     echo ("&nbsp;".$Translate[9][$LANG]."&nbsp;</a>");
     echo ("</td>\n");
     echo ("</tr>\n");
   echo ("</table>\n");
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#FFFFFF\">\n");
   echo ("<td>\n");
   echo ("<table width=\"850\" border=\"0\">\n");

   echo ("<tr bgcolor=\"#336699\">\n");
   echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[10][$LANG]."</b></font></td>");
    // echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[11][$LANG]."</b></font></td>");
   echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[12][$LANG]."</b></font></td>");
   echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[13][$LANG]."</b></font></td>");
   echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[14][$LANG]."</b></font></td>");
   echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[35][$LANG]."</b></font></td>");
   echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[36][$LANG]."</b></font></td>");
   echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[15][$LANG]."</b></font></td>");
   echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[16][$LANG]."</b></font></td>");
   echo ("<td width=\"\" align=\"left\"><font color=#ffffff><b>".$Translate[17][$LANG]."</b></font></td>");
   echo ("</tr>\n");


   $iCounter = 0;

   while ($iCounter < $length_archief)
   {

     $user         = mysql_result($query_archief,$iCounter,"User");
     $password     = mysql_result($query_archief,$iCounter,"Password");
     $uid          = mysql_result($query_archief,$iCounter,"Uid");
     $gid          = mysql_result($query_archief,$iCounter,"Gid");
     $dir          = mysql_result($query_archief,$iCounter,"Dir");
     $quotafiles   = mysql_result($query_archief,$iCounter,"QuotaFiles");
     $quotasize    = mysql_result($query_archief,$iCounter,"QuotaSize");
     $ulbandwidth  = mysql_result($query_archief,$iCounter,"ULBandwidth");
     $dlbandwidth  = mysql_result($query_archief,$iCounter,"DLBandwidth");

     echo ("<tr bgcolor=\"#C3D6E6\">\n");

     echo ("<td align=\"left\"><a href=\"$_SERVER[PHP_SELF]?id=$user\">");
     echo ("<img src=\"$LocationImages/ftpuser.gif\" width=\"16\" height=\"18\" alt=\"".$Translate[19][$LANG]."\" border=\"0\">$user</a></td>\n");

     echo ("<td align=\"left\">".$uid."</td>\n");
     echo ("<td align=\"left\">".$gid."</td>\n");
     echo ("<td align=\"left\">".$dir."</td>\n");
     echo ("<td align=\"left\">".$quotafiles."</td>\n");
     echo ("<td align=\"left\">".$quotasize."</td>\n");
     echo ("<td align=\"left\">".$ulbandwidth."</td>\n");
     echo ("<td align=\"left\">".$dlbandwidth."</td>\n");
     echo ("<td align=\"center\" width=\"100\">");


     /* Edit ftp account */
     echo ("<a href=\"$_SERVER[PHP_SELF]?id=$user\">");
     echo ("<img src=\"$LocationImages/edit.gif\"  width=\"16\" height=\"18\" border=\"0\" ");

論壇徽章:
0
22 [報(bào)告]
發(fā)表于 2006-06-20 11:50 |只看該作者
echo ("title=\"".$Translate[19][$LANG]."\" ");
     echo ("alt=\"".$Translate[19][$LANG]."\"></a>&nbsp;&nbsp;");

     /* Delete ftp account */
     echo ("<a href=\"$_SERVER[PHP_SELF]\" onClick=\"danger_url('$user',this.href+'?delete=1&user_box=$user');return false;\">");
     echo ("<img src=\"$LocationImages/delete.gif\" width=\"15\" height=\"16\" border=\"0\" ");
     echo ("title=\"".$Translate[20][$LANG]."\" ");
     echo ("alt=\"".$Translate[20][$LANG]."\"></a>&nbsp;&nbsp;");
       // <img src="connect2.gif" width="16" height="18">

     /* Open ftp account */
     echo ("<a href=\"ftp://$user@".$FTPAddress."\" target=\"_blank\">");
     echo ("<img src=\"$LocationImages/connect.gif\" width=\"16\" height=\"18\" border=\"0\" ");
     echo ("title=\"".$Translate[21][$LANG]."\" ");
     echo ("alt=\"".$Translate[21][$LANG]."\"></a>");

     echo ("</td>\n");
     echo ("</tr>\n");
     $iCounter++;
   }

   echo ("</table>\n");
   echo ("</td>\n");
   echo ("</tr>\n");
   echo ("</table>\n");

   $password = "empty";

   if(!empty($_GET['id']))
   {
       $iCounter=0;

       while ($iCounter < $length_archief)
       {

         $bericht_nr = mysql_result($query_archief,$iCounter,"User");
         if ($bericht_nr == $_GET['id'])
         {
           $user         = $bericht_nr;
           // $password     = mysql_result($query_archief,$iCounter,"Password");
           $uid          = mysql_result($query_archief,$iCounter,"Uid");
           $gid          = mysql_result($query_archief,$iCounter,"Gid");
           $dir          = mysql_result($query_archief,$iCounter,"Dir");
           $quotafiles   = mysql_result($query_archief,$iCounter,"QuotaFiles");
           $quotasize    = mysql_result($query_archief,$iCounter,"QuotaSize");
           $ulbandwidth  = mysql_result($query_archief,$iCounter,"ULBandwidth");
           $dlbandwidth  = mysql_result($query_archief,$iCounter,"DLBandwidth");
           break;
         }
         $iCounter++;
       }
   }else if(empty($new))
   {

     // $_GET['id']
     // $_POST['']
     $user         = $_POST['user_box'];
     $password     = "empty";
     $uid          = $_POST['uid_box'];
     $gid          = $_POST['gid_box'];
     $dir          = $_POST['dir_box'];
     $ulbandwidth  = $_POST['ulbandwidth_box'];
     $dlbandwidth  = $_POST['dlbandwidth_box'];

   }else
   {
     $user         = $Translate[22][$LANG];
     $password     = "";
     $uid          = $DEFUserID;
     $gid          = $DEFGroupID;
     $dir          = "/";
     $ulbandwidth  = "80";
     $dlbandwidth  = "5";

   }

   if(isset($_POST['select_user']) &&
      $_POST['select_user'] != $select_user_old &&
      !isset($_POST['save']))
   {

      $uid = $_POST['select_user'];
      $password = $_POST['password_box'];
   }

   if(isset($_POST['select_group']) &&
      $_POST['select_group'] != $select_group_old &&
      !isset($_POST['save']))
   {
      $gid = $_POST['select_group'];
      $password = $_POST['password_box'];
   }



  session_register("select_group_old");
  session_register("select_user_old");




   echo ("<br><br>");
   echo ("<table width=\"850\" border=\"0\" cellpadding=\"2\" cellspacing=\"1\" bgcolor=\"#000000\">\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[10][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");
   echo ("<input type=\"text\" name=\"user_box\" size=\"10\" maxlength=\"16\" value=\"$user\">\n");
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[11][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");
   // echo ("<input type=\"text\" name=\"password_box\" size=\"20\" maxlength=\"64\" value=\"$password\">\n");
   echo ("<input type=\"password\" name=\"password_box\" size=\"20\" maxlength=\"64\" value=\"$password\">\n");
   // echo ("$password <br>\n");
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[23][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");
   // echo ("<input type=\"text\" name=\"password_box\" size=\"20\" maxlength=\"64\" value=\"$password\">\n");
   echo ("<input type=\"password\" name=\"confirm_password_box\" size=\"20\" maxlength=\"64\" value=\"$password\">\n");

   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[12][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");





   echo ("<select name=\"select_user\" onchange='document.newuserform.uid_box.value=this.value;' style='width: 100px;'>");
   echo ("<option value=\"\">select user</option>");
   $iCounter = 0;
   $iFound_uid = 0;
   while ($iCounter < $iNrofunixusers)
   {
      echo ("<option value=\"".$unix_users[$iCounter][1]."\"");
      if ($uid == $unix_users[$iCounter][1])
      {
        echo (" selected=\"selected\"");
        $select_user_old = $unix_users[$iCounter][1];
        $iFound_uid = 1;

      }
      echo (">".$unix_users[$iCounter][0]."</option>");
      $iCounter++;
   }


   echo ("</select>\n");

      echo ("<img src=\"$LocationImages/arrow_right.gif\" height=\"10\" width=\"10\"");
      echo (" hspace=\"1\" align=\"middle\" border=\"0\"> ");

   echo ("<input type=\"text\" name=\"uid_box\" size=\"11\" maxlength=\"11\" value=\"$uid\">\n");
   help($Translate[26][$LANG]);
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[13][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");

   echo ("<select name=\"select_group\" onchange='document.newuserform.gid_box.value=this.value;' style='width: 100px;'>");
   echo ("<option value=\"\">select group</option>");
   $iCounter = 0;

   $iFound_gid = 0;
   while ($iCounter < $iNrofunixgroups)
   {
     echo ("<option value=\"".$unix_groups[$iCounter][1]."\"");
     if ($gid == $unix_groups[$iCounter][1])
     {
        echo (" selected=\"selected\"");
        $select_group_old = $unix_groups[$iCounter][1];
        $iFound_gid = 1;

     }
     echo (">".$unix_groups[$iCounter][0]."</option>");
     $iCounter++;
   }


   echo ("</select>\n");

      echo ("<img src=\"$LocationImages/arrow_right.gif\" height=\"10\" width=\"10\"");
      echo (" hspace=\"1\" align=\"middle\" border=\"0\"> ");

   echo ("<input type=\"text\" name=\"gid_box\" size=\"11\" maxlength=\"11\" value=\"$gid\">\n");
   help($Translate[27][$LANG]);
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[14][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");
   echo ("<input type=\"text\" name=\"dir_box\" size=\"40\" maxlength=\"128\"

論壇徽章:
0
23 [報(bào)告]
發(fā)表于 2006-06-20 11:50 |只看該作者
value=\"$dir\">\n");
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[35][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");
   echo ("<input type=\"text\" name=\"quotafiles_box\" size=\"10\" maxlength=\"10\" value=\"$quotafiles\">\n");
   help($Translate[37][$LANG]);
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[36][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");
   echo ("<input type=\"text\" name=\"quotasize_box\" size=\"10\" maxlength=\"10\" value=\"$quotasize\">\n");
   help($Translate[38][$LANG]);
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[24][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");
   echo ("<input type=\"text\" name=\"ulbandwidth_box\" size=\"10\" maxlength=\"10\" value=\"$ulbandwidth\">\n");
   help($Translate[28][$LANG]);
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td width=\"140\">".$Translate[25][$LANG]."</td>\n");
   echo ("<td>\n&nbsp;");
   echo ("<input type=\"text\" name=\"dlbandwidth_box\" size=\"10\" maxlength=\"10\" value=\"$dlbandwidth\">\n");
   help($Translate[29][$LANG]);
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("<tr bgcolor=\"#D4D0C8\">\n");
   echo ("<td colspan=\"2\" align=\"center\">\n");
   echo ("<input name=\"save\" type=\"submit\" value=\"".$Translate[32][$LANG]."\">\n");
   echo ("</td>\n");
   echo ("</tr>\n");

   echo ("</table>\n");
   echo ("</div>\n");


   if ($iFound_uid == 0)
     $select_user_old = "";

   if ($iFound_gid == 0)
     $select_group_old = "";


   // echo ("select_user_old = $select_user_old<br>\n");
   // echo ("select_group_old = $select_group_old<br>\n");

   echo ("</body>\n");
   echo ("</html>\n");
  }
?>


%%%%%%%%%%%%%%%%%%%% config.php%%%%%%%%%%%%%%%%%%%%%%
<?php
  /* 'User Management for PureFTPd server' is made by M.Mastenbroek 2002 - 2004
   *  For more info look at http://machiel.generaal.net
   *  Version 1.3.1
   */

  require 'language.php';

  $LANG = $ZH_CN;                     // Language (Options are $DUTCH, $ENGLISH, $PT_BR, $RUSSIAN
                                      //           $SPANISH, $COREAN, $FRENCH, $HUNGARIAN, $GERMAN
                                      //           $TURKISH, $DANISH , $NORWEGIAN or $ZH_CN)

$LocationImages =  "images";        // Location of images

$DBHost = "localhost";              // Ip-adres of MySQL server
                                      // (Don抰 change this if you are using the default database)

$DBLogin = "ftp";                   // Username of MySQL user

  $DBPassword = "e89120d9dfeb";          // Password of MySQL user

  $DBDatabase = "ftpusers";           // Name of database

  $FTPAddress = "222.36.42.111:21"; // Domain name or ip-address of your ftp server

  $DEFUserID = "2000"; // nobody     // Default user id of virtual ftp user.

  $DEFGroupID = "2000";   // guest      // Default group is of virtual ftp user.

  $UsersFile = "/etc/passwd";        // The unix user file

  $GroupFile = "/etc/group";         // The unix group file

  /* This list of users will not appear in the dropdown menu. */
  $BlacklistUsers = array ('adm','bin','bind','daemon','gopher','halt','kmem','lp',
                           'mailnull','man','named','nfsnobody','nscd','operator',
                           'pop','root','rpc','rpcuser','rpm','shutdown','smmsp',
                           'sshd','sync','toor','tty','uucp','vcsa','xfs');

  /* This list of groups will not appear in the dropdown menu. */
  $BlacklistGroups = array ('adm','bin','bind','daemon','dialer','dip','disk','floppy','gopher','kmem',
                           'lock','lp','mailnull','man','named','mem','network','news',
                           'nscd','ntp','operator','pcap','root','rpc','rpcuser','rpm','slocate','smmsp',
                           'sshd','staff','sys','tty','utmp','uucp','vcsa','wheel','xfs');


?>

%%%%%%%%%%%%%%%%%%%% index.php%%%%%%%%%%%%%%%%%%%%%%

<?php

  session_start();

  require 'config.php';

  if(!mysql_connect("$DBHost", "$DBLogin", "$DBPassword"))
  {
    echo $Translate[2][$LANG];
  } else
  {
    @mysql_select_db("$DBDatabase");
  }

  $table_gebruikers  = "SELECT * FROM admin ORDER BY Username ASC";
  $query_gebruikers  = mysql_query($table_gebruikers);
  $length_gebruikers = mysql_num_rows($query_gebruikers);

  if ($_POST['Submit'])
  {

    $LoginNaam = addslashes($_POST['LoginNaam']);
    $LoginPassword = addslashes($_POST['LoginPassword']);

    $Query = mysql_query("SELECT * FROM admin WHERE Username = '$LoginNaam' AND Password = '".md5($LoginPassword)."'");
    $Results = mysql_num_rows($Query);

    if ($Results == '1')
    {
       $_SESSION['Login'] = 1;
       session_register("Login");
       header("location: admin.php?new=1");
    }
  }

?>

<html>
<head>
<title><?=$Translate[30][$LANG]." (".$Translate[0][$LANG]." - ".$Translate[1][$LANG].")"?></title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body bgcolor="#FFFFFF" text="#000000" marginwidth="0" marginheight="0">
<div align="center"><br>
  <br>
  <br>
  <form method="post" action="index.php">
    <input type="hidden" name="Submit" value="1">

    <?php
      if ($Results != '1' && isset($_POST['Submit']))
      {
     //   echo("<tr>\n");
     //   echo("<td bgcolor=\"#FFFFFF\" align=\"center\">\n");
        echo("<font color=\"#FF0000\">".$Translate[31][$LANG]."</font>\n<br>\n<br>\n");
     //   echo("</td>\n");
     //   echo("</tr>\n");
      }
    ?>


    <table border="0" bgcolor="#000000" cellpadding="1" cellspacing="0">
    <tr>
    <td>
    <table border="0" bgcolor="#CCCCCC" cellpadding="0" cellspacing="0">
      <tr>
        <td height="0"></td>
      </tr>
      <tr>
        <td>
          <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tr>
              <td colspan="2" background="<?=$LocationImages?>/top.gif"><img src="<?=$LocationImages?>/left_top.gif" width="15" height="15"><img src="<?=$LocationImages?>/login.gif" width="28" height="11"></td>
              <td width="15"><img src="<?=$LocationImages?>/right_top.gif" width="15" height="15"></td>
            </tr>
            <tr>
              <td width="15" background="<?=$LocationImages?>/left.gif">&nbsp;</td>
              <td>
                <table border="0" width="100%">
                  <tr>
                    <td height="7"></td>
                    <td></td>
                    <td></td>
                  </tr>
                  <tr>
                    <td width="40" align="center"> <img

論壇徽章:
0
24 [報(bào)告]
發(fā)表于 2006-06-20 11:51 |只看該作者
src="<?=$LocationImages?>/user.gif" width="16" height="24"></td>
                    <td><?=$Translate[10][$LANG]?><br>
                      <select name="LoginNaam">
                      <?php
                         $iCounter = 0;
                         while ($iCounter < $length_gebruikers)
                         {
                           $naam = mysql_result($query_gebruikers,$iCounter,"Username");
                           echo ("<option>$naam</option>\n");
                           $iCounter++;
                         }
                      ?>
                      </select>
                    </td>
                    <td width="17">&nbsp;</td>
                  </tr>
                  <tr>
                    <td height="10"></td>
                    <td></td>
                    <td></td>
                  </tr>
                  <tr>
                    <td width="40" align="center"> <img src="<?=$LocationImages?>/key.gif" width="28" height="32"></td>
                    <td><?=$Translate[11][$LANG]?>:<br>
                      <input type="password" name="LoginPassword" size="20">
                    </td>
                    <td width="17">&nbsp;</td>
                  </tr>
                </table>
              </td>
              <td width="15" background="<?=$LocationImages?>/right.gif">&nbsp;</td>
            </tr>
            <tr>
              <td colspan="2" background="<?=$LocationImages?>/top.gif"><img src="<?=$LocationImages?>/left_bottom.gif" width="15" height="15"></td>
              <td width="15" ><img src="<?=$LocationImages?>/right_bottom.gif" width="15" height="15"></td>
            </tr>
          </table>
        </td>
      </tr>
      <tr>
        <td>
          <table border="0" width="100%" cellspacing="3">
            <tr>
              <td align="right">
                <input type="submit" name="submit" value="登錄">
                      &nbsp;
              </td>
            </tr>
          </table>
        </td>
      </tr>
    </table>
        </td>
      </tr>
    </table>
    <p>&nbsp;</p>
  </form>
</div>
</body>
</html>


%%%%%%%%%%%%%%%%%%% language.php%%%%%%%%%%%%%%%%%%%%%
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<?php
  $ZH_CN         = 12; /* ZH_CN translated by Kevin Xu */
  $Translate[0][$ZH_CN]                = "PureFTPd服務(wù)用戶管理";
  $Translate[1][$ZH_CN]          = "Version 1.3.1";
  $Translate[2][$ZH_CN]         = "數(shù)據(jù)庫服務(wù)沒有啟動(dòng),請稍后再試。";
  $Translate[3][$ZH_CN]         = "您的密碼不正確,當(dāng)前所做的修改將不能保存。";
  $Translate[4][$ZH_CN]                = "密碼將被設(shè)置為默認(rèn)值并保存所有修改。";
  $Translate[5][$ZH_CN]           = "不合法的查詢,請聯(lián)系管理員。";
  $Translate[6][$ZH_CN]           = "修改已經(jīng)保存。";
  $Translate[7][$ZH_CN]           = "FTP用戶";
  $Translate[8][$ZH_CN]           = "將被刪除。";
  $Translate[9][$ZH_CN]           = "新建用戶";
  $Translate[10][$ZH_CN]            = "用戶名";
  $Translate[11][$ZH_CN]            = "密碼";
  $Translate[12][$ZH_CN]            = "用戶id";
  $Translate[13][$ZH_CN]            = "用戶組id";
  $Translate[14][$ZH_CN]            = "用戶主目錄";
  $Translate[15][$ZH_CN]            = "上傳速度(Kb/s)";
  $Translate[16][$ZH_CN]            = "下載速度(Kb/s)";
  $Translate[17][$ZH_CN]            = "設(shè)置";
  $Translate[19][$ZH_CN]            = "編輯";
  $Translate[20][$ZH_CN]           = "刪除";
  $Translate[21][$ZH_CN]           = "打開";
  $Translate[22][$ZH_CN]           = "用戶名";
  $Translate[23][$ZH_CN]           = "密碼確認(rèn)";
  $Translate[24][$ZH_CN]           = "上傳速度(Kb/s)";
  $Translate[25][$ZH_CN]           = "下載速度(Kb/s)";
  $Translate[26][$ZH_CN]          = "FTP用戶等同于UNIX系統(tǒng)中哪個(gè)系統(tǒng)用戶。";
  $Translate[27][$ZH_CN]           = "FTP用戶組等同于UNIX系統(tǒng)中哪個(gè)系統(tǒng)組。";
  $Translate[28][$ZH_CN]           = "FTP用戶的最大上傳速度(Kb/s)。";
  $Translate[29][$ZH_CN]           = "FTP用戶的最大下載速度(Kb/s)。";
  $Translate[30][$ZH_CN]           = "登錄頁面";
  $Translate[31][$ZH_CN]           = "錯(cuò)誤的用戶和密碼。";
  $Translate[32][$ZH_CN]           = "保存";
  $Translate[33][$ZH_CN]           = "";
  $Translate[34][$ZH_CN]           = "";
  $Translate[35][$ZH_CN]           = "文件限額";
  $Translate[36][$ZH_CN]           = "磁盤限額(Mb)";
  $Translate[37][$ZH_CN]           = "FTP用戶上傳最大文件數(shù)。";
  $Translate[38][$ZH_CN]           = "FTP用戶上傳最大磁盤空間(Mb)。";
?>


%%%%%%%%%%%%%%%%%%%% style.css%%%%%%%%%%%%%%%%%%%%%%%


a {
    font-face: Verdana, Arial, Helvetica, sans-serif;
    text-decoration:none;
    color: #000000;
    font-size: 14px;
}

a:visited {
    text-decoration: none;
    color: default;
}

a:hover {
    font-face: Verdana, Arial, Helvetica, sans-serif;
    text-decoration: underline;
    color: #FF0000;
    font-size: 14px;
}

.help {
    cursor: help
}

論壇徽章:
0
25 [報(bào)告]
發(fā)表于 2006-06-20 11:52 |只看該作者
FreeBSD全能服務(wù)器安裝手冊之文件服務(wù)器篇
--用戶密碼自主管理篇




##############################增加FTP密碼自助修改功能#########################

%%%%%%%%%%%%%%%%%%%%%config.php%%%%%%%%%%%%%%%%%%%%%

<?
$local="localhost";
$u_name="ftp";
$cpasswd="e89120d9dfeb";
$db_name="ftpusers";
//用戶名、密碼、數(shù)據(jù)庫名字請自行修改為自己的
?>

<?
function local(){
   global $local;
   return $local;
}
function u_name(){
   global $u_name;
   return $u_name;
}
function passwd(){
   global $cpasswd;
   return $cpasswd;
}
function db_name(){
   global $db_name;
   return $db_name;
}
?>

%%%%%%%%%%%%%%%%%%%%connect.php%%%%%%%%%%%%%%%%%%%%%

<?
$connectino=mysql_connect(local(),u_name(),passwd()) or die ("數(shù)據(jù)庫連接失敗");
$select=mysql_select_db(db_name()) or die ("數(shù)據(jù)庫打開失敗");
?>

%%%%%%%%%%%%%%%%%%%index.php%%%%%%%%%%%%%%%%%%%%%%%
<?php
require("config.php");

if(!empty($_GET["action"])) {
   if($_GET["action"]=="edit"){
      require("connect.php");
      $flag=0;

       if(empty($_POST['passwd'])){
         $flag=1;
         echo "<script>alert('錯(cuò)誤:原密碼不能為空!');history.go(-1)</script>";
      }
       if(empty($_POST['passwd1'])){
         $flag=1;
         echo "<script>alert('錯(cuò)誤:新密碼不能為空!');history.go(-1)</script>";
      }
       if(empty($_POST['passwd2'])){
         $flag=1;
         echo "<script>alert('錯(cuò)誤:確認(rèn)新密碼不能為空!');history.go(-1)</script>";
      }
       if((strlen($_POST["passwd1"])<1)||(strlen($_POST["passwd1"])>100)){
         $flag=1;
         echo "<script>alert('錯(cuò)誤:您的新密碼長度應(yīng)該在8-16個(gè)字符之間');history.go(-1)</script>";   
      }
       if((strlen($_POST["passwd2"])<1)||(strlen($_POST["passwd2"])>100)){
         $flag=1;
         echo "<script>alert('錯(cuò)誤:您的新密碼長度應(yīng)該在8-16個(gè)字符之間');history.go(-1)</script>";   
      }
       if($_POST["passwd1"]!=$_POST["passwd2"]){
         $flag=1;
         echo "<script>alert('錯(cuò)誤:兩次 新密碼輸入不一致 !');history.go(-1)</script>";
      }
      $passwd_old=md5($_POST['passwd']);
       $passwd_new=md5($_POST['passwd1']);

if($flag==0){
         $sql="select * from users where User='".$_POST['User']."' and Password='".$passwd_old."'";
         $result=mysql_query($sql);
         $myrow1=mysql_num_rows($result);
         if($myrow1==0){
            echo "<script>alert('原密碼錯(cuò)誤,請重新輸入!');history.go(-1)</script>";
         }else{
            $sql ="update users set Password='".$passwd_new."' where User='".$_POST['User']."'";
            $resulta=mysql_query($sql);
            echo "修改成功!";
         }
      }
   }
}else{
   ?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>--修改密碼</title>
</head>

<body>
<form name="form1" method="post" action="index.php?action=edit">
<table width="300" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#666666">
   <tr>
     <td><table width="300" border="0" cellspacing="1" cellpadding="0">
         <tr>
           <td height="22"><font color="#ffffff" class="pt9"><strong>修改FTP服務(wù)器登陸密碼</strong></font></td>
         </tr>
        <tr>
           <td bgcolor="#FFFFFF"><span class="pt9">  用戶名:</span>
         <input name="User" style="border-style:solib;border-color:'#333333';border-width:1;" type="text" size="20"></td>
         </tr>
         <tr>
           <td bgcolor="#FFFFFF"><span class="pt9">  原密碼:</span>
         <input name="passwd" style="border-style:solib;border-color:'#333333';border-width:1;" type="password" size="20"></td>
         </tr>
         <tr>
           <td bgcolor="#FFFFFF"><span class="pt9">  新密碼:</span>
         <input name="passwd1" style="border-style:solib;border-color:'#333333';border-width:1;" type="password" size="20"></td>
         </tr>
         <tr>
           <td bgcolor="#FFFFFF"><span class="pt9"> 密碼確認(rèn):</span>   
         <input name="passwd2" style="border-style:solib;border-color:'#333333';border-width:1;" type="password" size="20"> </td>
         </tr>
         <tr>
           <td height="22" bgcolor="#999999">      
             <input type="submit" name="Submit" value="提交"> 
             <input type="reset" name="Submit2" value="還原"></td>
         </tr>
     </table></td>
   </tr>
</table>
</form>
</body>
</html>
<?php
}
?>


%%%%%%%%%%%%%%%%%建立對應(yīng)連接或虛擬主機(jī)%%%%%%%%%%%%%%%%%
編輯httpd.conf
ee /usr/local/etc/apache/httpd.conf

添加虛擬主機(jī) passwd.chb.com

<VirtualHost 192.168.0.205>
DocumentRoot /home/passwd
ServerName passwd.chb.com
<Directory "/home/passwd ">
allow from all
Options +Indexes
</Directory>
</VirtualHost>
當(dāng)然DNS里也要添加相應(yīng)指向
測試FTP密碼自助修改功能
http://passwd.chb.com

論壇徽章:
0
26 [報(bào)告]
發(fā)表于 2006-06-20 11:53 |只看該作者
FreeBSD全能服務(wù)器安裝手冊之文件服務(wù)器篇
--安裝參數(shù)詳解篇




--with-everything: 編譯一個(gè)幾乎所有特性都開啟的“大”服務(wù)器。

--with-paranoidmsg: 當(dāng)該參數(shù)被開啟,不論何種原因登錄失敗都將顯示同樣的信息給用戶。不開啟該參數(shù)是,密碼問題將顯示“驗(yàn)證失敗”,被禁止用戶將顯示“對不起,我不信任你”。

--with-virtualchroot:通常一個(gè)用戶使用chrooted(使用-A 和 -a 參數(shù))命令不會(huì)轉(zhuǎn)出他的home目錄。開啟該功能之后將使其成為可能:符號(hào)連接總是一起作用,甚至他們指向的目錄不在用戶的home目錄內(nèi)。這對于共享路徑是一個(gè)非常擁有的功能(例如,每一個(gè)home目錄下都有一個(gè)符號(hào)連接到/var/incoming)。該功能默認(rèn)不開啟。

--with-tls \

--with-largefile: 支持在32位架構(gòu)下下載大于2 gigabytes 的文件。通過FTP傳輸一個(gè)如此之大的文件是一個(gè)較為奇怪的主意。并且你的文件系統(tǒng),你的系統(tǒng)內(nèi)核、你的FTP客戶端也需要支持才行。并且當(dāng)該功能被開啟后,下載將會(huì)比不開啟變慢(或需要耗費(fèi)更多的CPU)。簡單的說,不要應(yīng)為好玩而開啟該功能,除非你真的計(jì)劃下載大于gigabytes的文件。

--with-welcomemsg: (為兼容)其它FTP服務(wù)器pure-ftp可以閱讀 'welcome.msg' 。這是一個(gè)安全的缺陷(匿名用戶可以上載'welcome.msg'文件到隨機(jī)顯示)。Pure-ftpd 默認(rèn)使用 '.banner'文件。

--with-uploadscript: 自從0.98版開始, Pure-FTPd 開始關(guān)注上傳。當(dāng)一個(gè)上傳成功完成之后,任何額外的程序或腳本可以被自動(dòng)啟動(dòng)。該功能需要一個(gè)稱為“pure-uploadscript”的程序安裝在Pure-FTPd包內(nèi)。

--with-cookie: 在用戶登錄的時(shí)候顯示隨機(jī)或定制的信息。

--with-virtualhosts: 支持虛擬主機(jī)。這意味著每個(gè)IP地址可以有不同的匿名FPT區(qū)域。如果服務(wù)器只有一個(gè)IP地址,就不需要該功能。但是如果有多個(gè)IP地址,并且需要一個(gè)客戶端連接到IP xxx 去獲得/etc/pure-ftpd/xxx/而不是~ftp/,就可以開啟該功能。

--with-virtualroot \ //虛擬root支持

--with-diraliases: 支持路徑的別名。

--with-quotas: 開啟虛擬限額,可以限制一個(gè)用戶可以在他的帳號(hào)下存儲(chǔ)的最大數(shù)字,也可以限制總的大小。

--with-sysquotas: 支持系統(tǒng)限額(非Pure-ftpd的虛擬限額)。只有在計(jì)劃使用系統(tǒng)限額的時(shí)候啟用。

--with-ratios: 支持上傳/下載比。

--with-ftpwho: 支持'pure-ftpwho' 命令。開啟這個(gè)功能需要額外的內(nèi)存。當(dāng)pure-ftp運(yùn)行在standalone模式時(shí)比較好,在inetd模式下啟用較慢。

--with-throttling: 支持帶寬限制。


其它參數(shù)


--with-altlog: 除了系統(tǒng)輸出,還支持一些特殊的文件格式,目前已實(shí)現(xiàn)了:CLF, Stats, W3C 和 xferlog 格式
CLF (通用日志格式)是Apache, WebFS, Roxen以及其它最常用 web 服務(wù)器的基本格式;該日志文件僅僅記錄文件傳輸,可以被web流量統(tǒng)計(jì)軟件(Analog, Webalizer, etc.) 所分析。Stats格式是一種專門為日志文件分析軟件設(shè)計(jì)的特殊輸出格式。W3C格式是一種商業(yè)日志分析軟件(所有支持IIS日志的分析器)的標(biāo)準(zhǔn)格式。Xferlog 是一種源于wu-ftpd的格式。


--with-brokenrealpath: 一些 Solaris 版本中realpath()運(yùn)行不可靠。如果altlog和(或)pure-uploadscript沒有很好的運(yùn)行,請用這個(gè)參數(shù)重新編譯。


--with-certfile=<file>:  該file用來做SSL認(rèn)證,默認(rèn)為 /etc/ssl/private/pure-ftpd.pem .


--with-extauth: 支持額外的校驗(yàn)?zāi)K。大多數(shù)用戶不需要此參數(shù)。.


所支持語言
--with-language=english
--with-language=german
--with-language=romanian
--with-language=french
--with-language=polish
--with-language=spanish
--with-language=danish
--with-language=italian
--with-language=brazilian-portuguese
--with-language=slovak
--with-language=dutch
--with-language=korean
--with-language=swedish
--with-language=norwegian
--with-language=russian
--with-language=traditional-chinese
--with-language=simplified-chinese
--with-language=hungarian
--with-language=catalan
--with-language=czech: change the language of server messages.
默認(rèn)為英語。


--with-ldap: 支持原始的LDAP路徑。當(dāng)該功能被開啟,系統(tǒng)帳號(hào)將被忽略。你同時(shí)需要使用OpenLDAP。如果OpenLDAP被安裝在一個(gè)特定的位置,你可以使用--with-ldap=<directory> 的參數(shù)。

--with-minimal: 為了有效運(yùn)用現(xiàn)代FTP客戶端的功能,Pure-FTPd采用基本的FTP協(xié)議加擴(kuò)展(SITE IDLE,SITE CHMOD, MLSD, ...)的方式 。使用 --with-minimal 參數(shù),這些擴(kuò)展間不會(huì)被編譯。同樣的,也就不會(huì)有standalone server, 不會(huì)有l(wèi)ookup for user/group names, 不會(huì)有 humor也不會(huì)有 ASCII 的支持。但是執(zhí)行文件將會(huì)比默認(rèn)安裝更小。該參數(shù)你至少需要GCC 3.3 以上來編譯。如果你還想減少(執(zhí)行)文件大小,可以采用--without-globbing 關(guān)聯(lián)--with-minimal參數(shù)。如果你建立一個(gè)嵌入系統(tǒng),可以這樣使用;在其它場合,為了避免客戶的抱怨(特別是使用windows客戶端的客戶),請忘記它吧

--with-mysql: 使用MySQL來提供用戶數(shù)據(jù)庫。當(dāng)開啟該參數(shù),系統(tǒng)帳號(hào)被忽略。使用該功能MySQL 客戶端的庫文件將被安裝。如果MySQL安裝在特殊位置,可以使用--with-mysql=<directory> 語法。

--with-nonroot: 設(shè)置服務(wù)以非root特權(quán)用戶啟動(dòng)。任何普通用戶都可以運(yùn)行服務(wù)。這對于在服務(wù)器上只有一個(gè)受限帳號(hào)的情況非常有用。但是一些特性將不能使用,而且密碼只能通過LDAP,SQL或PureDB進(jìn)行校驗(yàn)。當(dāng)虛擬 chroot 被開啟,用戶將被限制在服務(wù)啟動(dòng)的目錄。這是一種不安全的模式,一般用于普通(非root)用戶建立臨時(shí)性的服務(wù)器。在standalone模式下,2121端口將被偵聽。如果想采用nonroot模式,需要編譯并安裝該軟件(./configure --prefix=... && make install-strip) . /sbin, /bin and /man 目錄需要被寫入 prefix,同時(shí)還需要增加運(yùn)行pure-ftpd用戶在 /etc 目錄的讀寫權(quán)限。

--with-pam: 使用緊密校驗(yàn)?zāi)J。Don't use this option if your login/passwd pairs are always refused (but the real fix would be to
fix your PAM configuration). 需要?jiǎng)?chuàng)建一個(gè) /etc/pam.d/pure-ftpd 文件來運(yùn)用PAM校驗(yàn)。'pam' 路徑中包含該文件的一個(gè)樣本。

--with-peruserlimits: 開啟每用戶同時(shí)在線限制,在繁忙的服務(wù)器上避免該參數(shù)。

--with-pgsql: 使用 Postgres 提供用戶數(shù)據(jù)庫。當(dāng)開啟該參數(shù),系統(tǒng)帳號(hào)將被忽略,Postgres客戶端庫將被安裝。如果Postgres安裝與特殊位置,可以使用--with-pgsql=<directory> 語法。
--with-probe-random-dev: Pure-FTPd 使用 /dev/arandom, /dev/urandom 或者/dev/random 設(shè)備來提供嚴(yán)格的隨機(jī)數(shù)字。這些設(shè)備通常在編譯時(shí)被探測。如果想編譯一個(gè)二進(jìn)制包在其它主機(jī)上運(yùn)行,該參數(shù)將在運(yùn)行時(shí)被探測。該參數(shù)在Linux和BSD系統(tǒng)上無效,但可以使用在Solaris 和 QNX上。

--with-puredb: 支持虛擬用戶,一個(gè)本地的用戶數(shù)據(jù)庫,不用于系統(tǒng)帳號(hào)。

--with-boring: 顯示 "professionnal-looking" 信息。

--with-privsep: 開啟權(quán)限分離。

--withrendez-vous: 允許在MacOS X上支持Rendezvous。

--without-ascii: 不支持 7-bits 傳輸 (ASCII)。如果有客戶使用windows客戶端程序發(fā)送腳本和HTML文件,不要使用 該參數(shù)或讓他們對你大叫。

--without-banner: 不使用初始標(biāo)語,這是一種通過隱瞞獲得的愚蠢的安全。

--without-capabilities: 如果性能庫 (libcap) 被找到,Pure-FTPd 將使用其提供安全性。該參數(shù)不測試這個(gè)庫是否存在。如果性能庫沒有正常工作,可以到ftp://ftp.kernel.org/pub/linux/libs/security/linux-privs/ 下載。

--without-globbing: 不包括全局代碼。能夠減少內(nèi)存消耗但經(jīng)常不能工作。大多數(shù)用戶不需要使用--without-globbing。Globbing是一個(gè)不錯(cuò)的功能。

--without-humor: 如果你沒有查看過源代碼而使用這個(gè)參數(shù),就只好祝你幸運(yùn)了。

--without-inetd: 如果Pure-FTPd總是運(yùn)行在standalone模式下,這個(gè)參數(shù)可以節(jié)約一些代碼字節(jié)。不要同時(shí)使用 --without-inetd和

--without-standalone參數(shù),可能會(huì)導(dǎo)致服務(wù)不能運(yùn)行。這些參數(shù)在Pure-FTPd的二進(jìn)制分發(fā)包上都沒有使用,所以inetd和standalone都被支持。

--without-iplogging: 為了保守機(jī)密而不記錄任何IP地址,除非是政治敏感的服務(wù)器。

--without-nonalnum: 非法文件名檢查。只支持基本的字符。不要盲目的使用這個(gè)參數(shù),或者接受用戶的抱怨。

--without-unicode: 不接受非拉丁字符。如果服務(wù)器文件名不含特殊字符則推薦使用。

--without-sendfile: 在Linux, Solaris, HPUX 和 FreeBSD 內(nèi)核, Pure-FTPd采用特殊系統(tǒng)調(diào)用(sendfile)嘗試減少CPU和內(nèi)存的使用。在大多數(shù)文件系統(tǒng)中該方式運(yùn)行良好,但該優(yōu)化并不能在所有文件系統(tǒng)中正常工作。用戶曾經(jīng)報(bào)告過SMBFS(Samba)在FreeBSD以及TmpFS和NTFS在Linux(服務(wù)器報(bào)告錯(cuò)誤為“broken pipe”或“Error during write to data connection”)上通過Pure-FTPd下載文件失敗。如果計(jì)劃在上述文件系統(tǒng)中運(yùn)行服務(wù),就不得不使用

--without-sendfile 參數(shù)來定義一個(gè)工作區(qū)。同樣來自PA-Risc Linux 的系統(tǒng)也需要這個(gè)參數(shù)。

--without-shadow: 忽略shadow密碼,即使他們被自動(dòng)探測到。這通常是一個(gè)壞主意,除非使用的是PAM, LDAP 或 SQL。Pure-FTPd 支持shadow密碼有效期 (包括帳號(hào)和密碼)。.

--without-standalone:  FTP 服務(wù)器能夠正常地以 standalone 模式運(yùn)行(沒有任何超級(jí)服務(wù))。如果不需要該功能并且想要節(jié)省一些代碼字節(jié)的話,就可以開啟該參數(shù)。一個(gè)類似于g2s, xinetd或tcpserver 的超級(jí)服務(wù)將強(qiáng)制運(yùn)行該服務(wù),但是推薦使用standalone模式。

--without-usernames: 從不在在路徑列表里輸出用戶和組名,而代之以UIDs和GIDs。這將提高安全和性能,但會(huì)有用戶覺得不夠友好。

--without-capabilities: 如果性能庫 (libcap) 被找到,Pure-FTPd 將使用其提供安全性。該參數(shù)不測試這個(gè)庫是否存在。如果性能庫沒有正常工作,可以到ftp://ftp.kernel.org/pub/linux/libs/security/linux-privs/ 下載。

--without-usernames: 從不在在路徑列表里輸出用戶和組名,而代之以UIDs和GIDs。這將提高安全和性能,但會(huì)有用戶覺得不夠友好。

"--prefix=" 改變安裝路徑,默認(rèn)為 "/usr/local/".

論壇徽章:
0
27 [報(bào)告]
發(fā)表于 2006-06-20 11:54 |只看該作者
FreeBSD全能服務(wù)器安裝手冊之域名服務(wù)器篇之DNS(配置文件)篇

################################設(shè)置bind9.3.*##################################
BIND介紹
BIND(Berkeley Internet Name Domain)即伯克利因特網(wǎng)名字域系統(tǒng),它是互聯(lián)網(wǎng)軟件聯(lián)合會(huì)(ISC)的開放源代碼軟件包,BIND提供了解析器和名字服務(wù)器軟件,解析器做實(shí)際的查詢工作而名字服務(wù)器則提供響應(yīng), UNIX目前使用的DNS服務(wù)器主要是依靠BIND軟件來實(shí)現(xiàn)的。

  BIND已經(jīng)有三個(gè)主要版本:BIND4、BIND8和BIND9。

  BIND4在20世紀(jì)80年代末期面世,BIND 8發(fā)布于1997年,而BIND9則發(fā)布于2000年中期。沒有BIND 5、6和7的版本,BIND 8是如此意義重大的一個(gè)更新版本,以至于大家覺得是使用一個(gè)老版本號(hào)兩倍的版本號(hào),而事實(shí)上并非真的如此,BIND 8與4.4 BSD是一起發(fā)布,因而所有版本號(hào)都升為8;目前BIND最新的版本是BIND9.3.0。

  BIND 8融入了許多能夠提高效率、穩(wěn)定性和安全性的先進(jìn)技術(shù)。BIND9甚至走得更遠(yuǎn),具有多處理器支持、線程安全操作、實(shí)時(shí)安全性(公開密鑰加密)、IPv6支持、增量區(qū)傳送和一些其他特性。

  BIND9是徹底重新設(shè)計(jì)和重新實(shí)現(xiàn)的,它將代碼中針對操作系統(tǒng)的特定部分獨(dú)立出來,因此能更容易地將BIND移植到非UNIX系統(tǒng)上。BIND9的內(nèi)部機(jī)制有了顯著不同,但是其配置步驟卻保持不變。

  BIND系統(tǒng)由三部分組成:回答查詢的稱為named的守護(hù)進(jìn)程;聯(lián)系DNS分布式數(shù)據(jù)庫的服務(wù)器解析主機(jī)查詢的庫例程;DNS的命令行接口:nslookup、dig和host。以DNS的術(shù)語來說,類似named的一個(gè)守護(hù)進(jìn)程(或者運(yùn)行它的機(jī)器)稱為“名字服務(wù)器”,與其聯(lián)系的客戶端程序稱為“解析器”。

  named配置文件的格式在BIND4和BIND 8之間發(fā)生了徹底的變化,新格式類似于gated.conf的格式。配置文件名也變了:在BIND4中是/etc/named.boot,而在BIND 8和9中/etc/named.conf,緩存文件和數(shù)據(jù)文件的格式保持不變。
##############################################################################################################################################################
%%%%%%%%%%%%%%%%%建立正反向解析目錄%%%%%%%%%%%%%%

mkdir /etc/namedb/rev
mkdir /etc/namedb/hosts

%%%%%%%%%%%%%%%改變正反向解析目錄屬性%%%%%%%%%%%%%%

chown bind:bind /etc/namedb/rev
chown bind:bind /etc/namedb/hosts
chmod –R 755 /var/named/etc/namedb/rev
chmod –R 755 /var/named/etc/namedb/hosts
%%%%%%%%%%%%%生成正反向解析文件的例子文件%%%%%%%%%%%%
cd /etc/namedb
sh make-localhost

%%%%%%%%%%%%%%%%生成這正反向解析文件%%%%%%%%%%%%%%
cp /etc/namedb/master/localhost.rev /etc/namedb/rev/61.181.32.rev
cp /etc/namedb/master/localhost.rev /etc/namedb/hosts/tjhaina.net.hosts

%%%%%%%%%%%%%生成DNS服務(wù)器的key文件%%%%%%%%%%%%%%%
/usr/sbin/rndc-confgen > /etc/namedb/rndc.conf


%%%%%%%%%%%%%將key文件導(dǎo)入named.conf文件%%%%%%%%%%%%%
cd /etc/namedb
tail -n10 rndc.conf | head -n9 | sed -e s/#\ //g >> named.conf
(這個(gè)命令我也不知道為什么這么寫!希望大家一起討論)


%%%%%%%%%%%%%%%%設(shè)置DNS服務(wù)器的主域%%%%%%%%%%%%%%%
ee /etc/namedb/named.conf

zone "32.181.61.IN-ADDR.ARPA" {
        type master;
        file "/var/named/etc/namedb/rev/61.181.32.rev";
};
zone "tjhaina.net" {
        type master;
        file "/var/named/etc/namedb/hosts/tjhaina.net.hosts";
};

%%%%%%%%%%%%刪除或注釋掉DNS服務(wù)器的監(jiān)聽地址%%%%%%
ee /etc/namedb/named.conf

刪除
20  listen-on               { 127.0.0.1; };
注釋掉
//  listen-on               { 127.0.0.1; };
rndc reload
(由于bind9在默認(rèn)的情況下只是給自己,所以要去除監(jiān)聽地址listen-on       { 127.0.0.1; };)

%%%%%%%%%%%%%設(shè)置DNS服務(wù)器反向解析文件%%%%%%%

ee /etc/namedb/rev/61.181.32.rev

$TTL    3600

@       IN      SOA     ns1.tjhaina.net. root.ns1.tjhaina.net.  (
                                20050430        ; Serial
                                3600    ; Refresh
                                900     ; Retry
                                3600000 ; Expire
                                3600 )  ; Minimum
        IN      NS      ns1.tjhaina.net.
205     IN                 PTR     ns1.tjhaina.net.
205         IN                 PTR          www.tjhaina.net.
205是你的IP地址
(增加反向解析PTR記錄  注意:不建議全部的域名及二級(jí)域名增加PTR記錄)



%%%%%%%%%%%%%設(shè)置DNS服務(wù)器的正向解析文件%%%%%%%

ee /etc/namedb/hosts/tjhaina.net.hosts


$TTL    3600

@       IN      SOA     ns1.tjhaina.net. root.ns1.tjhaina.net.  (
                                20050621        ; Serial
                                3600    ; Refresh
                                900     ; Retry
                                3600000 ; Expire
                                3600 )  ; Minimum
                IN      NS      ns1.tjhaina.net.
ns1                     IN      A       192.168.0.205
www             IN      A       192.168.0.205
mail                        IN                A       192.168.0.205
tjhaina.net.   IN      MX      10   mail.tjhaina.net.

(注意:MX記錄的添加要先做一個(gè)mail的A記錄再做MX記錄。MX記錄添加的原則是用你的域名指向你的mail的二級(jí)域名。不過還有其他的添加方法大家自己可以找一下相關(guān)資料)

%%%%%%%%%%%%%設(shè)置本機(jī)DNS服務(wù)器地址%%%% %%%%%%%%%%%%
ee /etc/resolv.conf

添加

nameserver        127.0.0.1
nameserver        202.99.104.68
nameserver        202.99.96.68
nameserver        61.139.9.10
nameserver        202.102.128.68
nameserver        202.103.0.117
nameserver        202.103.44.5

%%%%%%%%%%%%%啟動(dòng)DNS服務(wù)器%%%%%%%%%%%%%%%%%%%%%
/usr/sbin/named -gc /etc/namedb/named.conf &
(& 表示后臺(tái)運(yùn)行)
/usr/sbin/rndc status
(查看DNS的啟動(dòng)情況)

(所以選這么多DNS是考慮到了冗余設(shè)計(jì)防止萬一出錯(cuò))
%%%%%%%%%%%%使DNS服務(wù)器和系統(tǒng)一起啟動(dòng)%%%%%%%%
ee /etc/rc.conf
添加
named_enable="YES"

rndc reload

論壇徽章:
0
28 [報(bào)告]
發(fā)表于 2006-06-20 11:55 |只看該作者
FreeBSD全能服務(wù)器安裝手冊之域名服務(wù)器篇之DNS(數(shù)據(jù)庫)篇


#################################下載并解壓縮安裝包################################
cd /usr/ports/dns/bind9

//下載bind9.3.1
make fetch

cd /usr/ports/distfiles/

//解壓縮bind9.3.*
tar zxvf bind-9.3.*.tar.gz

chown -R root:wheel bind-9.3.*


###############################生成mysqldb.c文件##################################
cd /usr/ports/distfiles/bind-9.3.*/bin/named/
//生成mysqldb.c 注意:必須采用touch命令生成文件,因?yàn)橛行⿻r(shí)候用其他命令生成的文件是不能被程序識(shí)別的。
touch mysqldb.c

//編輯mysqldb.c

/* 增加以下內(nèi)容(此為mysqldb.c的原版文檔亦可從以下連接直*http://jaist.dl.sourceforge.net/ ... /mysql-bind-0-1.tgz)*/
#include <config.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <mysql.h>

#include <isc/mem.h>
#include <isc/print.h>
#include <isc/result.h>
#include <isc/util.h>

#include <dns/sdb.h>
#include <dns/result.h>

#include <named/globals.h>

#include "mysqldb.h"


static dns_sdbimplementation_t *mysqldb = NULL;

struct dbinfo {
  MYSQL *mysql;
  char *database;
  char *table;
  char *host;
  char *user;
  char *passwd;
};

static void
mysqldb_destroy(const char *zone, void *driverdata, void **dbdata);

/*
* Canonicalize a string before writing it to the database.
* "dest" must be an array of at least size 2*strlen(source) + 1.
*/
static void
quotestring(const char *source, char *dest) {
  while (*source != 0) {
    if (*source == '\'')
      *dest++ = '\'';
    *dest++ = *source++;
  }
  *dest++ = 0;
}

/*
* Connect to the database.
*/
static isc_result_t
db_connect(struct dbinfo *dbi) {
  dbi->mysql = mysql_init(0);
  if (!mysql_real_connect(dbi->mysql, dbi->host, dbi->user, dbi->passwd, dbi->database, 0, NULL, 0))
    return (ISC_R_FAILURE);
  return (ISC_R_SUCCESS);
}

/*
* Check to see if the connection is still valid.  If not, attempt to
* reconnect.
*/
static isc_result_t
maybe_reconnect(struct dbinfo *dbi) {
  if (dbi->mysql != NULL)
    return (ISC_R_SUCCESS);

  return (db_connect(dbi));
}

/*
* This database operates on absolute names.
*
* Queries are converted into SQL queries and issued synchronously.  Errors
* are handled really badly.
*/
static isc_result_t
mysqldb_lookup(const char *zone, const char *name, void *dbdata,
       dns_sdblookup_t *lookup)
{
  isc_result_t result;
  struct dbinfo *dbi = dbdata;
  MYSQL_RES *res;
  MYSQL_ROW row;
  char str[1500]="";
  char *canonname;
  
  UNUSED(zone);

  canonname = isc_mem_get(ns_g_mctx, strlen(name) * 2 + 1);
  if (canonname == NULL)
    return (ISC_R_NOMEMORY);
  quotestring(name, canonname);
  snprintf(str, sizeof(str),
   "SELECT TTL,RDTYPE,RDATA FROM %s WHERE lower(NAME) = lower('%s')", dbi->table, canonname);
  isc_mem_put(ns_g_mctx, canonname, strlen(name) * 2 + 1);
  
  result = maybe_reconnect(dbi);
  if (result != ISC_R_SUCCESS)
    return (result);
  
  if (mysql_query(dbi->mysql, str)) {
    return (ISC_R_FAILURE);
  }

  if (!(res = mysql_store_result(dbi->mysql))) {
    return (ISC_R_NOTFOUND);
  }

  while ((row = mysql_fetch_row(res))) {
    char *ttlstr = row[0];
    char *type = row[1];
    char *data = row[2];
    dns_ttl_t ttl;
    char *endp;
   
    ttl = (ttlstr) ? strtol(ttlstr, &endp, 10) : 86400;
   
    if (*endp != '\0') {
      mysql_free_result(res);
      return (DNS_R_BADTTL);
    }
    result = dns_sdb_putrr(lookup, type, ttl, data);
    if (result != ISC_R_SUCCESS) {
      mysql_free_result(res);
      return (ISC_R_FAILURE);
    }
  }
  
  mysql_free_result(res);
  return (ISC_R_SUCCESS);
}

/*
* Issue an SQL query to return all nodes in the database and fill the
* allnodes structure.
*/
static isc_result_t
mysqldb_allnodes(const char *zone, void *dbdata, dns_sdballnodes_t *allnodes) {
  struct dbinfo *dbi = dbdata;
  MYSQL_RES *res;
  MYSQL_ROW row;
  isc_result_t result;
  char str[1500]="";

  UNUSED(zone);
  
  snprintf(str, sizeof(str),
   "SELECT TTL,NAME,RDTYPE,RDATA FROM %s ORDER BY NAME",
   dbi->table);
  
  result = maybe_reconnect(dbi);
  if (result != ISC_R_SUCCESS)
    return (result);
  
  mysql_select_db(dbi->mysql,dbi->database);
  if (mysql_query(dbi->mysql, str)) {
    return (ISC_R_FAILURE);
  }
  if (!(res = mysql_store_result(dbi->mysql))) {
    return (ISC_R_NOTFOUND);
  }
  while ((row = mysql_fetch_row(res))) {
    char *ttlstr = row[0];
    char *name = row[1];
    char *type = row[2];
    char *data = row[3];
    dns_ttl_t ttl;
    char *endp;

    ttl = (ttlstr) ? strtol(ttlstr, &endp, 10) : 86400;
   
    if (*endp != '\0') {
      mysql_free_result(res);
      return (DNS_R_BADTTL);
    }
    result = dns_sdb_putnamedrr(allnodes, name, type, ttl, data);
    if (result != ISC_R_SUCCESS) {
      mysql_free_result(res);
      return (ISC_R_FAILURE);
    }
  }
  
  mysql_free_result(res);
  return (ISC_R_SUCCESS);
}

/*
* Create a connection to the database and save any necessary information
* in dbdata.
*
* argv[0] is the name of the database
* argv[1] is the name of the table
* argv[2] (if present) is the name of the host to connect to
* argv[3] (if present) is the name of the user to connect as
* argv[4] (if present) is the name of the password to connect with
*/
static isc_result_t
mysqldb_create(const char *zone, int argc, char **argv,
       void *driverdata, void **dbdata)
{
  struct dbinfo *dbi;
  isc_result_t result;
  
  UNUSED(zone);
  UNUSED(driverdata);
  
  if (argc < 2)
    return (ISC_R_FAILURE);
  
  dbi = isc_mem_get(ns_g_mctx, sizeof(struct dbinfo));
  if (dbi == NULL)
    return (ISC_R_NOMEMORY);
  dbi->mysql = NULL;
  dbi->database = NULL;
  dbi->table = NULL;
  dbi->host = NULL;
  dbi->user = NULL;
  dbi->passwd = NULL;
  
#define STRDUP_OR_FAIL(target, source)\
do {\
target = isc_mem_strdup(ns_g_mctx, source);\
if (target == NULL) {\
result = ISC_R_NOMEMORY;\
goto cleanup;\
}\
} while (0);
  
  STRDUP_OR_FAIL(dbi->database, argv[0]);
  STRDUP_OR_FAIL(dbi->table, argv[1]);
  if (argc > 2)
    STRDUP_OR_FAIL(dbi->host, argv[2]);
  if (argc > 3)
    STRDUP_OR_FAIL(dbi->user, argv[3]);
  if (argc > 4)
    STRDUP_OR_FAIL(dbi->passwd, argv[4]);
  
  result = db_connect(dbi);
  if (result != ISC_R_SUCCESS)
    goto cleanup;
  
  *dbdata = dbi;
  return (ISC_R_SUCCESS);
  
cleanup:
  mysqldb_destroy(zone, driverdata, (void **)&dbi);
  return (result);
}

/*
* Close the connection to the database.
*/
static void
mysqldb_destroy(const char *zone, void *driverdata, void **dbdata) {
  struct dbinfo *dbi = *dbdata;
  
  UNUSED(zone);
  UNUSED(driverdata);
  
  if (dbi->mysql != NULL)
    mysql_close(dbi->mysql);
  if (dbi->database != NULL)
    isc_mem_free(ns_g_mctx, dbi->database);
  if (dbi->table != NULL)
    isc_mem_free(ns_g_mctx, dbi->table);
  if (dbi->host != NULL)
    isc_mem_free(ns_g_mctx, dbi->host);
  if (dbi->user != NULL)
    isc_mem_free(ns_g_mctx, dbi->user);
  if (dbi->passwd != NULL)
    isc_mem_free(ns_g_mctx, dbi->passwd);
  if (dbi->database != NULL)
    isc_mem_free(ns_g_mctx, dbi->database);
  isc_mem_put(ns_g_mctx, dbi, sizeof(struct dbinfo));
}

/*
* Since the SQL database corresponds to a zone, the authority data should
* be returned by the lookup() function.  Therefore the authority() function
* is NULL.
*/
static dns_sdbmethods_t mysqldb_methods = {
mysqldb_lookup,
NULL, /* authority */
mysqldb_allnodes,
mysqldb_create,
mysqldb_destroy
};

/*
* Wrapper around dns_sdb_register().
*/
isc_result_t
mysqldb_init(void) {
  unsigned int flags;
  flags = 0;
  return (dns_sdb_register("mysql", &mysqldb_methods, NULL, flags,
   ns_g_mctx, &mysqldb));
}

/*
* Wrapper around dns_sdb_unregister().
*/
void
mysqldb_clear(void) {
  if (mysqldb != NULL)
    dns_sdb_unregister(&mysqldb);
}




####################################################################################


#############################生成mysqldb.h文件#####################################
cd /usr/ports/distfiles/bind-9.3.*/bin/named/include/
touch mysqldb.h
ee mysqldb.h

#include <isc/types.h>
isc_result_t mysqldb_init(void);
void mysqldb_clear(void);

###############################改變文件的運(yùn)行權(quán)限###################################

chmod 755 /usr/ports/distfiles/bind-9.3.*/bin/named/mysqldb.c

chmod 755 /usr/ports/distfiles/bind-9.3.*/bin/named/include/mysqldb.h

#################################修改Makefile.in####################################


ee /usr/ports/distfiles/bind-9.3.*/bin/named/Makefile.in


從26行開始
# Add database drivers here.
#
DBDRIVER_OBJS =
DBDRIVER_SRCS =
DBDRIVER_INCLUDES =
DBDRIVER_LIBS =


改成


DBDRIVER_OBJS = mysqldb.@O@
DBDRIVER_SRCS = mysqldb.c
DBDRIVER_INCLUDES = -I'/usr/local/include/mysql'
DBDRIVER_LIBS = -L'/usr/local/lib/mysql' -lmysqlclient




#################################修改main.c ####################################
ee /usr/ports/distfiles/bind-9.3.*/bin/named/main.c


添加
#include <mysqldb.h>


################################注冊mysqldb_init();################################

尋找: register
         * Add calls to register sdb drivers here.
         */
        /* xxdb_init(); */
        mysqldb_init();
        ns_server_create(ns_g_mctx, &ns_g_server);



尋找: unregister

################################注冊mysqldb_clear();################################
        /*
         * Add calls to unregister sdb drivers here.
         */
        /* xxdb_clear(); */
        mysqldb_clear();
        isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
                      ISC_LOG_NOTICE, "exiting");
        ns_log_shutdown();




#################################安裝bind9.3.2######################################
cd /usr/ports/distfiles/bind-9.3.*

./configure

make

make install
make clean



#################################配置bind9.3.2######################################

/usr/local/sbin/rndc-confgen > /etc/namedb/rndc.conf
cd /etc/namedb
tail -n10 rndc.conf | head -n9 | sed -e s/#\ //g >> named.conf

###############################建立bind數(shù)據(jù)庫######################################
mysql -uroot -ppassword

CREATE DATABASE bind9;

GRANT select,insert,update,delete,create,drop ON bind9.* TO bind9user@localhost IDENTIFIED BY 'password';

use bind9;

CREATE TABLE mydomain (
  name varchar(255) default NULL,
  ttl int(11) default NULL,
  rdtype varchar(255) default NULL,
  rdata varchar(255) default NULL
) TYPE=MyISAM;

###############################插入事例數(shù)據(jù)文件#####################################
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'SOA', 'mydomain.com. www.mydomain.com. 200309181 28800 7200 86400 28800');
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'NS', 'ns0.mydomain.com.');
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'NS', 'ns1.mydomain.com.');
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'MX', '10 mail.mydomain.com.');
INSERT INTO mydomain VALUES ('w0.mydomain.com', 259200, 'A', '192.168.1.1');
INSERT INTO mydomain VALUES ('w1.mydomain.com', 259200, 'A', '192.168.1.2');
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
INSERT INTO mydomain VALUES ('mail.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
INSERT INTO mydomain VALUES ('ns0.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
INSERT INTO mydomain VALUES ('ns1.mydomain.com', 259200, 'Cname', 'w1.mydomain.com.');
INSERT INTO mydomain VALUES ('www.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
INSERT INTO mydomain VALUES ('ftp.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');




#############################在named.conf中加入主域################################
ee /var/named/etc/namedb/named.conf
zone "mydomain.com" {
  type master;
  notify no;
  database "mysql bind9 mydomain localhost bind9user password";
};


%%%%%%%%%%%%刪除或注釋掉DNS服務(wù)器的監(jiān)聽地址%%%%%%
ee /var/named/etc/namedb/named.conf

刪除
20  listen-on               { 127.0.0.1; };
注釋掉
//  listen-on               { 127.0.0.1; };
rndc reload
(由于bind9在默認(rèn)的情況下只是給自己,所以要去除監(jiān)聽地址listen-on       { 127.0.0.1; };)

%%%%%%%%%%%%%設(shè)置本機(jī)DNS服務(wù)器地址%%%% %%%%%%%%%%%%
ee /etc/resolv.conf  

添加

nameserver                      127.0.0.1
nameserver                      211.98.2.4
nameserver                         202.99.104.68
nameserver                         202.99.96.68
nameserver                         202.102.128.68
nameserver                         202.103.0.117
nameserver                         202.103.44.5

(所以選這么多DNS是考慮到了冗余設(shè)計(jì)防止萬一出錯(cuò))
###################################停止系統(tǒng)默認(rèn)的bind###############################
mv /usr/sbin/named /usr/sbin/named.dist
mv /usr/sbin/rndc /usr/sbin/rndc.dist
mv /usr/sbin/dnssec-keygen /usr/sbin/dnssec-keygen.dist
mv /usr/sbin/dnssec-signzone /usr/sbin/dnssec-signzone.dist
mv /usr/sbin/named-checkconf /usr/sbin/named-checkconf.dist
mv /usr/sbin/named-checkzone /usr/sbin/named-checkzone.dist
mv /usr/sbin/rndc-confgen /usr/sbin/named-checkzone.dist
##################################啟用新安裝的bind###################################
ln -s /usr/local/sbin/named /usr/sbin
ln -s /usr/local/sbin/rndc /usr/sbin
ln -s /usr/local/sbin/dnssec-keygen /usr/sbin
ln -s /usr/local/sbin/dnssec-signzone /usr/sbin
ln -s /usr/local/sbin/named-checkconf /usr/sbin
ln -s /usr/local/sbin/named-checkzone /usr/sbin
ln -s /usr/local/sbin/rndc-confgen /usr/sbin
ln -s /var/named/etc/namedb/rndc.conf /etc/rndc.conf


####################################運(yùn)行bind########################################
/usr/local/sbin/named -gc /etc/namedb/named.conf &

####################################測試bind運(yùn)行情況################################
www# nslookup
> w1.mydomain.com
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   w1.mydomain.com
Address: 192.168.1.2
>
%%%%%%%%%%%%使DNS服務(wù)器和系統(tǒng)一起啟動(dòng)%%%%%%%%
touch /usr/local/etc/rc.d/named.sh
ee /usr/local/etc/rc.d/named.sh
增加
/usr/local/sbin/named -gc /etc/namedb/named.conf &
chmod 755 named.sh
############################設(shè)置系統(tǒng)服務(wù)啟動(dòng)順序#####################################
cd /usr/local/etc/rc.d/
mv webmin.sh 001.webmin.sh
mv mysql.-server.sh 002.mysql.-server.sh
mv apache.sh 003.apache.sh
mv named.sh 004.named.sh

%%%%%%%%%%%%%%%%%%%%%刪除無用啟動(dòng)腳本%%%%%%%%%%%%%%%%%%%%
rm webmin.sh
rm mysql.-server.sh
rm apache.sh
rm named.sh

論壇徽章:
0
29 [報(bào)告]
發(fā)表于 2006-06-20 11:56 |只看該作者
FreeBSD全能服務(wù)器安裝手冊之郵件服務(wù)器篇
--選擇郵件系統(tǒng)的準(zhǔn)則

電子郵件服務(wù)器選購
目前, 市場上有多種 Internet 郵件服務(wù)器產(chǎn)品供選擇, 這些郵件服務(wù)器產(chǎn)品價(jià)格各異, 所提供的功能也有不少差別。 對于網(wǎng)絡(luò)管理員來說, 如何根據(jù)自身業(yè)務(wù)的需求, 選擇功能完備、價(jià)格合理的郵件服務(wù)器產(chǎn)品, 是一個(gè)多因素的綜合決策問題。 選擇郵件服務(wù)器時(shí), 雖然需要考慮的因素有許多, 但主要應(yīng)該著重考察產(chǎn)品的系統(tǒng)支持能力、服務(wù)協(xié)議支持能力、多郵件服務(wù)器支持能力、用戶管理能力、郵箱 管理能力、客戶端軟件支持能力、通信能力、安全防護(hù)能力、系統(tǒng)管理能力、版本、 價(jià)格、升級(jí)與售后服務(wù)等以下十二個(gè)因素。
一、 系統(tǒng)支持能力

無論選擇何種計(jì)算機(jī)產(chǎn)品, 系統(tǒng)的支持能力都是首先必須考慮的問題, 硬件產(chǎn)品如此, 軟件產(chǎn)品同樣如此。對于郵件服務(wù)器來說, 在系統(tǒng)支持能力方面應(yīng)該考察以下 三個(gè)問題:

1) 服務(wù)器運(yùn)行平臺(tái)支持能力

對于一個(gè)軟件服務(wù)器產(chǎn)品來說, 其運(yùn)行平臺(tái)的支持能力無非是單平臺(tái)和跨平臺(tái)兩種。 如果一個(gè)網(wǎng)絡(luò)管理員管理的網(wǎng)絡(luò)支持多種操作系統(tǒng)并存運(yùn)行, 且具有多個(gè)各自獨(dú)立管理的郵件服務(wù)器, 則在必須考慮各個(gè)郵件服務(wù)器 協(xié)同工作和統(tǒng)一管理的方便時(shí), 建議優(yōu)先考慮跨平臺(tái)產(chǎn)品。 否則, 可以僅考慮滿足自己所使用平臺(tái)的產(chǎn)品。

2) 業(yè)務(wù)處理能力

一些郵件服務(wù)器產(chǎn)品常常分為企業(yè)版本和標(biāo)準(zhǔn)版本,兩者的產(chǎn)品價(jià)格有很大差別。前者主要供具有大量用戶和有眾多業(yè)務(wù)需要處理的集團(tuán)用戶使用,后者供中小規(guī)模的 集團(tuán)用戶使用。

3) 系統(tǒng)處理能力

郵件服務(wù)器的系統(tǒng)處理能力, 是指它在利用系統(tǒng)硬件平臺(tái)和軟件平臺(tái)進(jìn)行信息處理的能力。 針對支持多 CPU 的服務(wù)器平臺(tái), 目前一些郵件服務(wù)器可以對系統(tǒng)的進(jìn)程 數(shù)量、每個(gè)進(jìn)程所容許的客戶連接數(shù)量、每個(gè)進(jìn)程所允許的線程數(shù)量進(jìn)行設(shè)置。

4) 負(fù)載均衡支持能力

為了適應(yīng)用戶業(yè)務(wù)量擴(kuò)充的需要, 現(xiàn)在一些郵件服務(wù)器產(chǎn)品還具備一定程度的同平臺(tái)下多服務(wù)器負(fù)載均衡支持能力。在這種工作模式下, 網(wǎng)絡(luò)管理員可以根據(jù)業(yè)務(wù)需 求的增長, 隨時(shí)添加郵件服務(wù)器, 經(jīng)過適當(dāng)?shù)南到y(tǒng)配置以后, 可以讓多臺(tái)服務(wù)器共同分擔(dān)郵件業(yè)務(wù)處理工作。

二、 服務(wù)協(xié)議支持能力

郵件服務(wù)器是一種 Internet 網(wǎng)絡(luò)服務(wù)軟件產(chǎn)品, 而支撐著 Internet 眾多網(wǎng)絡(luò)服務(wù)的是各種服務(wù)協(xié)議。在選擇郵件服務(wù)器產(chǎn)品的時(shí)候, 考察它在支持服務(wù)協(xié)議方面的能力, 是衡量產(chǎn)品性能的重要指標(biāo)。

與郵件服務(wù)器產(chǎn)品有關(guān)的網(wǎng)絡(luò)服務(wù)協(xié)議主要有以下6個(gè):

1) SMTP 協(xié)議

SMTP 協(xié)議是簡單的郵件傳輸協(xié)議(Simple Mail Transfer Protocol) 的縮寫。這是最早出現(xiàn)的, 也是被普遍使用的最基本 Internet 郵件服務(wù)協(xié)議。

2) POP3 協(xié)議

POP 協(xié)議是郵局協(xié)議 (Post Office Protocol) 的縮寫, 是一種允許用戶從郵件服務(wù)器收發(fā)郵件的協(xié)議。與 SMTP 協(xié)議相結(jié)合, POP3 是目前最常用的電子郵件服務(wù)協(xié)議。

3) IMAP4 協(xié)議

IMAP 協(xié)議是 Internet 消息訪問協(xié)議 (Internet Message Access Protocol) 的縮寫, 現(xiàn)在常用的是版本 4, 它為用戶提供了有選擇的從郵件服務(wù)器接收郵件的功能、基于服務(wù)器的信息處理功能和共享信箱功能。 IMAP4 在用戶登錄到郵件服務(wù)器以后, 允許采取多段處理方式查詢郵件。首先, 用戶可以僅讀取電子郵箱中的郵件信頭(Message header); 然后, 用戶可以選 擇下載指定的郵件或者全部郵件。 IMAP4 在郵件服務(wù)器一端為用戶保留郵件。

4) HTTP 協(xié)議和 HTML 語言

HTTP 協(xié)議是超級(jí)文本傳輸協(xié)議 (HyperText Transfer Protocol) 的縮寫, 支持這個(gè)協(xié)議的郵件服務(wù)器, 可以提供通過 Web 的電子郵件收發(fā)服務(wù)。

5) MIME 協(xié)議

MIME 是多用途 Internet 郵件擴(kuò)展 (Multipurpose Internet Mail Extensions) 協(xié)議的縮寫。作為對 SMTP 協(xié)議的擴(kuò)充, MIME 規(guī)定了通過 SMTP 協(xié)議傳輸非文本電子郵件附件的標(biāo)準(zhǔn)。目前, MIME 的用途早已經(jīng)超越了收發(fā)電子郵件的范圍, 成為在 Internet 上傳輸多媒體信息的基本協(xié)議之一。

6) LDAP 協(xié)議

LDAP 協(xié)議是輕量目錄訪問協(xié)議 (Lightweight Directory Access Protocol) 的縮寫。通過將相關(guān)的內(nèi)容存放在統(tǒng)一的目錄之下, 目錄服務(wù)為用戶提供了基于客戶/服務(wù)器工作方式的信息查詢手段。

三、 多郵件服務(wù)器支持能力
支持多郵件服務(wù)器有兩個(gè)方面的含義, 在物理上支持多個(gè)郵件服務(wù)器協(xié)同工作 和在邏輯上支持多個(gè)虛擬郵件服務(wù)器, 后者也稱為多域郵件服務(wù)。
在物理上支持多個(gè)郵件服務(wù)器協(xié)同工作, 意味著該產(chǎn)品可以在復(fù)雜網(wǎng)絡(luò)環(huán)境中, 構(gòu)建多層次郵件服務(wù)。對于一個(gè)大型機(jī)構(gòu), 除了有企業(yè)級(jí)郵件服務(wù)器外, 還允許各個(gè)部門自行建立和管理部門級(jí)郵件服務(wù)器。企業(yè)級(jí)郵件服務(wù)器對外直接與 Internet 連接, 對內(nèi)連接各個(gè)部門郵件服務(wù)器, 是縱向郵件服務(wù)的總匯節(jié)點(diǎn)。
所謂多域郵件服務(wù), 就是通過一臺(tái)物理服務(wù)器, 為多個(gè)獨(dú)立注冊 Internet 域名的機(jī)構(gòu)或部門提供電子郵件服務(wù)。在外界看來, 這些機(jī)構(gòu)或部門好象擁有自己專用的郵件服務(wù)器。所以, 它又稱為虛擬郵件服務(wù)器。

四、 其他服務(wù)支持能力

1) 郵件尋呼服務(wù)

提供這種服務(wù)的郵件服務(wù)器在收到用戶的電子郵件時(shí), 可以根據(jù)發(fā)信人的要求, 將電子郵箱收到新郵件的情況或簡單內(nèi)容發(fā)送到收信人的尋呼機(jī)上或是手機(jī)上。

2) 郵件到傳真機(jī)服務(wù)

有的郵件服務(wù)器還提供選件, 可以根據(jù)發(fā)信人的要求, 將電子郵箱收到的郵件發(fā)送到收信人指定的傳真機(jī)上。

3) 郵件用戶組服務(wù)

郵件用戶組 (Mailing list) 服務(wù)又稱為郵件列表, 是一種通過電子郵件進(jìn)行專題信息交流的網(wǎng)絡(luò)服務(wù)。

4) 網(wǎng)絡(luò)新聞服務(wù)

網(wǎng)絡(luò)新聞 (Network News) 是 Internet 上有共同愛好的用戶, 為了相互交換意見組成的一種無形的用戶交流網(wǎng)絡(luò)。

5) 多語言服務(wù)

有的郵件服務(wù)器還提供多語言服務(wù)支持能力, 允許管理員和用戶輸入多種語言的定制文字信息, 并根據(jù)用戶的國別特征自動(dòng)選擇相應(yīng)的語言提供服務(wù)。

五、 用戶管理能力

對于提供網(wǎng)絡(luò)服務(wù)的系統(tǒng)管理員而言, 用戶管理是最基本的管理。用戶的管理首先是用戶帳戶的管理。 通常一個(gè)用戶帳戶包括一系列屬性, 如帳戶名稱、帳戶登錄 密碼、用戶名稱、帳戶建立日期、帳戶隸屬的用戶組、帳戶電子郵箱的大小等。

考察一個(gè)郵件服務(wù)器的用戶帳戶管理功能, 首先應(yīng)該注意其用戶帳戶類型的支持能力。目前郵件服務(wù)器支持的常見用戶帳戶類型包括普通帳戶、別名帳戶、轉(zhuǎn)信帳戶、自動(dòng)信件回復(fù)帳戶、匿名帳戶和可編程機(jī)器人帳戶等。

普通帳戶是用戶收發(fā) 電子郵件基本條件, 其帳戶名稱與郵件服務(wù)器的 Internet 主機(jī)域名, 構(gòu)成了該用戶的電子郵箱地址。

由于業(yè)務(wù)需要, 用戶常常需要使用別名帳戶 (Aliase Account)。 一個(gè)別名帳戶通常 和一個(gè)或多個(gè)普通帳戶相關(guān)聯(lián)。 別名帳戶收到電子郵件后, 會(huì)立即將其轉(zhuǎn)發(fā)到與之相關(guān) 聯(lián)的普通帳戶。

當(dāng)一個(gè)帳戶被設(shè)置成為轉(zhuǎn)信帳戶 (Forwarding Account) 的時(shí)候, 它會(huì)將所接收的電子郵件自動(dòng)轉(zhuǎn)發(fā)到指定電子郵箱中。

被設(shè)置為自動(dòng)信件回復(fù)帳戶 (Autoresponder) 的電子郵箱,可以在收到信件后 按照事先設(shè)定的內(nèi)容進(jìn)行回復(fù)。

當(dāng)需要通過公共電子郵箱提供信息查詢服務(wù)的時(shí)候, 就需要用到匿名帳戶 (Anonymous)。匿名帳戶沒有 密碼。 任何人都可以閱讀放入該郵箱的信件。

可編程機(jī)器人帳戶 (Robot Account) 是目前一些郵件服務(wù)器提供的新功能。這里 的 "機(jī)器人" 是指可以被所接收電子郵件觸發(fā)的計(jì)算機(jī)程序。當(dāng)可編程機(jī)器人帳戶的電子郵箱接收到信件的時(shí)候, 該程序立即啟動(dòng), 按照程序設(shè)定的功能進(jìn)行郵件自動(dòng)處理。

考察郵件服務(wù)器的用戶帳戶管理功能, 還應(yīng)該注意所提供的用戶帳戶建立方法。

手工輸入建立用戶帳戶是最基本的方法。為了與所使用的操作系統(tǒng)平臺(tái)更好的相結(jié)合, 現(xiàn)在許多郵件服務(wù)器還提供了直接沿用或引入操作系統(tǒng)用戶的方法。

用戶帳戶信息如何保存, 維護(hù)、備份是否方便是郵件服務(wù)器用戶管理能力的另一個(gè)側(cè)面。 郵件服務(wù)器的用戶帳戶信息保存方式主要有兩種: 建立專用用戶數(shù)據(jù)庫和使用操作系統(tǒng)用戶數(shù)據(jù)庫。

一個(gè)功能完備的郵件服務(wù)器產(chǎn)品, 應(yīng)該為管理員提供用戶帳戶管理的多種手段,F(xiàn)在許多郵件服務(wù)器產(chǎn)品除了允許管理員 在本機(jī)登錄進(jìn)行用戶信息維護(hù)外, 還允許管理員使用 Web 瀏覽器通過網(wǎng)絡(luò)遠(yuǎn)程登錄進(jìn)行用戶管理操作。允許用戶自行維護(hù)個(gè)人帳戶信息, 也是郵件服務(wù)器不可缺少的功能。

六、 郵箱管理能力

考察郵件服務(wù)器的郵箱管理能力時(shí), 應(yīng)該特別注意產(chǎn)品在為用戶建立郵箱時(shí) 的存儲(chǔ)方式。 目前主要有三種類型: 第一種是集中存放。 第二種是為每個(gè)用戶郵箱建立一個(gè)計(jì)算機(jī)文件子目錄。 第三種是為每個(gè)用戶郵箱建立一個(gè)計(jì)算機(jī)文件。

在考察郵箱存儲(chǔ)方式時(shí), 還應(yīng)該注意是否支持跨越物理磁盤存放。 能夠并行訪問多個(gè)物理磁盤的系統(tǒng), 可以提供更高的用戶服務(wù)響應(yīng)速度。

1) 單一郵箱和多郵箱

由于所采用的郵件服務(wù)協(xié)議不同, 郵件服務(wù)器為每個(gè)用戶提供的郵箱或者郵箱文件夾是不一樣的。

2) 郵箱容量控制

為每個(gè)用戶提供多大的郵件存儲(chǔ)空間, 不同的郵件服務(wù)器提供了不同的設(shè)置手段。制約郵箱容量的最終硬件條件是可以使用的磁盤空間。

3) 收信郵箱管理

如何管理用戶收信郵箱中的信件, 不同的郵件服務(wù)器提供的功能也不相同。對于政府部門或商業(yè)機(jī)構(gòu)來說, 通常將電子郵件視為機(jī)構(gòu)的財(cái)產(chǎn), 不允許雇員使用機(jī)構(gòu)的電子郵件系統(tǒng)收發(fā)與業(yè)務(wù)無關(guān)的私人信件。因此, 機(jī)構(gòu)希望郵件服務(wù)器的管理員保留對用戶郵件的監(jiān)察權(quán)。這并不牽涉侵犯個(gè)人隱私權(quán)的問題。但是對于直接向個(gè)人提供公眾電子郵件服務(wù)的機(jī)構(gòu)來說, 就應(yīng)該注意這個(gè)問題。

4) 發(fā)信郵箱管理

發(fā)信郵箱也稱為發(fā)信隊(duì)列。對于等待發(fā)送的信件, 郵件服務(wù)器應(yīng)該提供的可設(shè)置功能包括投送間隔、重發(fā)間隔和次數(shù)、保留時(shí)間、無法投遞信件處理方法等。是否具備對用戶所發(fā)送郵件監(jiān)察的功能,也是選擇郵件服務(wù)器需要考慮的因素之一。 有的郵件服務(wù)器還可選擇是否將所發(fā)送郵件的副本,送入管理員指定的位置存放備查。

七、 客戶端軟件支持能力

郵件服務(wù)器所支持的客戶端郵件收發(fā)軟件, 主要與服務(wù)器所使用的服務(wù)協(xié)議有關(guān)。 通常支持的有 SMTP/POP3 客戶和 IMAP 客戶, 有的還支持 Web 瀏覽器客戶。

八、 通信能力

選擇郵件服務(wù)器的時(shí)候,在通信方面進(jìn)行考察主要涉及三個(gè)方面:

1) 連接方式支持能力

為了收發(fā)電子郵件, 郵件服務(wù)器通常工作在通過專線與 Internet 始終保持連接的 模式下。 如果一個(gè)機(jī)構(gòu)的局域網(wǎng), 是通過電話撥號(hào)與 Internet 服務(wù)供應(yīng)商 ISP 的服務(wù)線路連接, 機(jī)構(gòu)在局域網(wǎng)建立的郵件服務(wù)器作為郵件轉(zhuǎn)發(fā)的中繼, 那么就需要郵件服務(wù)器具備電話撥號(hào)通信支持能力。

2) 接入控制能力

論壇徽章:
0
30 [報(bào)告]
發(fā)表于 2006-06-20 11:57 |只看該作者
當(dāng)郵件服務(wù)器為用戶提供連接服務(wù)的時(shí)候, 系統(tǒng)資源的占用情況與通信連接 數(shù)量成正比。 一些郵件服務(wù)器提供了設(shè)置界面, 可以通過參數(shù)對接入連接進(jìn)行控制。

3) 通信帶寬管理能力

當(dāng)郵件服務(wù)器與外界連接傳送信息的時(shí)候, 可能會(huì)占用大量的通信信道帶寬。為了防止郵件服務(wù)器對帶寬的過量占用, 一些郵件服務(wù)器可以對所占用的最大帶寬進(jìn)行設(shè)置。

九、 安全防護(hù)能力

郵件服務(wù)器的安全防護(hù)能力, 可以歸納為以下十三個(gè)方面的問題:

1) 用戶身份認(rèn)證能力

2) 合法客戶網(wǎng)址設(shè)定能力

3) 抵制垃圾郵件的能力

4) 郵件內(nèi)容過濾能力

5) 抵制商業(yè)郵件轉(zhuǎn)發(fā)能力

6) 支持穿越防火墻的郵件服務(wù)能力

7) 支持代理服務(wù)器的能力

8) 支持堡壘主機(jī)的能力

9) 支持備份郵件服務(wù)器的能力

10) 檢測和殺滅郵件病毒的能力

11) 抵制"拒絕服務(wù)"攻擊的能力

12) 信息傳輸加密能力

13) 災(zāi)難恢復(fù)能力

十、 系統(tǒng)管理能力

對于郵件服務(wù)器管理員來說, 系統(tǒng)管理的前提首先是對系統(tǒng)工作情況的全面掌握, 然后是對系統(tǒng)運(yùn)行性能的動(dòng)態(tài)調(diào)整。 因此,產(chǎn)品至少應(yīng)該提供以下三個(gè)方面的能力。

1) 審計(jì)能力

所謂審計(jì) (Audit), 就是可以按照管理員選擇的內(nèi)容, 對郵件服務(wù)器提供的各種服 務(wù)連續(xù)進(jìn)行工作情況記錄, 針形成系統(tǒng)運(yùn)行審計(jì)歷史記錄文件, 供管理員分析系統(tǒng)工作情況, 查找系 統(tǒng)故障原因使用。

2) 日志能力

日志 (Log) 主要是針對用戶使用郵件服務(wù)器的情況連續(xù)進(jìn)行記錄。 郵件服務(wù)器所提供的日志功能, 應(yīng)該允 許管理員可以選擇日志監(jiān)察對象。
3) 實(shí)時(shí)監(jiān)控與性能調(diào)整能力

使用實(shí)時(shí)監(jiān)控功能, 管理員可以對當(dāng)前郵件服務(wù)器正在運(yùn)行的各種服務(wù)進(jìn)行實(shí)時(shí) 工作情況觀察, 動(dòng)態(tài)調(diào)整系統(tǒng)控制參數(shù)。

十一、版本、升級(jí)與售后服務(wù)能力
郵件服務(wù)器是一個(gè)通過網(wǎng)絡(luò)為多用戶服務(wù)的軟件系統(tǒng), 開發(fā)廠商不但根據(jù)所滿足業(yè)務(wù)量的不同, 推出類型不同的版本, 還隨著網(wǎng)絡(luò)技術(shù)的進(jìn)步不斷發(fā)布產(chǎn)品的升級(jí)版本。

1) 版本

郵件服務(wù)器的不同類型版本, 主要針對不同業(yè)務(wù)量的應(yīng)用。 如果按照所支持的用戶 數(shù)量分類, 可以分為限用戶數(shù)版本和不限用戶數(shù)版本, 前者往往又分為幾個(gè)檔次。 如果 按照系統(tǒng)運(yùn)行性能區(qū)分, 常分為標(biāo)準(zhǔn)版本 (Standard Edition) 和企業(yè)版本( Enterprise Edition), 前者適用于中小規(guī)模機(jī)構(gòu), 后者適用于大型機(jī)構(gòu)或 Internet 服務(wù)供應(yīng)商 ISP, 而且還可能具備支持多 CPU 處理的能力。 如果按照所運(yùn)行的系統(tǒng)平臺(tái)分類, 又常常分為 UNIX 系統(tǒng)版本和 Windows NT 系統(tǒng)版本。 另外, 各家廠商為了推銷自己的產(chǎn)品, 還常常有供免費(fèi)試用的版本。 這些版本往往在內(nèi)部設(shè)置了試用期。超過了試用期就停止運(yùn)行。

2) 升級(jí)支持

在選擇郵件服務(wù)器的時(shí)候, 廠家對產(chǎn)品的升級(jí)支持也是一個(gè)非常重要的因素。同一產(chǎn) 品的不同類型版本, 在版本號(hào)、功能和升級(jí)速度方面常常不同。用戶數(shù)量多的主流產(chǎn)品版本往往能夠得到及時(shí)的升級(jí)。選擇這樣的產(chǎn)品, 才能夠不斷享受到開發(fā)廠家提供的新功能。

3) 售后服務(wù)支持

由于郵件服務(wù)器是一個(gè)軟件技術(shù)產(chǎn)品, 廠家的售后服務(wù)支持能力非常重要。選擇產(chǎn)品的時(shí)候, 要注意它是否有完備的用戶手冊和技術(shù)手冊, 廠家能夠提供什么方式和種類的售后技術(shù)服務(wù)支持。當(dāng)產(chǎn)品升級(jí)的時(shí)候, 如何得到升級(jí)版本。

十二、 價(jià)格

價(jià)格在任何時(shí)候都是選擇產(chǎn)品不可忽視的因素。 這涉及到成本核算。 一些郵件服務(wù)器產(chǎn)品價(jià)位較高, 有時(shí)并不僅僅是因?yàn)樗墓δ。那些同時(shí)支持在多種系統(tǒng)平臺(tái)運(yùn)行的產(chǎn)品, 往往價(jià)格高于在單一系統(tǒng)平臺(tái)運(yùn)行的產(chǎn)品。為了節(jié)省不必要的支出, 應(yīng)該根據(jù)業(yè)務(wù)的實(shí)際需求選擇產(chǎn)品,對產(chǎn)品的標(biāo)準(zhǔn)價(jià)格、增加用戶許可的代價(jià)和產(chǎn)品升級(jí)價(jià)格等因素綜合考慮。


        最近幾年來,基于Web的免費(fèi)Email系統(tǒng)非常流行,當(dāng)前,幾個(gè)著名的免費(fèi)Email網(wǎng)站基本上已經(jīng)成為大多數(shù)人的選擇,建立單純提供免費(fèi)Email服務(wù)的站點(diǎn)不再像以前那樣受到熱烈歡迎,但是提供Web界面的Email服務(wù)已經(jīng)成為了一個(gè)商業(yè)站點(diǎn)為其注冊成員提供的基本服務(wù)之一。

        一個(gè)Email系統(tǒng)可以分為服務(wù)器端和客戶端,Web界面的Email系統(tǒng)則是將Email客戶放在了Web服務(wù)器端,因此Email系統(tǒng)所需要實(shí)現(xiàn)的是一個(gè)Web界面的Email客戶。然而,由于這個(gè)Email系統(tǒng)要求用戶數(shù)量較大,因此對于Email服務(wù)器也有特定的要求。


操作系統(tǒng)和用戶數(shù)據(jù)庫

        由于提供Web和Email服務(wù)要求穩(wěn)定性和性能特別高,因此一般都使用Unix作為服務(wù)器的操作系統(tǒng),例如hotmail使用FreeBSD和Solaris,國內(nèi)163等站點(diǎn)也是BSD系列。然而,Unix的標(biāo)準(zhǔn)Email系統(tǒng)也不合適用做這種大容量服務(wù)。有的Unix系統(tǒng),例如當(dāng)前版本的Linux,其用戶標(biāo)識(shí)只有16位,因此用戶數(shù)量最多只能有64K,即使Unix系統(tǒng)本身支持32位的用戶標(biāo)識(shí),考慮到性能因素,單臺(tái)服務(wù)器支持的用戶數(shù)量也不要超過10萬。

        為了具有支持更多用戶的可擴(kuò)展性,一般采用多臺(tái)服務(wù)器同時(shí)提供服務(wù),雖然此時(shí)仍然可以使用標(biāo)準(zhǔn)Unix用戶作為Email用戶,但考慮到安全性、性能以及可管理性,一般采用非Unix系統(tǒng)用戶來作為Email用戶。而保存用戶數(shù)據(jù)通常采用支持網(wǎng)絡(luò)訪問的數(shù)據(jù)庫形式,一般常用的有LDAP、標(biāo)準(zhǔn)數(shù)據(jù)庫、以及Email系統(tǒng)自己實(shí)現(xiàn)的用戶數(shù)據(jù)庫。其中,LDAP由于是提供目錄服務(wù)的標(biāo)準(zhǔn),因此應(yīng)該為最佳的選擇,其常用的開放源代碼實(shí)現(xiàn)為OpenLDAP;而標(biāo)準(zhǔn)數(shù)據(jù)庫由于實(shí)現(xiàn)方便、可擴(kuò)展性強(qiáng),其中在Internet上最常用的為MySQL;此外,也有使用其他方式的實(shí)現(xiàn)。


郵件的保存

        由于用戶數(shù)量較大,如何保存用戶的郵件就是一個(gè)非常重要的問題。傳統(tǒng)Unix使用一個(gè)單一目錄來保存所有用戶的郵件,在用戶數(shù)量較多時(shí)就極大的降低了文件系統(tǒng)的性能。只有使用多級(jí)目錄,每個(gè)目錄下的文件數(shù)量有限,才能降低打開文件時(shí)的系統(tǒng)消耗,或者不再使用簡單的文件來保存郵件,而采用某一種封裝形式。完全采取數(shù)據(jù)庫形式來保存郵件,由于用戶郵件操作多為文件操作,且大小變化較大,因此會(huì)造成性能和存儲(chǔ)空間上較大的浪費(fèi)。

        由于用戶數(shù)量巨大,并且也要求能被多臺(tái)服務(wù)器同時(shí)訪問,必須采用存儲(chǔ)空間較大的服務(wù)器或服務(wù)器集群來保存,通過光纖通道或者網(wǎng)絡(luò)文件系統(tǒng)NFS來共享存儲(chǔ)空間,使得每個(gè)用戶的郵件存儲(chǔ)路徑對于每個(gè)服務(wù)器都是一致的。光纖通道是一種非常昂貴的解決方法,更為常用的是使用NFS,可以使用專用的NFS服務(wù)器,如NetApp,或者使用帶有RAID能力的PC Unix服務(wù)器。

        當(dāng)使用NFS共享存儲(chǔ)空間的時(shí)候,一個(gè)非常重要的問題必須注意。由于NFS缺乏文件鎖定機(jī)制,因此使用傳統(tǒng)的用戶郵件存儲(chǔ)格式mailbox時(shí),因?yàn)樗械泥]件都保存在同一個(gè)文件中,因此進(jìn)行郵件操作就必須加鎖,以保證沒有訪問沖突,這就使得它不適合NFS存儲(chǔ)方式。為了解決這個(gè)問題,qmail提出了Maildir存儲(chǔ)方式,每個(gè)郵件作為單獨(dú)的一個(gè)文件保存在用戶個(gè)人的郵件目錄下,就避免了加鎖。因此,常見的免費(fèi)郵件服務(wù)器,一般都采用Maildir方式來保存用戶的郵件。

        如果不打算使用共享文件系統(tǒng)的方式來保存用戶的郵件,而打算讓每個(gè)服務(wù)器只訪問其自己硬盤存儲(chǔ)空間上的用戶郵件,那么Email服務(wù)器和客戶端都需要進(jìn)行定制,使它們能通過用戶名來找到用戶屬于的真正服務(wù)器,將訪問任務(wù)交給這個(gè)服務(wù)器完成。這種方法的缺點(diǎn)除了所需要的改動(dòng)較大之外,系統(tǒng)結(jié)構(gòu)復(fù)雜之外,還由于服務(wù)器是按用戶進(jìn)行分割的,不利于分擔(dān)負(fù)載。其優(yōu)點(diǎn)也是由于它不通過網(wǎng)絡(luò)訪問其他服務(wù)器,因此可以采用任意的郵件存儲(chǔ)格式,包括采用強(qiáng)大的cyrus系統(tǒng)來保存郵件和提供服務(wù)。


郵件服務(wù)器軟件

        標(biāo)準(zhǔn)的Email軟件,例如sendmail,雖然也提供了一些包括aliases等方法,來支持非Unix系統(tǒng)用戶,但是這些能力對于實(shí)現(xiàn)這種Email系統(tǒng)是不夠的。為了支持這些Email用戶,必須使用自己的Email服務(wù)器軟件。一般由于現(xiàn)有的Email軟件都相當(dāng)成熟,而且也都是開放源代碼的軟件,因此一般都是改動(dòng)原有的Email軟件,如sendmail、qmail等,使其支持特定的Email用戶。完全重寫一個(gè)Email服務(wù)軟件,從成熟性、穩(wěn)定性來看并不可取。

        不管從性能上,安全性上考慮,sendmail并不是理想的選擇,而且由于qmail本身就支持Maildir,因此就成為了常用的Email軟件的基礎(chǔ)開發(fā)平臺(tái)。然而需要注意的是,qmail使用GPL許可進(jìn)行保護(hù),因此基于qmail進(jìn)行的任何改動(dòng),原則上必須公開源代碼,這對開發(fā)商業(yè)系統(tǒng)有一定障礙。當(dāng)然可以通過不改動(dòng)qmail,而改動(dòng)相關(guān)的系統(tǒng)庫函數(shù),或者采用外掛的方式來繞過這個(gè)問題。另一個(gè)可選的基礎(chǔ)Email軟件是postfix,其本身就具備與LDAP、MySQL的接口,幾乎不需要改動(dòng)就能作為郵件系統(tǒng)的一部分。  


Web客戶端

        Web界面Email系統(tǒng)的另一個(gè)重要的部分就是Web客戶端,這一部分的功能將如同個(gè)人計(jì)算機(jī)中的OutLook,負(fù)責(zé)給用戶提供訪問自己郵件的能力。由于Web訪問本身是無連接的,因此必須保證用戶的安全性;旧,安全性可以通過登錄后建立的會(huì)話標(biāo)識(shí)、臨時(shí)目錄,并在程序中進(jìn)行驗(yàn)證來保證。

        Web客戶端必須以統(tǒng)一的方式來訪問服務(wù)器,可以通過直接文件訪問的方式來獲得用戶的郵件,或者通過POP3、IMAP等標(biāo)準(zhǔn)協(xié)議來訪問。對于使用網(wǎng)絡(luò)文件系統(tǒng)來共享用戶郵件的系統(tǒng),通過直接文件訪問的方法最為直接和便利,也不需要額外的消耗。而通過POP3、IMAP協(xié)議來訪問服務(wù)器,其直接的好處就是Web客戶端和Email服務(wù)器相分離,提高了系統(tǒng)安全性。

        當(dāng)前,已經(jīng)有一些相當(dāng)成熟的開放源代碼的Web客戶端軟件,其中IMP是采用PHP來實(shí)現(xiàn)的,通過IMAP協(xié)議訪問服務(wù)器的Web郵件客戶端軟件。而WING則是采用Perl來實(shí)現(xiàn)的另一個(gè)Web客戶端軟件。這些開放源代碼軟件都相當(dāng)不錯(cuò),然而,將這些軟件與自己的系統(tǒng)相集成,還會(huì)需要進(jìn)行一定改動(dòng)。此外,還應(yīng)該遵循其許可要求,將改動(dòng)的代碼對外公開。


實(shí)現(xiàn)負(fù)載均衡

        由于需要提供給大量的用戶進(jìn)行訪問,因此單臺(tái)服務(wù)器不能滿足這個(gè)需要,而必須要使用多服務(wù)器的方式。除了按照功能性進(jìn)行分割之外,如Web服務(wù)器、Email服務(wù)器以及文件服務(wù)器相分離,還需要對一些資源緊張的服務(wù)使用多服務(wù)器進(jìn)行負(fù)載均衡。雖然當(dāng)前一些商業(yè)廠家也提出了一些服務(wù)器集群的方案,但常用的簡單而有效的方法還是DNS循環(huán)解析,Web服務(wù)器重定位和NAT負(fù)載均衡等幾種。

        DNS循環(huán)解析是為同一個(gè)名字分配多個(gè)IP地址,它用在Yahoo等相當(dāng)大的站點(diǎn)上,實(shí)際效果也相當(dāng)不錯(cuò)。而Web服務(wù)器重定位則是由Web服務(wù)器隨機(jī)產(chǎn)生位于不同服務(wù)器上的真實(shí)頁面URL,使不同的瀏覽器載入不同服務(wù)器上的頁面,使用它只能實(shí)現(xiàn)Web客戶端的負(fù)載均衡。而NAT負(fù)載均衡則利用第四層交換機(jī),使同樣的請求轉(zhuǎn)向不同的服務(wù)器,除了昂貴的交換機(jī)之外,也有一些軟件能完成NAT功能,我曾對FreeBSD的natd進(jìn)行了改動(dòng),使其能支持負(fù)載均衡,對于因?yàn)榻粨Q機(jī)價(jià)格問題而不得不降低性能要求的使用者來講,也是一種選擇。



實(shí)例分析

        當(dāng)前在國內(nèi)最流行的Web界面Email系統(tǒng)為網(wǎng)易公司的系統(tǒng),它是采用qmail作為基本服務(wù)器軟件,再加以改動(dòng)的系統(tǒng)。它采用NFS網(wǎng)絡(luò)文件系統(tǒng)作為用戶郵件存儲(chǔ)空間,使用Maildir作為郵件存儲(chǔ)格式,提供多級(jí)目錄以支持大量用戶。其Web客戶端為他們自己實(shí)現(xiàn)的,通過直接訪問用戶郵件的方式為用戶提供服務(wù)。不考慮其軟件的小問題,這種實(shí)現(xiàn)方式是非常流行且成熟的方式,大部分免費(fèi)郵件服務(wù)系統(tǒng)都是采用的這種模式。

        另一種方式是盡量利用已有的開放源代碼軟件,一種可行的方案是使用Postfix、OpenLDAP、cyrus和IMP來實(shí)現(xiàn)大容量Email系統(tǒng),其中,主郵件服務(wù)器使用Postfix查詢LDAP服務(wù)器,決定用戶的真實(shí)郵箱地址,然后轉(zhuǎn)發(fā)到真實(shí)郵件主機(jī)上,該主機(jī)通過LDAP查詢確認(rèn),將郵件放入cyrus服務(wù)器中,而IMP通過登錄cyrus,使用IMAP訪問用戶郵件。當(dāng)用戶增多,一臺(tái)cyrus服務(wù)器不夠時(shí),可以將新添加的用戶放置到新增加的服務(wù)器上,只需要在LDAP服務(wù)器設(shè)置相應(yīng)的屬性就可以了。在這種方式下,由于用戶是嚴(yán)格按服務(wù)器分割造成了管理等困難之外,這種結(jié)構(gòu)本身較為復(fù)雜。然而,如果用戶數(shù)量不是很多,那么就不需要使用多臺(tái)cyrus服務(wù)器和LDAP服務(wù)器,復(fù)雜程度就大大降低,比較適合中小型站點(diǎn)使用。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP