2013年8月1日 星期四

3D列印打造,迪士尼讓機器人的眼睛成為「靈魂之窗」 http://www.bnext.com.tw/article/view/id/28756
我的 Coding 學習計畫:一天一個,用 180 天架 180 個網站! http://techorange.com/2013/08/01/i-am-making-one-website-a-day-for-180-days/

2011年7月8日 星期五

2011-07-08 電腦概論

Quagga Routing Suite  (動態路由)


vm1


eth0 : LAN1 192.168.X.6/29

eth1 : LAN2 192.168.X.14/29

eth2 : LAN3 192.168.X.25/29



vm2

eth0 : LAN4 192.168.X.22/29

eth1 : LAN3 192.168.X.26/29

eth2 : LAN5 192.168.X.41/29



vm3

eth0 : LAN6 192.168.X.38/29

eth1 : LAN5 192.168.X.42/29

eth2 : 橋接介面卡 192.168.51.X/24



vm3

$su -

安裝路由協定的套件

#yum install quagga -y

#setup 關閉防火牆



初始化所有網路卡NIC

#ifconfig eth0 0.0.0.0 up

#ifconfig eth1 0.0.0.0 up

#ifconfig eth2 0.0.0.0 up



複製設定檔

#cd /etc/quagga

查看該目錄下的檔案

#ls

#cp ripd.conf.sample ripd.conf

#cp ospfd.conf.sample ospfd.conf



啟動zebra & rip 的服務

切換到 /etc/init.d 目錄

#cd /etc/init.d

查看一下目錄下的檔案, 此檔案下的所有檔案都是可執行的程式 (服務)

#ls

zebra 是負責 ip 層設定的服務

#/etc/init.d/zebra start

ripd 是負責 動態路由 RIP 協動的服務

#/etc/init.d/ripd start



正式進入 quagga 的整合模式, exit 回上一層, Ctrl+Z 直接回到第一層

#vtysh

進入 模組 模式

localhost.localdomain#config t

(config)#hostname vm3

進入網路介面卡 eth0 設定 IP 位址並啟動

vm3(config)#interface eth0

vm3(config-if)#ip address 192.168.X.38/29

vm3(config-if)#no shutdown

vm3(config-if)#exit



vm3(config)#interface eth1

vm3(config-if)#ip address 192.168.X.42/29

vm3(config-if)#no shutdown

vm3(config-if)#exit



vm3(config)#interface eth2

vm3(config-if)#ip address 192.168.51.X/24

vm3(config-if)#no shutdown

vm3(config-if)#exit



啟動 forwarding 的功能

vm3(config)#ip forwarding

vm3(config)#exit



查看剛剛所設定的資訊(目前的狀態)

vm3#show running-config?

查看開機時設定的資訊(就是看 zebra.conf & ripd.conf 的內容)

vm3#show startup-config

查看路由表

vm3#show ip route



啟動 RIPv2 的路由協定

vm3#config t

vm3(config)#router rip

vm3(config-router)#version 2

vm3(config-router)#network 192.168.51.0/24

vm3(config-router)#network 192.168.X.32/29

vm3(config-router)#network 192.168.X.40/29

vm3(config-router)#Ctrl+Z

vm3#show ip route

2011年7月7日 星期四

2011-07-07 JAVA

http://tw.zkoss.org/  Firamework
1.http://tw.zkoss.org Firamework




// 學習月份的英文單字的程式



import java.util.Random;

import java.util.Scanner;



class MonthCAI {



public static void main(String[] args) {

Random rand = new Random();

Scanner stdIn = new Scanner(System.in);

String[] monthString = {

"January", "February", "March", "April", "May", "June", "July",

"August", "September", "October", "November", "December"

}; //另一空間起始記憶體位址



int month = rand.nextInt(12); // 對應的月份:0~11的亂數

System.out.println("問題為" + monthString[month]);



int c=0;

while (true) {

System.out.print("這是幾月呢:");

int m = stdIn.nextInt();



if (m == month + 1)

break;

else {

++c;

System.out.println("答錯了。");

}

if (c>=2)



System.exit(1); //1退出

}

System.out.println("正確答案。");

}

}

-----------------------------------------------------------------------



// 顯示陣列變數的值



class PrintArray {



public static void main(String[] args) {

int[] a = new int[5];

System.out.println("a = " + a);



a = null; //清除記憶體位址

System.out.println("a = " + a);

}

}



-------------------------------------------------------------



// 合計2列3行的矩陣



class Matrix_test {



public static void main(String[] args) {

int[][] x = { {0, 2, 0}, {1, 0, 1} ,{1,1,1}};





for (int i = 0; i < x.length; ++i) {

for (int j = 0; j < x[i].length ; ++j)

//c[i][j] = a[i][j] + b[i][j];



System.out.println(x[i][j]==1 ? '*' : ' ');

}





}



}



-------------------------------------------------------------



//網路抓檔



import java.net.*;

import java.io.*;



public class GetURL1 {

public static void main(String argv[]) throws Exception {



URL url = new URL("http://140.137.222.71/abc.txt"); //URL.class

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); //建立連線;讀進檔案



String line;

StringBuffer sb = new StringBuffer();



while ((line = in.readLine()) != null) {

sb.append(line+"\n");

}



in.close();

System.out.println(sb.toString());

}

}



----------------------------------------------------------------------------
import java.net.*;


import java.io.*;



public class GetURL3 {

public static void main(String argv[]) throws Exception {



URL url = new URL("http://140.137.222.50/abc.txt"); //URL.class

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));


int v=0;

String line;

while ((line = in.readLine()) != null) {

for (int i=0; i < line.length() ; i++) {

char c = line.charAt(i); //字串比較

if ( c >=48 && c<=57 )

//System.out.print(c);

v++;

}

}System.out.println(v);



in.close();

//System.out.println(c);

}

}
---------------------------------------------------------------
import java.net.*;


import java.io.*;



public class GetURL4 {

public static void main(String argv[]) throws Exception {



URL url = new URL("http://140.137.222.50/abc1.txt"); //URL.class

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));



String line;

while ((line = in.readLine()) != null) {


String[] a1 = line.split(":");

System.out.println(a1[1]);


}


in.close();

//System.out.println(c);

}

}
--------------------------------------------------------------
import java.net.*;


import java.io.*;


public class GetURL5 {

public static void main(String argv[]) throws Exception {

URL url = new URL("http://140.137.222.50/abc2.txt"); //URL.class

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

//String s ;

//String[] a1 = s.split(":");

//System.out.println(a1[1]);

int sum=0;

String s;

while ((s = in.readLine()) != null) {

if (s.isEmpty() == false) {

String[] a1 = s.split(":");

int t=Integer.parseInt(a1[1]);



sum+= t ;

}

} System.out.print(sum);

in.close();

//System.out.println(c);

}

}
----------------------------------------------------------------
String x = "123"; //必需為數字,否則不執行parseInt()

int y = Integer parseInt(x); //字串轉型數值int
-----------------------------------------------------------------
White Space

ASC 10,13 (換行)
ASC 9 (TAB)
ASC 32 (空白)

2011年7月5日 星期二

2011-07-05 電腦概論

狀況一

vm1 網卡 : LAN1
vm2 網卡 : LAN1
vm3 網卡 : LAN1

vm1的設定
$su -
#ifconfig eth0 192.168.1.1/24 up

vm2的設定
$su -
#ifconfig eth0 192.168.2.2/24 up


此時vm1 與 vm2 應該互 ping 會不通
[原因]

雖然實體是連接在一起, 不過分屬於兩個不同的網段 192.168.1.0/24 與 192.168.2.0/24


啟動 vm3並設定 IP 位址
$su -
#setup 關閉防火牆
#ifconfig eth0 192.168.1.254/24 up
#ifconfig eth0:1 192.168.2.254/24 up



將vm1與vm2設定加入 預設閘道
vm1
#ip route add default via 192.168.1.254

vm2
#ip route add default via 192.168.2.254



啟動vm3的 forwarding 的功能
  cat /proc/sys/net/ipv4/ip_forward
#echo "1" > /proc/sys/net/ipv4/ip_forward

此時的vm1 與 vm2 應該可以互通嚕.........YA



狀況二

vm1 網卡 : LAN1
vm2 網卡 : LAN2
vm3 網卡 : LAN1 , LAN2


vm1的設定
$su -
#ifconfig eth0 192.168.1.1/24 up
#ip route add default via 192.168.1.254

vm2的設定
$su -
#ifconfig eth0 192.168.2.2/24 up
#ip route add default via 192.168.2.254


啟動 vm3並設定 IP 位址
$su -
#setup 關閉防火牆
#ifconfig eth0 192.168.1.254/24 up
#ifconfig eth1 192.168.2.254/24 up


啟動vm3的 forwarding 的功能
#echo "1" > /proc/sys/net/ipv4/ip_forward


此時的vm1 與 vm2 應該可以互通嚕.........YA

2011年7月4日 星期一

2011-07-04 JAVA

// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class LinearSearch {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        final int n = 12;        // 元素數
        int[] a = new int[n];        // 宣告陣列

        for (int j = 0; j < n; j++)
            a[j] = rand.nextInt(10);

        System.out.print("陣列a的所有元素的值\n{ ");
        for (int j = 0; j < n; j++)
            System.out.print(a[j] + " ");
        System.out.println(" }");

        System.out.print("搜尋的數值:");
        int key = stdIn.nextInt();

        int i;
        for (i = 0; i < n; i++)
            if (a[i] == key)
                break;

        if (i < n)                            // 搜尋成功
            System.out.println("該值存在於a[" + i + "]。");
        else                // 搜尋失敗
            System.out.println("該值不存在。");           
    }
}
----------------------------------------------------------------------------------
// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class LinearSearch {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        final int n = 12;        // 元素數
        int[] a = new int[n];        // 宣告陣列

        for (int j = 0; j < n; j++)
            a[j] = rand.nextInt(10);

        System.out.print("陣列a的所有元素的值\n{ ");
        //for (int j = 0; j < n; j++)
            //System.out.print(a[j] + " ");
        //System.out.println(" }");
        for (int j : a)
           System.out.print(j + " ");
          
        System.out.print("搜尋的數值:");
        int key = stdIn.nextInt();

        int i;
        for (i = 0; i < n; i++)
            if (a[i] == key)
                break;

        if (i < n)                            // 搜尋成功
            System.out.println("該值存在於a[" + i + "]。");
        else                // 搜尋失敗
            System.out.println("該值不存在。");           
    }
}
--------------------------------------------------------------------------------------
// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class MyP6_7 {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        final int n = 12;        // 元素數
        int[] a = new int[n];        // 宣告陣列

        for (int j = 0; j < n; j++)
            a[j] = rand.nextInt(10);

        System.out.print("陣列a的所有元素的值\n{ ");
        //for (int j = 0; j < n; j++)
            //System.out.print(a[j] + " ");
        //System.out.println(" }");
        for (int j : a)
           System.out.print(j + " ");
         
        System.out.print("搜尋的數值:");
        int key = stdIn.nextInt();

        int i;
        for (i = n-1; i >= 0; i--)  //倒回來找
            if (a[i] == key)
                break;

        if (i < n)                            // 搜尋成功
            System.out.println("該值存在於a[" + (i+1) + "]。");
        else                // 搜尋失敗
            System.out.println("該值不存在。");          
    }
}
-----------------------------------------------------------------------------------
// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class MyP6_7 {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        final int n = 12;        // 元素數
        int[] a = new int[n];        // 宣告陣列

        for (int j = 0; j < n; j++)
            a[j] = rand.nextInt(10);

        System.out.print("陣列a的所有元素的值\n{ ");
        //for (int j = 0; j < n; j++)
            //System.out.print(a[j] + " ");
        //System.out.println(" }");
        for (int j : a)
           System.out.print(j + " ");
         
        System.out.print("搜尋的數值:");
        int key = stdIn.nextInt();

        int i;
        for (i = n-1; i >= 0; i--)  //倒回來找
            if (a[i] == key)
                break;

        if (i < n && i!=-1)                            // 搜尋成功
            System.out.println("該值存在於a[" + (i+1) + "]。");
        else                // 搜尋失敗
            System.out.println("該值不存在。");          
    }
}
----------------------------------------------------------------------------------------
// 將陣列元素的順序逆向重整並顯示

import java.util.Random;
import java.util.Scanner;

class ReverseArray {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        System.out.print("元素數:");
        int n = stdIn.nextInt();                // 輸入元素數
        int[] a = new int[n];                    // 宣告陣列

        for (int i = 0; i < n; i++) {
            a[i] = 10 + rand.nextInt(90);
            System.out.println("a[" + i + "] = " + a[i]);
        }

        for (int i = 0; i < n / 2; i++) {
            int t = a[i];
            a[i] = a[n - i - 1];     //a[i]與a[n-i-1] swap交換
            a[n - i - 1] = t;
        }

        System.out.println("將元素的排列順序逆轉。");
        for (int i = 0; i < n; i++)
            System.out.println("a[" + i + "] = " + a[i]);
    }
}
----------------------------------------------------------------------------------------
// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class MyP6_12 {

    public static void main(String[] args) {
        int[] a = {0,1,2,3,4,5,6,7,8,9};
       
        for(int i=0 ; i<10 ; ++i){   //i<10,跑幾次,不一定是10
           int r = rand.nextInt(9);  //0~8
          
           int t;
           t=a[r];
           a[r]=a[r+1];
           a[r+1]=t;
          
          
        }
           for (int v :a)
              System.out.print(v+",");

     }   
   
   
   
    }
---------------------------------------------------------------------------------------------
/**
 * 處理檔案及目錄
 *
 * @author (Shieh-Fu Chen)
 * @version (V 1.0  2011/06/27)
 *
 * 執行結果
 * ======================================================================
 * CD=D:\bobe\toBalaTech\Develop\Java\java2009\tools\npp587
 * D:\\fred.txt
 */
import java.util.Scanner;
import java.io.*;
public class MyFile2 {
   public static void main (String args[]) throws IOException   {

     System.out.println("user.dir = " + System.getProperty("user.dir"));  // JVM環境變數;取得 user.dir 環境變數的值
     System.setProperty("user.dir", "D:/");                       // 改變 user.dir 環境變數的值
       
     // java.io.File 這類別主要是處理檔案及目錄的 PathName, 而不是處理檔案的 I/O (開檔, 讀檔, 存檔),
     // 下式只是取得 fred.txt 完整目錄名稱, 並沒有建立新檔
     String s = new File("fred.txt").getAbsolutePath();  //File class;檔案不存在一樣成立
     System.out.println(s);
   
     if (new File(s).exists()) {
        Scanner stdIn = new Scanner(System.in);
       
        System.out.println("進行倒數: ");
        int x;
       
        System.out.print("正整數值: ");
        x = stdIn.nextInt();
       
        if (x == 0)
          System.out.println(new File(s).delete());
     }
       System.out.println("檔案不存在");
   }
}
-------------------------------------------------------------------------------------
/**
 * 建立文字檔, 並寫入字串資料
 *
 * @author (Sung-Lin Chen)
 * @version (V 0.1  2011/04/22)
 */

import java.util.Scanner;
import java.io.*;

class MyWriter1 {
   public static void main(String[] argv) throws IOException {
  
      // PrintWriter 沒有提供 Append File 的建構子     
      PrintWriter pWriter = new PrintWriter("d:\\MyWriter1.txt"); //PrintWriter產生一檔案,如有`存在檔案則將內容清空
      Scanner stdIn = new Scanner(System.in);

      System.out.print("ID:");
      String s = stdIn.nextLine(); //nextLine輸入字串,空白亦可

      System.out.print("Score:");
      int a = stdIn.nextInt();                       

      // 寫入檔案
      pWriter.print(s+",");
      pWriter.print(a);

      // 關閉檔案
      pWriter.close();
   }
}
---------------------------------------------------------------------------------------
/**
 * 將輸入成績, 附加在檔案後面
 *
 * @author (Sung-Lin Chen)
 * @version (V 0.1  2011/04/22)
 *
 */

import java.util.Scanner;
import java.io.*;

class MyWriter2 {
   public static void main(String[] argv) throws IOException{

        // FileWriter 有提供 Append File 的建構子, 但是寫入的方法 (write()) 只提供字元及字串資料型態
        FileWriter fWriter = new FileWriter("d:\\MyWriter2.txt", true);  //FileWriter-->true資料附加
       
          Scanner stdIn = new Scanner(System.in);

        System.out.print("Name:");
        String n = stdIn.nextLine();

        System.out.print("Address:");
        String a = stdIn.nextLine();                       
       
        fWriter.write(n+",");   // write() 無法寫入 double 資料
        fWriter.write(a);
        fWriter.write("\n");   // 在 記事本 中, 並沒有換行, 應如何解決 ?  在檔案是以ASC碼的10,13(微軟),其它OS為10         

        fWriter.close();

   }
}
-----------------------------------------------------------------------------------------------------
/**
 * 輸入五位同學, 國英數三科成績,存入文字檔
 *
 * @author (Sung-Lin Chen)
 * @version (V 0.1  2011/04/22)
 *
 */

import java.util.Scanner;
import java.io.*;

class MyWriter3 {
   public static void main(String[] argv) throws IOException {

        // FileWriter 有提供 Append File 的建構子
        FileWriter fWriter = new FileWriter("d:\\MyWriter3.txt", true);
       
        // PrintWriter 有提供好用的寫入方法 print()
        PrintWriter pWriter = new PrintWriter(fWriter);
       
          Scanner stdIn = new Scanner(System.in);

        System.out.print("學號:");
        String n = stdIn.nextLine();

        System.out.print("國文:");
        int c = stdIn.nextInt();    
       
        System.out.print("英文:");
        int e = stdIn.nextInt(); 
       
        System.out.print("數學:");
        int m = stdIn.nextInt(); 
       
        pWriter.print(n+","); // 寫入字串
        pWriter.print(c+","); // 寫入整數
        pWriter.print(e+","); // 寫入整數
        pWriter.print(m);     // 寫入整數
       
        // 根據不同作業系統, 寫入正確的換行碼
        pWriter.print(System.getProperty("line.separator")); //取得JVM環境變數            

        pWriter.close();
   }
}
----------------------------------------------------------------------------------------------------------
/**
 * 讀出文字檔內容
 *
 * @author (Sung-Lin Chen)
 * @version (V 0.1  2011/04/22)
 */

import java.io.*;

public class MyReader1 {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("d:\\MyWriter2.txt"); //FileReader讀入檔案;如檔案不存在, 則無法RUN;
        BufferedReader bReader = new BufferedReader(fileReader); //緩衝;提供很好用的METHOD readLine()
       
        String s;
        while((s = bReader.readLine()) != null ) {
           System.out.println(s);
        }
        bReader.close();
    }

}
--------------------------------------------------------------------------------------------------------
import java.util.Scanner;
import java.io.*;
class MyReaderWriter {
     public static void main(String[] args)throws IOException{
        FileWriter fWriter = new FileWriter("d:\\out.txt", false);
        FileReader fileReader = new FileReader("d:\\MyWriter2.txt");
        BufferedReader bReader = new BufferedReader(fileReader);
       
       
     String s;   
        while((s = bReader.readLine()) != null ) {
           for (int i=0; i < s.length() ; i++) {
             char c = s.charAt(i);
             fWriter.write(c==',' ? '$' : c);
             /* /* if ( c == ',' )
                System.out.print('$');
             else
                System.out.print(c); */
           }     
           fWriter.write(System.getProperty("line.separator"));   
        }
       
        fileReader.close();
        fWriter.close();       

}
}
---------------------------------------------------------------------------------------
/**
 * 讀出文字檔內容, 並解析單行文字
 *
 * @author (Shieh-Fu Chen)
 * @version (V 0.1  2011/07/04)
 *
 */

import java.io.*;

public class dafumenu {
    public static void main(String[] args) throws IOException{

        FileReader fileReader = new FileReader("d:\\dafumenu.txt");
        BufferedReader bReader = new BufferedReader(fileReader);
       
        String s;   
        while((s = bReader.readLine()) != null ) {
            if (s.equals("[system]"))
              System.out.println("system");
            else if (s.equals("[account]"))
              System.out.println("account");
            else if (s.equals("[student]"))
              System.out.println("student");
            else
               System.out.println();
           }   
              fileReader.close();
        }
       
        //fileReader.close();
   
}

2011-07-04 JAVA

// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class LinearSearch {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        final int n = 12;        // 元素數
        int[] a = new int[n];        // 宣告陣列

        for (int j = 0; j < n; j++)
            a[j] = rand.nextInt(10);

        System.out.print("陣列a的所有元素的值\n{ ");
        for (int j = 0; j < n; j++)
            System.out.print(a[j] + " ");
        System.out.println(" }");

        System.out.print("搜尋的數值:");
        int key = stdIn.nextInt();

        int i;
        for (i = 0; i < n; i++)
            if (a[i] == key)
                break;

        if (i < n)                            // 搜尋成功
            System.out.println("該值存在於a[" + i + "]。");
        else                // 搜尋失敗
            System.out.println("該值不存在。");           
    }
}
----------------------------------------------------------------------------------
// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class LinearSearch {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        final int n = 12;        // 元素數
        int[] a = new int[n];        // 宣告陣列

        for (int j = 0; j < n; j++)
            a[j] = rand.nextInt(10);

        System.out.print("陣列a的所有元素的值\n{ ");
        //for (int j = 0; j < n; j++)
            //System.out.print(a[j] + " ");
        //System.out.println(" }");
        for (int j : a)
           System.out.print(j + " ");
          
        System.out.print("搜尋的數值:");
        int key = stdIn.nextInt();

        int i;
        for (i = 0; i < n; i++)
            if (a[i] == key)
                break;

        if (i < n)                            // 搜尋成功
            System.out.println("該值存在於a[" + i + "]。");
        else                // 搜尋失敗
            System.out.println("該值不存在。");           
    }
}
-------------------------------------------------------------------------------
// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class MyP6_7 {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        final int n = 12;        // 元素數
        int[] a = new int[n];        // 宣告陣列

        for (int j = 0; j < n; j++)
            a[j] = rand.nextInt(10);

        System.out.print("陣列a的所有元素的值\n{ ");
        //for (int j = 0; j < n; j++)
            //System.out.print(a[j] + " ");
        //System.out.println(" }");
        for (int j : a)
           System.out.print(j + " ");
         
        System.out.print("搜尋的數值:");
        int key = stdIn.nextInt();

        int i;
        for (i = n-1; i >= 0; i--)  //倒回來找
            if (a[i] == key)
                break;

        if (i < n)                            // 搜尋成功
            System.out.println("該值存在於a[" + (i+1) + "]。");
        else                // 搜尋失敗
            System.out.println("該值不存在。");          
    }
}
------------------------------------------------------------------------------------
// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class MyP6_7 {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        final int n = 12;        // 元素數
        int[] a = new int[n];        // 宣告陣列

        for (int j = 0; j < n; j++)
            a[j] = rand.nextInt(10);

        System.out.print("陣列a的所有元素的值\n{ ");
        //for (int j = 0; j < n; j++)
            //System.out.print(a[j] + " ");
        //System.out.println(" }");
        for (int j : a)
           System.out.print(j + " ");
         
        System.out.print("搜尋的數值:");
        int key = stdIn.nextInt();

        int i;
        for (i = n-1; i >= 0; i--)  //倒回來找
            if (a[i] == key)
                break;

        if (i < n && i!=-1)                            // 搜尋成功
            System.out.println("該值存在於a[" + (i+1) + "]。");
        else                // 搜尋失敗
            System.out.println("該值不存在。");          
    }
}
----------------------------------------------------------------------------------------------
// 將陣列元素的順序逆向重整並顯示

import java.util.Random;
import java.util.Scanner;

class ReverseArray {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner stdIn = new Scanner(System.in);

        System.out.print("元素數:");
        int n = stdIn.nextInt();                // 輸入元素數
        int[] a = new int[n];                    // 宣告陣列

        for (int i = 0; i < n; i++) {
            a[i] = 10 + rand.nextInt(90);
            System.out.println("a[" + i + "] = " + a[i]);
        }

        for (int i = 0; i < n / 2; i++) {
            int t = a[i];
            a[i] = a[n - i - 1];     //a[i]與a[n-i-1] swap交換
            a[n - i - 1] = t;
        }

        System.out.println("將元素的排列順序逆轉。");
        for (int i = 0; i < n; i++)
            System.out.println("a[" + i + "] = " + a[i]);
    }
}
-----------------------------------------------------------------------------------

// 線性搜尋

import java.util.Random;
import java.util.Scanner;

class MyP6_12 {

    public static void main(String[] args) {
        int[] a = {0,1,2,3,4,5,6,7,8,9};
       
        for(int i=0 ; i<10 ; ++i){   //i<10,跑幾次,不一定是10
           int r = rand.nextInt(9);  //0~8
          
           int t;
           t=a[r];
           a[r]=a[r+1];
           a[r+1]=t;
          
          
        }
           for (int v :a)
              System.out.print(v+",");

     }   

   
   
    }
----------------------------------------------------------------------------
/**
 * 處理檔案及目錄
 *
 * @author (Shieh-Fu Chen)
 * @version (V 1.0  2011/06/27)
 *
 * 執行結果
 * ======================================================================
 * CD=D:\bobe\toBalaTech\Develop\Java\java2009\tools\npp587
 * D:\\fred.txt
 */
import java.util.Scanner;
import java.io.*;
public class MyFile2 {
   public static void main (String args[]) throws IOException   {

     System.out.println("user.dir = " + System.getProperty("user.dir"));  // JVM環境變數;取得 user.dir 環境變數的值
     System.setProperty("user.dir", "D:/");                       // 改變 user.dir 環境變數的值
       
     // java.io.File 這類別主要是處理檔案及目錄的 PathName, 而不是處理檔案的 I/O (開檔, 讀檔, 存檔),
     // 下式只是取得 fred.txt 完整目錄名稱, 並沒有建立新檔
     String s = new File("fred.txt").getAbsolutePath();  //File class;檔案不存在一樣成立
     System.out.println(s);
   
     if (new File(s).exists()) {
        Scanner stdIn = new Scanner(System.in);
       
        System.out.println("進行倒數: ");
        int x;
       
        System.out.print("正整數值: ");
        x = stdIn.nextInt();
       
        if (x == 0)
          System.out.println(new File(s).delete());
     }
       System.out.println("檔案不存在");
   }
}
------------------------------------------------------------------------------
/**
 * 建立文字檔, 並寫入字串資料
 *
 * @author (Sung-Lin Chen)
 * @version (V 0.1  2011/04/22)
 */

import java.util.Scanner;
import java.io.*;

class MyWriter1 {
   public static void main(String[] argv) throws IOException {
  
      // PrintWriter 沒有提供 Append File 的建構子     
      PrintWriter pWriter = new PrintWriter("d:\\MyWriter1.txt"); //PrintWriter產生一檔案,如有`存在檔案則將內容清空
      Scanner stdIn = new Scanner(System.in);

      System.out.print("ID:");
      String s = stdIn.nextLine(); //nextLine輸入字串,空白亦可

      System.out.print("Score:");
      int a = stdIn.nextInt();                       

      // 寫入檔案
      pWriter.print(s+",");
      pWriter.print(a);

      // 關閉檔案
      pWriter.close();
   }
}
-------------------------------------------------------------------------------
/**
 * 將輸入成績, 附加在檔案後面
 *
 * @author (Sung-Lin Chen)
 * @version (V 0.1  2011/04/22)
 *
 */

import java.util.Scanner;
import java.io.*;

class MyWriter2 {
   public static void main(String[] argv) throws IOException{

        // FileWriter 有提供 Append File 的建構子, 但是寫入的方法 (write()) 只提供字元及字串資料型態
        FileWriter fWriter = new FileWriter("d:\\MyWriter2.txt", true);  //FileWriter-->true資料附加
       
          Scanner stdIn = new Scanner(System.in);

        System.out.print("Name:");
        String n = stdIn.nextLine();

        System.out.print("Address:");
        String a = stdIn.nextLine();                       
       
        fWriter.write(n+",");   // write() 無法寫入 double 資料
        fWriter.write(a);
        fWriter.write("\n");   // 在 記事本 中, 並沒有換行, 應如何解決 ?在檔案是以ASC碼的10,13 (微軟),其它OS為10              

        fWriter.close();

   }
}
----------------------------------------------------------------------------------------------
/**
 * 輸入五位同學, 國英數三科成績,存入文字檔
 *
 * @author (Sung-Lin Chen)
 * @version (V 0.1  2011/04/22)
 *
 */

import java.util.Scanner;
import java.io.*;

class MyWriter3 {
   public static void main(String[] argv) throws IOException {

        // FileWriter 有提供 Append File 的建構子
        FileWriter fWriter = new FileWriter("d:\\MyWriter3.txt", true);
      
        // PrintWriter 有提供好用的寫入方法 print()
        PrintWriter pWriter = new PrintWriter(fWriter);
      
          Scanner stdIn = new Scanner(System.in);

        System.out.print("學號:");
        String n = stdIn.nextLine();

        System.out.print("國文:");
        int c = stdIn.nextInt();   
      
        System.out.print("英文:");
        int e = stdIn.nextInt();
      
        System.out.print("數學:");
        int m = stdIn.nextInt();
      
        pWriter.print(n+","); // 寫入字串
        pWriter.print(c+","); // 寫入整數
        pWriter.print(e+","); // 寫入整數
        pWriter.print(m);     // 寫入整數
      
        // 根據不同作業系統, 寫入正確的換行碼
        pWriter.print(System.getProperty("line.separator")); //取得JVM環境變數           

        pWriter.close();
   }
}
-----------------------------------------------------------------------------------------------------------
/**
 * 讀出文字檔內容
 *
 * @author (Sung-Lin Chen)
 * @version (V 0.1  2011/04/22)
 */

import java.io.*;

public class MyReader1 {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("d:\\MyWriter2.txt"); //FileReader讀入檔案;如檔案不存在, 則無法RUN;
        BufferedReader bReader = new BufferedReader(fileReader); //緩衝;提供很好用的METHOD readLine()
       
        String s;
        while((s = bReader.readLine()) != null ) {
           System.out.println(s);
        }
        bReader.close();
    }
}
----------------------------------------------------------------------------------------------------
import java.util.Scanner;
import java.io.*;
class MyReaderWriter {
     public static void main(String[] args)throws IOException{
        FileWriter fWriter = new FileWriter("d:\\out.txt", false);
        FileReader fileReader = new FileReader("d:\\MyWriter2.txt");
        BufferedReader bReader = new BufferedReader(fileReader);
       
       
     String s;   
        while((s = bReader.readLine()) != null ) {
           for (int i=0; i < s.length() ; i++) {
             char c = s.charAt(i);
             fWriter.write(c==',' ? '$' : c);
             /* /* if ( c == ',' )
                System.out.print('$');
             else
                System.out.print(c); */
           }     
           fWriter.write(System.getProperty("line.separator"));   
        }
       
        fileReader.close();
        fWriter.close();       

}
}
-------------------------------------------------------------------
/**
 * 讀出文字檔內容, 並解析單行文字
 *
 * @author (Shieh-Fu Chen)
 * @version (V 0.1  2011/07/04)
 *
 */

import java.io.*;

public class dafumenu {
    public static void main(String[] args) throws IOException{

        FileReader fileReader = new FileReader("d:\\dafumenu.txt");
        BufferedReader bReader = new BufferedReader(fileReader);
       
        String s;   
        while((s = bReader.readLine()) != null ) {
            if (s.equals("[system]"))
              System.out.println("system");
            else if (s.equals("[account]"))
              System.out.println("account");
            else if (s.equals("[student]"))
              System.out.println("student");
            else
               System.out.println();
           }   
              fileReader.close();
        }
       
        //fileReader.close();
   
}

2011年7月2日 星期六

三味食堂 2011-07-02

三味食堂

                                           
 鮭魚握壽司-----必點

 蛋包飯

 烤雞串

海膽手卷----必點

 綜合生魚片

 鮭魚卵手卷----必點

牡丹蝦

2011年6月30日 星期四

2011-07-01 JAVA

1.http://www.ithome.com
   code review(程式碼審查)
   Design Pattern

class MyP5_66 {
     public static void main(String[] args) {
          System.out.println(Float.toHexString(3.75f));
   
     }

}
---------------------------------------------------------------------------
// 顯示關係運算子、相等運算子、邏輯否定運算子所產生的值

import java.util.Scanner;

class BooleanTester {

    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);

        System.out.print("整數a:"); int a = stdIn.nextInt();
        System.out.print("整數b:"); int b = stdIn.nextInt();

        System.out.println("a <  b  = " + (a <  b));
        System.out.println("a <= b  = " + (a <= b));
        System.out.println("a >  b  = " + (a >  b));
        System.out.println("a >= b  = " + (a >= b));
        System.out.println("a == b  = " + (a == b));
        System.out.println("a != b  = " + (a != b));
        System.out.println("!(a==0) = " + !(a == 0));
        System.out.println("!(b==0) = " + !(b == 0));
    }
}
------------------------------------------------------------------------------------
import java.util.Scanner;
class MyP6_5 {
     public static void main(String[] args) {
          Scanner stdIn = new Scanner(System.in);
         
          System.out.print("元素數:");
          int n = stdIn.nextInt();
          int[] a = new int[n];
         
          for (int i = 0; i < n ; i++) {
              System.out.print("a[" + i + "] = ");
              a[i] = stdIn.nextInt();
             
          }
          System.out.print("a = {");
          for (int i = 0 ; i < n-1; i++)
              System.out.print(a[i] + ",");
             
              System.out.println(a[n-1]+"}");
   
     }


}
---------------------------------------------------------------------------
// 求出並顯示陣列所有元素的總和(強化型for敘述)

class ArraySumForIn {

    public static void main(String[] args) {
        double[] a = { 1.0, 2.0, 3.0, 4.0, 5.0 };

        for (int i = 0; i < a.length; i++)
            System.out.println("a[" + i + "] = " + a[i]);

        double sum = 0;        // 總和
        for (double i : a)
            sum += i;

        System.out.println("所有元素的總和為" + sum + "。");
    }
}
---------------------------------------------------------------------------------------
// 以1、2、3、4、5初始化陣列的各個元素後顯示

class IntArrayInit {

    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4, 5};
        a = new int[] {10,20,30,40,50};
        for (int i = 0; i < a.length; i++)
            System.out.println("a[" + i + "] = " + a[i]);
    }
}
--------------------------------------------------------------------------------
// 輸入陣列所有元素的值並顯示

import java.util.Scanner;

class IntArrayScan {

    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);

        System.out.print("元素數:");
        int n = stdIn.nextInt();            // 輸入元素數
        int[] a = new int[n];                // 產生陣列

        for (int i = 0; i < n; i++) {
            System.out.print("a[" + i + "] = ");
            a[i] = stdIn.nextInt();
        }

        for (int i = 0; i < n; i++)
            System.out.println("a[" + i + "] = " + a[i]);
    }
}
-----------------------------------------------------------------------------
// 因輸出回列首而改寫顯示完成的字元

class CarriageReturn {

    public static void main(String[] args) {
        System.out.print("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        System.out.println("\r12345\\");
    }
}
------------------------------------------------------------------------------------
// 從0.0開始遞增0.001至1.0為止,並且顯示其總和(以float控制迴圈)

class FloatSum1 {

    public static void main(String[] args) {
        float sum = 0.0F;

        for (float x = 0.0F; x <= 1.0F; x += 0.1F) {
            System.out.println("x = " + x);
            sum += x;
        }
        System.out.println("sum = " + sum);
    }
}

2011-06-30 JAVA

1.http://javaclubtw.blogspot.com/
2.windows 記憶體配置

3.Linux記憶體配置






4. int   4bytes  * 8 = 32bits
    long 8bytes * 8 = 64bits
    char 2bytes * 8 = 16bits
    boolean 2bytes * 8 = 16bits    
    float 4bytes * 8 = 32bits
    double 8bytes * 8 = 64bits
--------------------------------------------------------------------------
 class MyP5_60 {
         class static void main(String[] args) {
                 long x = 10; //10為int,casting(改型)
           
      

        }


}
--------------------------------------------------------------------

 class MyP5_60 {




class static void main(String[] args) {



long x = 2148000000L; //預設為int,compiler錯誤;加L則OK!





System.out.println("Long整數測試: " + x);





}



}




2010年12月20日 星期一

關於使用Intel PRO/Wirless LAN 2100 3B Mini PCI Adapter無法連上無線網路

之前由於我的Acer TravelMate C300使用的無線網卡為Intel PRO/Wirless LAN 2100 3B Mini PCI Adapter,在連上AP時都無法認證上網.
找了許久的時間,終於找到原因,Intel PRO/Wirless LAN 2100 3B Mini PCI Adapter這張網卡並不支援WAP2認證,該怎麼辦?去下載lrwc89ww.exe即可解決WAP2無法認證的問題.
http://www-307.ibm.com/pc/support/site.wss/license.do?filename=mobiles/1rwc89ww.exe

2010年12月14日 星期二

中研院用OTRS做網格與資安管理

中研院用OTRS做網格與資安管理
中研院利用開放源碼的OTRS打造管理跨國網格服務的Ticketing System,發揮了應有的記錄與追蹤資安事件的功能,下一步中研院資安小組將更主動、積極,針對主機、防火牆和路由器的Log(登錄檔)做主動式的監控、記錄,並配合OTRS的Ticketing System,收集資料及發送資安通報。

早期IT部門透過E-mail或電話解決其他部門同仁問題,當IT服務事件數量逐漸增多時,這樣的服務效率便趕不上同仁提出需求與解決需求的速度。因此,有些IT部門便設法建立一套事件通報管理系統(Ticketing System)。中央研究院就利用開放源碼的OTRS(Open Source Ticket Request System)軟體,打造管理網格服務和資安事件通報管理系統。

中研院網格計算團隊大規模使用Ticketing System

中研院網格計算團隊和瑞士、義大利、英國、法國和俄羅斯組成全球核心維運中心,監控全球網格系統並協助區域維運中心處理問題。中研院網格計算團隊則是亞太地區的維運中心,負責整個亞洲地區,包含澳洲、日本、印度、韓國、新加坡和臺灣的網格基本運作。

因為中研院網格計算團隊必須負起網格系統建置、問題排除、應用發展以及區域合作等事宜,包括提供亞太6個國家各種網格服務需求,以及提供網格憑證申請與管理服務。這使得中研院網格計算團隊面臨處理繁雜申請事項的困難。

中研院網格計算團隊除了要監控網格網路外,還得要處理各國提出的網格服務需求。為了有效追蹤需求的處理進度,中研院網格計算團隊專案經理蔡明宏利用開放源碼的OTRS,打造屬於中研院網格計算中心的Ticketing System。


OTRS勝出原因在於低成本、有彈性、容易建置

知名的開放源碼事件管理系統,除了OTRS,還有RT:Request Tracker這一套軟體。

「想要的功能,既有的模組就能夠滿足,甚至還有部分自動化功能,或把2個Ticketing System合而為一。」使用方便是網格計算團隊使用OTRS的首要原因。

其次,因為OTRS是開放源碼,「建置成本較低,還可因應不同IT環境,不用動很多程式碼就可有彈性地修改系統,」

OTRS特別之處還在於,「能夠與網格網路監控系統整合,並結合簡訊和電子郵件方式,對網路監控異常狀態時發送通知。」,這是其他Ticketing System不容易做到的。

因為OTRS是開放源碼,IT部門一定要熟悉Linux,並注意資料庫的支援設定即可。目前OTRS比較大的缺點在於對正體中文的支援較為不足。OTRS與CRM(客戶關係管理)系統的整合,將會是Ticketing System下一步發展的方向。」

中研院資訊中心資安小組用OTRS做資安事件管理
在2007年1月才成立的中研院資訊中心資安小組,則利用OTRS來管控資安事件通報。

中研院資訊中心會接收來自教育部、國內外民間企業、國內外大學資訊中心、技術服務中心等許多外部的資安通報。早期,中研院是由資訊中心網路組及系統組來兼管資訊安全,在收到中研院IP被列為可疑受害名單的資安通報後,網路或系統組成員會將該通報郵件轉寄給受害單位的IT部門同仁。不過,中研院資訊中心資安小組工程師陳凱斌表示,以前的作法只是轉寄資安通報,無法記錄並進一步追蹤受害單位是否有解決問題,因而使得資安通報成效往往不彰,只是虛應了事罷了。

中研院資訊中心在2007年1月正式成立資安小組,負責包含中研院及其各所的資安事件通報與追蹤。為了解決以往資安通報只能單向傳遞資訊,資安小組決定建立一個能夠記錄並追蹤的資安事件通報的管理系統(Ticketing System)。

中研院資訊中心資安小組工程師張智翔負責建立Ticketing System,他也選擇OTRS來建置Ticketing System。他指出,由許多使用者的網路評價來看,OTRS在模組化、設定與操作上,獲得很高的評價。

張智翔表示,OTRS在設定上並不難,但初期安裝時,因為使用Fedora 6.0的作業系統,安裝時出現問題,後來改用Open2作業系統後,問題就解決了。

他說:「從2007年3月開始搜尋合適的Ticketing System,5月安裝,7月正式上線,從評估到正式導入所花費的時間並不久。」同樣地,資安小組也面臨OTRS使用者介面(UI)轉換正體中文的困難,張智翔說,後來是將OTRS支援的簡體中文使用者介面,在記事本或Word中,轉換成正體中文之後,即可取代原本的簡體中文使用者介面。

以往資安通報可能會分散地轉交給其他所的IT部門同仁,中研院資訊中心資安小組工程師陳新民表示,透過OTRS建置的Ticketing System,所有資安通報都會被列管記錄、追蹤,資安小組也可以將被通報有資安狀況而必須立即處理的受害IP,一併通報給各所的IT人員,而各所的IT人員在資安事件解決完後,可以透過Ticketing System做事件處理回覆。陳新民認為,這也解決長期以來,中研院某些所因為IT人力較為短缺的問題,因為對相關資安事件通報反應慢,也沒有記錄可追蹤,資安小組也難以提供任何協助。

陳凱斌表示,目前以OTRS建置的Ticketing System,發揮了應有的記錄與追蹤資安事件的功能,下一步,資安小組將扮演更主動、積極的角色,會針對主機、防火牆和路由器的Log(登錄檔)做主動式的監控、記錄,並配合OTRS的Ticketing System,收集資料及發送資安通報。

2010年12月9日 星期四

網管必懂知識

網管必懂知識

1、什麼時候使用多路由協定?
            當兩種不同的路由協定要交換路由訊息時,就要用到多路由協定。當然,路由再分配也可以交換路由訊息。下列情況不必使用多路由協定:
            從老版本的內定通訊閘協定( Interior Gateway Protocol,I G P)升級到新版本的I G P。
            你想使用另一種路由協定但又必須保留原來的協定。
            你想終止內定路由,以免受到其他沒有嚴格過濾監管功能的路由器的干擾。
            你在一個由多個廠家的路由器構成的環境下。
            什麼是距離向量路由協定?
            距離向量路由協定是為小型網路環境設計的。在大型網路環境下,這類協定在學習路由及保持路由將產生較大的流量,佔用過多的頻寬。若果在9
            0秒內沒有收到相鄰站台傳送的路由選取表更新,它才認為相鄰站台不可達。每隔30秒,距離向量路由協定就要向相鄰站台傳送整個路由選取表,使相鄰站台的路由選取表得到更新。這樣,它就能從別的站台(直接相連的或其他模式連線的)收集一個網路的清單,以便進行路由選取。距離向量路由協定使用跳數作為度量值,來計算到達目的地要經由的路由器數。

            例如,R I P使用B e l l m a n - F o r
            d算法確定最短路徑,即只要經由最小的跳數就可到達目的地的線路。最大容許的跳數通常定為1 5。那些必須經由1
            5個以上的路由器的終端被認為是不可到達的。
            距離向量路由協定有如下幾種: IP RIP、IPX RIP、A p p l e Talk RT M P和I G R P。
            什麼是連結狀態路由協定?
            連結狀態路由協定更適合大型網路,但由於它的複雜性,使得路由器需要更多的C P
            U資源。它能夠在更短的時間內發現已經斷了的鏈路或新連線的路由器,使得協定的會聚時間比距離向量路由協定更短。通常,在1
            0秒鐘之內沒有收到鄰站的H E L
            LO報文,它就認為鄰站已不可達。一個連結狀態路由器向它的鄰站傳送更新報文,知會它所知道的所有鏈路。它確定最優路徑的度量值是一個數值代價,這個代價的值一般由鏈路的頻寬決定。具有最小代價的鏈路被認為是最優的。在最短路徑優先算法中,最大可能代價的值幾乎可以是無限的。

            若果網路沒有發生任何變化,路由器只要週期性地將沒有更新的路由選取表進行刷新就可以了(週期的長短可以從3 0分鐘到2個小時)。
            連結狀態路由協定有如下幾種: IP OSPF、IPX NLSP和I S - I S。
            一個路由器可以既使用距離向量路由協定,又使用連結狀態路由協定嗎?
            可以。每一個接口都可以組態為使用不同的路由協定;但是它們必須能夠通過再分配路由來交換路由訊息。(路由的再分配將在本章的後面進行討論。)
            2、什麼是訪問表?
            訪問表是管理者加入的一系列控制封包在路由器中輸入、輸出的規則。它不是由路由器自己產生的。訪問表能夠容許或禁止封包進入或輸出到目的地。訪問表的表項是順序執行的,即封包到來時,首先看它是否是受第一條表項約束的,若不是,再順序向?蔥校蝗綣??氳諞惶醣硐釔洌?蘼凼潛輝市砘故潛喚?梗?疾槐卦僦蔥邢旅奼硐畹募觳榱恕?

            每一個接口的每一種協定只能有一個訪問表。
            支援哪些類型的訪問表?
            一個訪問表可以由它的編號來確定。具體的協定及其對應的訪問表編號如下:
            ◎I P標準訪問表編號:1~9 9
            ◎I P延伸訪問表編號:1 0 0~1 9 9
            ◎I P X標準訪問表編號:8 0 0~8 9 9
            ◎I P X延伸訪問表編號:1 0 0 0~1 0 9 9
            ◎AppleTa l k訪問表編號:6 0 0~6 9 9
            提示在Cisco IOS Release11.2或以上版本中,可以用有名訪問表確定編號在1~199的訪問表。
            如何建立IP標準訪問表?
            一個I P標準訪問表的建立可以由如下指令來完成: Access-list access list number {permit |
            deny} source [source-mask]
            在這條指令中:
            ◎access list number:確定這個入口屬於哪個訪問表。它是從1到9 9的數字。
            ◎permit | deny:表明這個入口是容許還是阻塞從特定位址來的訊息流量。
            ◎source:確定源I P位址。
            ◎s o u r c e - m a s
            k:確定位址中的哪些比特是用來進行符合的。若果某個比特是"1",表明位址中該位比特不用管,若果是"0"的話,表明位址中該位比特將被用來進行符合。可以使用關鍵字。

            以下是一個路由器組態檔中的訪問表例子:
            Router# show access-lists
            Standard IP access list 1
            deny 204.59.144.0, wildcard bits 0.0.0.255
            permit any
            3、什麼時候使用路由再分配?
            路由再分配通常在那些負責從一個自治系統學習路由,然後向另一個自治系統廣播的路由器上進行組態。若果你在使用I G R P或E I G R
            P,路由再分配通常是自動執行的。
            4、什麼是管理距離?
            管理距離是指一種路由協定的路由可信度。每一種路由協定按可嚎性從高到低,依次分配一個信任等級,這個信任等級就叫管理距離。對於兩種不同的路由協定到一個目的地的路由訊息,路由器首先根據管理距離決定相信哪一個協定。

            6、如何組態再分配?
            在進行路由再分配之前,你必須首先:
            1) 決定在哪兒加入新的協定。
            2) 確定自治系統邊界路由器(ASBR)。
            3) 決定哪個協定在核心,哪個在邊界。
            4) 決定進行路由再分配的方向。
            可以使用以下指令再分配路由更新(這個例子是針對OSPF的):
            router(config-router)#redistribute protocol [process-id] [metric
            metric - value ] [metric-type type - value ] [subnets]
            在這個指令中:
            ◎protocol:指明路由器要進行路由再分配的源路由協定。
            主要的值有: bgp、eqp、igrp、isis、ospf、static [ ip ]、connected和rip。
            ◎process-id:指明OSPF的進度ID。
            ◎metric:是一個可選的參數,用來指明再分配的路由的度量值。預設的度量值是0。
            7、為什麼確定毗鄰路由器很重要?
            在一個小型網路中確定毗鄰路由器並不是一個主要問題。因為當一個路由器發生故障時,別的路由器能夠在一個可接受的時間內收斂。但在大型網路中,發現一個故障路由器的時延可能很大。知道毗鄰路由器可以加速收斂,因為路由器能夠更快地知道故障路由器,因為hello報文的間隔比路由器交換訊息的間隔時間短。

            使用距離向量路由協定的路由器在毗鄰路由器沒有傳送路由更新訊息時,才能發現毗鄰路由器已不可達,這個時間一般為10~90秒。而使用連結狀態路由協定的路由器沒有收到hello報文就可發現毗鄰路由器不可達,這個間隔時間一般為10秒鐘。

            距離向量路由協定和連結狀態路由協定如何發現毗鄰路由器?
            使用距離向量路由協定的路由器要建立一個路由表(其中內含與它直接相連的網路),同時它會將這個路由表傳送到與它直接相連的路由器。毗鄰路由器將收到的路由表合併入它自己的路由表,同時它也要將自己的路由表傳送到它的毗鄰路由器。使用連結狀態路由協定的路由器要建立一個連結狀態表,內含整個網路目的站的清單。在更新報文中,每個路由器傳送它的整個清單。當毗鄰路由器收到這個更新報文,它就複制其中的內容,同時將訊息發向它的鄰站。在轉信路由表內容時沒有必要進行重新計算。

            注意使用IGRP和EIGRP的路由器廣播hello報文來發現鄰站,同時像OSPF一樣交換路由更新訊息。EIGRP為每一種網路層協定儲存一張鄰站表,它內含鄰站的位址、在佇列中等待傳送的報文的數量、從鄰站接收或向鄰站傳送報文需要的平均時間,以及在確定連結中斷之前沒有從鄰站收到任何報文的時間。

            8、什麼是自治系統?
            一個自治系統就是處於一個管理機構控制之下的路由器和網路群群組。它可以是一個路由器直接連線到一個LAN上,同時也連到Internet上;它可以是一個由企業骨幹網互連的多個局域網。在一個自治系統中的所有路由器必須相互連線,執行相同的路由協定,同時分配同一個自治系統編號。自治系統之間的連結使用外部路由協定,例如B
            G P。
9、什麼是BGP?
            BGP(Border
            GatewayProtocol)是一種在自治系統之間動態交換路由訊息的路由協定。一個自治系統的經典定義是在一個管理機構控制之下的一群組路由器,它使用IGP和普通度量值向其他自治系統轉信報文。

            在BGP中使用自治系統這個術語是為了強調這樣一個事實:一個自治系統的管理對於其他自治系統而言是提供一個統一的內定選路計劃,它為那些通過它可以到達的網路提供了一個一致的描述。

            10、BGP支援的會話種類?
            BGP相鄰路由器之間的會話是建立在TCP協定之上的。TCP協定提供一種可嚎的傳輸機制,支援兩種類型的會話:
            o 外部BGP(EBGP):是在屬於兩個不同的自治系統的路由器之間的會話。這些路由器是毗鄰的,共享相同的介質和子網。
            o
            內定BGP(IBGP):是在一個自治系統內定的路由器之間的會話。它被用來在自治系統內定協調和同步尋找路由的進度。BGP路由器可以在自治系統的任何位置,甚至中間可以相隔數個路由器。

            注意"起始的資料流的內容是整個BGP路由表。但以後路由表發生變化時,路由器只傳輸變化的部分。BGP不需要週期性地更新整個路由表。因此,在連線已建立的期間,一個BGP傳送者必須儲存有目前所有同級路由器共有的整個BGP路由表。BGP路由器週期性地傳送Keep
            Alive消息來確認連線是啟用的。當發生錯誤或特殊情況時,路由器就傳送Notification消息。當一條連線發生錯誤時,會產生一個notification消息並中斷連線。"-來自RFC11654、BGP*作。

            11、BGP容許路由再分配嗎?
            容許。因為BGP主要用來在自治系統之間進行路由選取,所以它必須支援RIP、OSPF和
            IGRP的路由選取表的綜合,以便將它們的路由表轉入一個自治系統。BGP是一個外部路由協定,因此它的*作與一個內定路由協定不同。在BGP中,只有當一條路由已經存在於IP路由表中時,才能用NETWORK指令在BGP路由表中建立一條路由。

            12、如何顯示在資料庫中的所有BGP路由?
            要顯示資料庫中的所有BGP路由,只需在EXEC指令行下輸入:
            show ip bgp paths
            這個指令的輸出可能是:
            Address Hash Refcount MetricPath
            0 x 2 9 7 A 9 C 0 2 0 i
            13、什麼是水平分割?
            水平分割是一種避免路由環的出現和加快路由匯聚的技術。由於路由器可能收到它自己傳送的路由訊息,而這種訊息是無用的,水平分割技術不反向通告任何從終端收到的路由更新訊息,而只通告那些不會由於計數到無窮而清除的路由。

            14、路由環是如何產生的?
            由於網路的路由匯聚時間的存在,路由表中新的路由或變更的路由不能夠很快在全網中穩定,使得有不一致的路由存在,於是會產生路由環。
            15、什麼是度量值?
            度量值代表距離。它們用來在尋找路由時確定最優路由。每一種路由算法在產生路由表時,會為每一條通過網路的路徑產生一個數值(度量值),最小的值表示最優路徑。度量值的計算可以只考慮路徑的一個特性,但更複雜的度量值是綜合了路徑的多個特性產生的。一些常用的度量值有:

            ◎跳步數:報文要通過的路由器輸出連接埠的個數。
            ◎Ticks:資料鏈路的延時(大約1/18每秒)。
            ◎代價:可以是一個任意的值,是根據頻寬,費用或其他網路管理者定義的計算方法得到的。
            ◎頻寬:資料鏈路的容量。
            ◎時延:報文從源端傳到目的地的時間長短。
            ◎負載:網路資源或鏈路已被使用的部分的大小。
            ◎可嚎性:網路鏈路的錯誤比特的比率。
            ◎最大傳輸單元(MTU):在一條路徑上所有連結可接受的最大消息長度(單位為位元組)。
            IGRP使用什麼類型的路由度量值?這個度量值由什麼群組成?
            IGRP使用多個路由度量值。它內含如下部分:
            ◎頻寬:源到目的之間最小的頻寬值。
            ◎時延:路徑中積累的接口延時。
            ◎可嚎性:源到目的之間最差的可能可嚎性,基於鏈路保持的狀態。
            ◎負載:源到目的之間的鏈路在最壞情況下的負載,用比特每秒表示。
            ◎MTU:路徑中最小的M T U值。
            16、度量值可以修改或調整嗎?
            加一個正的偏移量。這個指令的完整結構如下:可以使用OFFSET-LIST ROUTER子指令
            為訪問表中的網路輸入和輸出度量值加入一個正的偏移量。
            offset-list {in|out} offset [access-list] no offset-list {in|out}
            offset [access-list]
            若果參數LIST的值是0,那麼OFFSET參數將新增到所有的度量值。若果OFFSET的值是0,那麼就沒有任何作用。對於IGRP來說,偏移量的值只加到時延上。這個子指令也適用於RIP和hello路由協定。

            使用帶適當參數的NO OFFSET- LIST指令可以清除這個偏移量。
            在以下的例子中,一個使用IGRP的路由器在所有輸出度量值的時延上加上偏移量10: offset-list out 10
            下面是一個將相同的偏移量新增到訪問表121上的例子:
            offset-list out 10 121
            17、每個路由器在尋找路由時需要知道哪五部分訊息?
            所有的路由器需要如下訊息為報文尋找路由:
            ◎目的位址:報文傳送的目的主電腦。
            ◎鄰站的確定:指明誰直接連線到路由器的接口上。
            ◎路由的發現:發現鄰站知道哪些網路。
            ◎選取路由:通過從鄰站學習到的訊息,提供最優的(與度量值有關)到達目的地的路徑。
            ◎保持路由訊息:路由器儲存一張路由表,它存儲所知道的所有路由訊息。
            18、Cisco路由器支援的路由協定與其他廠家裝置的協定相容嗎?
            除了IGRP和EIGRP,Cisco路由器支援的所有路由協定都與其他廠家實現的相同協定相容。IGRP和EIGRP是Cisco的專利產品。

            19、RIP路由表的表項的訊息說明了什麼?
            RIP路由表的每一個表項都提供了一定的訊息,內含最終目的位址、到目的地的下一跳位址和度量值。這個度量值表示到目的終端的距離(跳步數)。其他的訊息也可以內含。

            路由器問題補充:
            1、Cisco3600系列路由器目前是否支援廣域網接口卡WIC-2T和WIC-2A/S?
            Cisco3600系列路由器在12.007XK及以上版本支援WIC-2T和WIC-2A/S這兩種廣域網接口卡。
            但是需要注意的是:
            只有快速乙太網混合網路模組能夠支援這兩種廣域網接口卡。
            支援這兩種接口卡的網路模組如下所示:
            NM-1FE2W, NM-2FE2W, NM-1FE1R2W, NM-2W。
            而乙太網混合網路模組不支援,如下所示:
            NM-1E2W,NM-2E2W, NM1E1R2W。
            2、Cisco3600系列路由器的NM(4A/S,NM(8A/S網路模組和WIC(2A/S廣域網接口卡支援的最大異/同步速率各是多少?
            這些網路模組和廣域網接口卡既能夠支援異步,也能夠支援同步。支援的最大異步速率均為115.2Kbps,最大同步速率均為128Kbps。
            3、WIC-2T與WIC-1T的電纜各是哪種?
            WIC-1T:DB60轉V35或RS232、 449等電纜。 如:CAB-V35-MT。
            WIC-2T:SMART型轉V35或RS232、 449等電纜。 如: CAB-SS-V35-MT。
            4、Cisco 7000系列上的MCE1與Cisco 2600/3600上的E1、 CE1有什麼區別?
            Cisco 7000上的MCE1可組態為E1、 CE1, 而Cisco 2600/3600上的E1、 CE1僅支援自己的功能。
            5、Cisco 2600系列路由器,是否支援VLAN間路由,對IOS軟體有何需求?
            Cisco(2600系列路由器中,只有Cisco2620和Cisco2621可以支援VLAN間的
            路由(百兆連接埠才支援VLAN間路由)。並且若果支援VLAN間路由,要求IOS軟體必須內含IP Plus特性集。
            6、Cisco3660路由器與3620/3640路由器相比在硬體上有那些不同?
            不同點如下:
            *
            Cisco3660路由器基本組態內含1或2個10/100M自適應快速乙太網接口;而Cisco3620/3640基本組態中不內含乙太網接口。

            * Cisco3660路由器支援網路模組熱插拔,而 Cisco3620/3640不支援網路模組熱插拔。
            * Cisco3660的冗余電源為內置, 而Cisco3620/3640的冗余電源為外置的。
            7、為什麼3640不能識別NM-1FE2W?
            需要將IOS升級到12.0.7T
            交換機問題
            關於交換機問題:
            1、Catalyst 35500XL/2950XL的堆疊是如何實現的?
            a. 需要使用專門的堆疊電纜,1米長或50厘米長(CAB-GS-1M或CAB-GS-50CM)以及專門的千兆堆疊卡GigaStack
            GBIC (WS-X3550-XL) (該卡已含CAB-GS-50CM 堆疊電纜)。
            b. 可以選用2種堆疊方法:菊花鏈法(提供1G的頻寬)或點對點法(提供 2G的頻寬)。
            c. 2種方法都可以做備份。
            d. 菊花鏈法最多可支援9台交換機的堆疊, 點對點法最多可支援8台。
            2、Catalyst 3550 XL系列交換機做堆疊時,是否支援冗余備份?
            Catalyst3550XL系列交換機的堆疊有兩種實現方法:菊花鏈模式和點到點模式。
            當使用菊花鏈模式時,堆疊的交換機依次連線,交換機之間可以達到1Gbps的傳輸頻寬;
            當使用點到點模式時,需要一台單獨的 Catalyst3508G-XL交換機,
            其餘的交換機通過堆疊GBIC卡和堆疊線纜與3508G相連,這種方法最大可以達到2Gbps的全雙工傳輸頻寬。  
            這兩種方法都分別支援堆疊的冗余連線。當使用菊花鏈連線模式時,冗余連線是通過將最上面的交換機與最下面的交換機用堆疊線纜相連線完成的。而當使用點到點連線時,是通過使用第2台3508交換機來完成的。

            4、 Catalyst3550 XL的一個千兆口使用堆疊卡做堆疊後, 另外一個千兆口是否可以連線千兆的交換機或千兆的伺服器?
            可以。需使用1000Base-SX GBIC或1000Base-LX/LH GBIC。
            5、 Ethernet Channel Tech. 可以套用在什麼網路裝置之間?如何使用?
            可以套用在交換機之間, 交換機和路由器之間,交換機和伺服器之間
            可以將2個或4個10/100Mbps或1000Mbps連接埠使用 Ethernet Channel
            Tech.,達到最多400M(10/100Mbps連接埠)、4G(1000Mbps連接埠)
            或800M(10/100Mbps連接埠)、8G(1000Mbps連接埠) 的頻寬。
            6、Ethernet Channel Technology有什麼作用?
            增加頻寬,負載均衡,線路備份
            7、 當連接埠設定成 Ethernet Channel時,如何選取線路?
            根據資料畫面的乙太網源位址和目的位址最後1位或2位做或運算,決定從哪條鏈路輸出。對於路由器來說是根據網路位址做或運算,以決定鏈路的輸出。
            8、Ethernet Channel Technology 與 PAgP (Port Aggregation Protocol )
            的區別?
            PAgP是 Ethernet Channel的增強版,它支援在 Ethernet Channel 上的 Spanning Tree
            Protocol和Uplink Fast,並支援自動組態 Ethernet Channel 的捆綁。
            最少需要的電源數 1 2
            包轉信速率 18Mpps 18Mpps
            背板頻寬 24Gbps 60Gbps
            9、Catalyst4000系列是否支援ISL?
            從Supervisor Engine Software Release 5.1開始支援。
            10、Catalyst4000交換機的冗余電源選項4008/2和4008/3有何區別?
            Catalyst4003交換機機箱上有兩個電源插槽,出廠時本身自帶一個電源,4008/2是專為其定制的冗余電源。Catalyst4006的機箱上有三個電源插槽,出廠時帶有2個電源供電,4008/3是為其定制的私人冗余電源。

            11、Catalyst 4006的三層交換模組是否不含乙太網連接埠?
            不,Catalyst4006的三層交換模組含有32個10/100自適應連接埠和2個千兆連接埠。
            在4003上使用時可替代原有的WS-X4232-GB-RJ模組, 從而不影響網路結構。
            12、Catalyst 4000系列模組化交換機使用千兆交換模組時, 如何選用目前存在的兩種交換模組(產品編號如下)?
            WS-X4306-GB Catalyst 4000 Gigabit Ethernet Module, 6-Ports (GBIC)
            WS-X4418-GB Catalyst 4000 GE Module, Server Switching 18-Ports
            (GBIC)
            這兩個模組的使用環境不同
            WS-X4306-GB是一個6口的千兆交換模組,每個連接埠獨佔千兆的頻寬,適合做網路的主幹,用來連線具有千兆接口的交換機;也可以與具有千兆網卡的伺服器相連。

            WS-X4418-GB
            是一個18口的千兆交換模組,其中有兩個口是獨佔千兆的頻寬,另外16個口共享8G的全雙工的頻寬,但每個連接埠可以突發到千兆。此模組適合在伺服器比較集中的地方連線千兆的伺服器,而不適合連線網路主幹。

            13、Catalyst 6000系列的背板頻寬和包轉信速率各為多少?
            Catalyst 6500系列的背板頻寬可延伸到256Gbps, 包轉信速率可延伸到150Mpps; Catalyst
            6000系列作為一個經濟有效的解決專案可提供到32Gbps的背板頻寬和15Mpps的包轉信速率。
            14、Catalyst 6000系列的MSFC 要求多少M DRAM ?
            Catalyst 6000系列IOS軟體存放在MSFC裡, MSFC要求有128M DRAM。 預設組態已含128M DRAM。
            15、Catalyst 6000系列上的插槽是否有限制?
            除第一個插槽私人於引擎, 第二個插槽可用於備份引擎或線卡, 其它插槽都用於線卡。
            16、Catalyst 6000系列有幾種引擎?
            Catalyst 6000系列的引擎分為Supervisor Engine 1和Supervisor Engine 1A兩種, 其中
            Supervisor Engine 1A 有兩個特定的備份引擎。其型號分別如下: 型號 描述
            WS-X6K-SUP1-2GE Catalyst 6000 Supervisor Engine1引擎 含兩個千兆連接埠(需購GBIC)
            WS-X6K-SUP1A-2GE Catalyst 6000 Supervisor Engine1A引擎 加強的QOS特性,
            含兩個千兆連接埠(需購GBIC)
            WS-X6K-SUP1A-PFC Catalyst 6000 Supervisor Engine1A引擎
            含兩個千兆連接埠(需購GBIC)和PFC卡
            WS-X6K-S1A-PFC/2 Catalyst 6000 Supervisor Engine1A冗余引擎
            含兩個千兆連接埠(需購GBIC)和PFC卡
            WS-X6K-SUP1A-MSFC Catalyst 6000 Supervisor Engine1A引擎
            含兩個千兆連接埠(需購GBIC)和MSFC、 PFC卡
            WS-X6K-S1A-MSFC/2 Catalyst 6000 Supervisor Engine1A冗余引擎,
            含兩個千兆連接埠(需購GBIC)和MSFC、 PFC卡
            17、Catalyst 6000系列上備份引擎與主引擎必須是一致的嗎?
            是的。 Catalyst 6000系列的備份引擎與主引擎必須是一致的,
            例如, 不能將不帶MSFC&PFC的引擎給帶MSFC&PFC的引擎作備份。
            另外, WS-X6K-SUP1A-PFC 和 WS-X6K-SUP1A-MSFC有專門的備份引擎。
            主、備引擎的對應關係如下:
            主引擎 備份引擎
            WS-X6K-SUP1-2GE WS-X6K-SUP1-2GE
            WS-X6K-SUP1A-2GE WS-X6K-SUP1A-2GE
            WS-X6K-SUP1A-PFC WS-X6K-S1A-PFC/2
            WS-X6K-SUP1A-MSFC WS-X6K-S1A-MSFC/2
            18、Catalyst 6000系列支援的路由協定有哪些?
            Catalyst 6000系列支援的路由協定有:OSPF, IGRP, EIGRP, BGP4, IS-IS, RIP和RIP II;
            對於群組播PIM支援sparse和dense兩種模式;
            支援的非 IP 路由協定有: NLSP, IPX RIP/SAP, IPX EIGRP, RTMP, Apple Talk
            EIGRP和DECnet Phase IV和V。
            19、Catalyst 6000系列支援的網路協定有哪些?
            MSM上支援 6Mpps 的 IP、 IP 群組播和 IPX 。 引擎上的MSFC 支援 15Mpps的 IP、 IP 群組播、IPX以及
            AppleTalk、 VINEs、 DECnet.
            20、Catalyst6000上若引擎為SUP-1A-2GE, 怎麼實現三層交換的功能?
            用MSM實現。 6000上只有含有MSFC的引擎才能通過MSFC實現三層交換功能, 在6000上, MSFC是不能單獨訂購的。
            21、Catalyst? 6000交換機和Catalyst? 6500交換機有何區別?6000交換機是否可以升級到6500交換機?
            Catalyst?
            6000系列交換機的背板頻寬為32G,而6500系列交換機的背板頻寬最大可以延伸到256G。由於這兩個系列的交換機使用的背板匯流排結構不同,所以6000交換機不能升級到6500系列交換機。

            但這兩個系列交換機使用相同的交換模組。
            22、Catalyst3508G是否也可以同Catalyst3524一樣採用菊花鏈堆疊模式?
            完全可以。
            23、在交換機之間組態Uplink-Fast時,是否需要關閉原有Spanning-Tree選項?
            不需要,Uplink-Fast實際上使用的是一種簡化的Spanning-Tree算法,
            與標準的Spanning-Tree相容,因此不需關閉該功能。

概要介紹網路安全中防火牆和IDS的作用

「安全,是一種意識,而不是某種的技術就能實現真正的安全。」隨著工作的時間漸長,對這句話的體會就越深。再防守嚴密的網路,利用人為的疏忽,管理員的懶惰和社會工程學也可能被輕易攻破。
    因此,在這裡我介紹的防火牆和IDS技術,只是我們在網路安全環節中進行的一個防禦步驟。在網路內進行防火牆與IDS的設定,並不能保證我們的網路就絕對安全了,但是設定得當的防火牆和IDS,至少會使我們的網路更為堅固一些,並且能提供更多的攻擊訊息供我們分析。

    接下來,讓我們正確地認識一下防火牆和IDS的作用吧。

    防火牆
    一、防火牆能夠作到些什麼?
    1.包過濾

    具備包過濾的就是防火牆?對,沒錯!根據對防火牆的定義,凡是能有效阻止網路非法連線的模式,都算防火牆。早期的防火牆一般就是利用設定的條件,監測通過的包的特徵來決定放行或是阻止的,包過濾是很重要的一種特性。雖然防火牆技術發展到現在有了很多新的理念提出,但是包過濾依然是非常重要的一環,如同四層交換機首要的仍是要具備包的快速轉信這樣一個交換機的基本功能一樣。通過包過濾,防火牆可以實現阻擋攻擊,禁止外部/內定訪問某些站台,限制每個ip的流量和連線數。

    2.包的透明轉信

    事實上,由於防火牆一般架設在提供某些服務的伺服器前。若果用示意圖來表示就是 Server—FireWall—Guest 。使用者對伺服器的訪問的請求與伺服器反饋給使用者的訊息,都需要經由防火牆的轉信,因此,很多防火牆具備通訊閘的能力。

    3.阻擋外部攻擊

    若果使用者傳送的訊息是防火牆設定所不容許的,防火牆會立即將其阻斷,避免其進入防火牆之後的伺服器中。

    4.記錄攻擊

    若果有必要,其實防火牆是完全可以將攻擊行為都記錄下來的,但是由於出於效率上的考慮,目前一般記錄攻擊的事情都交給IDS來完成了,我們在後面會提到。

    以上是所有防火牆都具備的基本特性,雖然很簡單,但防火牆技術就是在此基礎上逐步發展起來的。


    二、防火牆有哪些缺點和不足?

    1.防火牆可以阻斷攻擊,但不能消滅攻擊源。

    「各掃自家門前雪,不管他人瓦上霜」,就是目前網路安全的現狀。網路上病毒、木馬、惡意試探等等造成的攻擊行為絡繹不絕。設定得當的防火牆能夠阻擋他們,但是無法清除攻擊源。即使防火牆進行了良好的設定,使得攻擊無法穿透防火牆,但各種攻擊仍然會源源不斷地向防火牆發出嘗試。例如接主幹網10M網路頻寬的某站台,其日常流量中平均有512K左右是攻擊行為。那麼,即使成功設定了防火牆後,這512K的攻擊流量依然不會有絲毫減少。

    2.防火牆不能抵抗最新的未設定策略的攻擊漏洞

    就如掃毒軟體與病毒一樣,總是先出現病毒,掃毒軟體經由分析出特徵碼後加入到病毒庫內才能查殺。防火牆的各種策略,也是在該攻擊模式經由專家分析後給出其特徵進而設定的。若果世界上新發現某個主電腦漏洞的cracker的把第一個攻擊物件選中了您的網路,那麼防火牆也沒有辦法幫到您的。

    3.防火牆的並發連線數限制容易導致擁塞或是溢出

    由於要判斷、處理流經防火牆的每一個包,因此防火牆在某些流量大、並發請求多的情況下,很容易導致擁塞,成為整個網路的瓶頸影響效能。而當防火牆溢出的時候,整個防線就如同虛設,原本被禁止的連線也能從容通過了。

    4.防火牆對伺服器合法開放的連接埠的攻擊大多無法阻止

    某些情況下,攻擊者利用伺服器提供的服務進行缺陷攻擊。例如利用開放了3389連接埠取得沒打過sp補丁的win2k的超級權限、利用asp程式進行腳本攻擊等。由於其行為在防火牆一級看來是「合理」和「合法」的,因此就被簡單地放行了。

    5.防火牆對待內定主動發起連線的攻擊一般無法阻止

    「外緊內鬆」是一般區域網路的特點。或許一道嚴密防守的防火牆內定的網路是一片混亂也有可能。通過社會工程學傳送帶木馬的信件、帶木馬的URL等模式,然後由中木馬的機器主動對攻擊者連線,將鐵壁一樣的防火牆瞬間破壞掉。另外,防火牆內定各主電腦間的攻擊行為,防火牆也只有如旁觀者一樣冷視而愛莫能助。

    6.防火牆本身也會出現問題和受到攻擊

    防火牆也是一個OS(作業系統),也有著其硬體系統和軟體,因此依然有著漏洞和bug。所以其本身也可能受到攻擊和出現軟/硬體方面的故障。

    7.防火牆不處理病毒

    不管是funlove病毒也好,還是CIH也好。在內定網路使用者下載外網的帶毒檔案的時候,防火牆是不為所動的(這裡的防火牆不是指單機/企業級的掃毒軟體中的實時監控功能,雖然它們不少都叫「病毒防火牆」)。

    看到這裡,或許您原本心目中的高高在上的防火牆已經被我拉下了神台。是的,防火牆是網路安全的重要一環,但不代表設定了防火牆就能一定保證網路的安全。「真正的安全是一種意識,而非技術!」請牢記這句話。

    不管怎麼樣,防火牆仍然有其積極的一面。在構建任何一個網路的防禦工事時,除了物理上的隔離和目前新近提出的網閘(gate)概念外,首要的選取絕對是防火牆。那麼,怎麼選取需要的防火牆呢?

    防火牆的分類

    首先大概說一下防火牆的分類。就防火牆(本文的防火牆都指商業用途的網路版防火牆,非個人使用的那種)的群組成結構而言,可分為以下三種:

    第一種:軟體防火牆

    軟體防火牆執行於特定的電腦上,它需要客戶預先安裝好的電腦動作系統的支援,一般來說這台電腦就是整個網路的通訊閘。軟體防火牆就像其它的軟體產品一樣需要先在電腦上安裝並做好組態才可以使用。防火牆廠商中做網路版軟體防火牆最出名的莫過於Checkpoint。使用這類防火牆,需要網管對所工作的動作系統平台比較熟悉。

    第二種:硬體防火牆

    這裡說的硬體防火牆是指所謂的硬體防火牆。之所以加上"所謂"二字是針對晶片級防火牆說的了。它們最大的差別在於是否基於私人的硬體平台。目前市場上大多數防火牆都是這種所謂的硬體防火牆,他們都基於PC架構,就是說,它們和普通的家庭用的PC沒有太大區別。在這些PC架構電腦上執行一些經由裁剪和簡化的動作系統,最常用的有老版本的Unix、Linux和FreeBSD系統。 值得注意的是,由於此類防火牆採用的依然是別人的內核,因此依然會受到os本身的安全性影響。國內的許多防火牆產品就屬於此類,因為採用的是經由裁減內核和定制元件的平台,因此國內防火牆的某些銷售人員常常吹噓其產品是「私人的os」等等,其實是一個概念誤導,下面我們提到的第三種防火牆才是真正的os私人。

    第三種:晶片級防火牆

    它們基於專門的硬體平台,沒有動作系統。專有的ASIC晶片促使它們比其他種類的防火牆速度更快,處理能力更強,效能更高。做這類防火牆最出名的廠商莫過於NetScreen.其他的品牌還有FortiNet,算是後起之秀了。這類防火牆由於是私人OS,因此防火牆本身的漏洞比較少,不過價格相對比較高昂,所以一般只有在「確實需要」的情況下才考慮。

    在這裡,特別糾正幾個不正確的觀念:

    1.在效能上,晶片級防火牆>硬體防火牆>軟體防火牆。

    在價格上看來,的確倒是如此的關係。但是效能上卻未必。防火牆的「好」,是看其支援的並發數、最大流量等等效能,而不是用軟體硬體來區分的。事實上除了晶片級防火牆外,軟體防火牆與硬體防火牆在硬體上基本是完全一樣的。目前國內的防火牆廠商由於大多採用硬體防火牆而不是軟體防火牆,原因1是考慮到使用者網路管理員的素質等原因,還有就是基於我國大多數民眾對「看得見的硬體值錢,看不到的軟體不值錢」這樣一種錯誤觀點的迎合。不少硬體防火牆廠商大肆詆毀軟體防火牆效能,不外是為了讓自己那加上了外殼的普通pc+一個被修改後的內核+一套防火牆軟體能夠賣出一個好價錢來而已。而為什麼不作晶片級防火牆呢?坦白說,國內沒有公司有技術實力。而且在中國市場上來看,某些國內的所謂硬體防火牆的硬體質量連diy的相容機都比不上。看看國內XX的硬體防火牆那拙劣的硬碟和網卡,使用過的人都能猜到是哪家,我就不點名了。真正看防火牆,應該看其穩定性和效能,而不是用軟、硬來區分的。至少,若我自己選購,我會選取購買CheckPoint而非某些所謂的硬體防火牆的。

    2.在效果上,晶片防火牆比其他兩種防火牆好

    這同樣也是一種有失公允的觀點。事實上晶片防火牆由於硬體的獨立,的確在OS本身出漏洞的機會上比較少,但是由於其固化,導致在面對新興的一些攻擊模式時,無法及時應對;而另外兩種防火牆,則可以簡單地通過升級os的內核來取得系統新特性,通過靈活地策略設定來滿足不斷變化的要求,不過其OS出現漏洞的概率相對高一些。

    3.唯技術指標論

    請以「防火牆買來是使用的」為第一前提進行購買。防火牆本身的質量如何是一回事,是否習慣使用又是另一回事。若果對一款產品的界面不熟悉,策略設定模式不理解,那麼即使用世界最頂級的防火牆也沒有多大作用。就如小說中武林中人無不嚮往的「倚天劍」、「屠龍刀」被我拿到,肯定也敵不過喬峰赤手的少林長拳是一般道理。防火牆技術發展至今,市場已經很成熟了,各類產品的存在,自然有其生存於市場的理由。如何把產品用好,遠比盲目地比較各類產品好。

    IDS

    什麼是IDS呢?早期的IDS僅僅是一個監聽系統,在這裡,你可以把監聽理解成竊聽的意思。基於目前局網的工作模式,IDS可以將使用者對位於與IDS同一交換機/HuB的伺服器的訪問、動作全部記錄下來以供分析使用,跟我們常用的widnows動作系統的事件檢視器類似。再後來,由於IDS的記錄太多了,所以新一代的IDS提供了將記錄的資料進行分析,僅僅列出有危險的一部分記錄,這一點上跟目前windows所用的策略審核上很像;目前新一代的IDS,更是增加了分析套用層資料的功能,使得其能力大大增加;而更新一代的IDS,就頗有「路見不平,拔刀相助」的味道了,配合上防火牆進行聯動,將IDS分析出有敵意的位址阻止其訪問。

    就如理論與實際的區別一樣,IDS雖然具有上面所說的眾多特性,但在實際的使用中,目前大多數的入侵檢驗的接入模式都是採用pass-by模式來偵聽網路上的資料流,所以這就限制了IDS本身的阻斷功能,IDS只有靠發阻斷封包來阻斷目前行為,並且IDS的阻斷範圍也很小,只能阻斷建立在TCP基礎之上的一些行為,如Telnet、FTP、HTTP等,而對於一些建立在UDP基礎之上就無能為力了。因為防火牆的策略都是事先設定好的,無法動態設定策略,缺少針對攻擊的必要的靈活性,不能更好的保護網路的安全,所以IDS與防火牆聯動的目的就是更有效地阻斷所發生的攻擊事件,從而使網路隱患降至較低限度。

    接下來,我簡單介紹一下IDS與防火牆聯動工作原理

    入侵檢驗系統在擷取到某一攻擊事件後,按策略進行檢查,若果策略中對該攻擊事件設定了防火牆阻斷,那麼入侵檢驗系統就會發給防火牆一個相應的動態阻斷策略,防火牆根據該動態策略中的設定進行相應的阻斷,阻斷的時間、阻斷時間間隔、源連接埠、目的連接埠、源IP和目的IP等訊息,完全依照入侵檢驗系統發出的動態策略來執行。一般來說,很多情況下,不少使用者的防火牆與IDS並不是同一家的產品,因此在聯動的協定上面大都遵從 opsec 或是 topsec協定進行通信,不過也有某些廠家自己開發相應的通信規範的。目前總得來說,聯動有一定效果,但是穩定性不理想,特別是攻擊者利用偽造的包訊息,讓IDS錯誤判斷,進而錯誤指揮防火牆將合法的位址無辜屏蔽掉。

    因為諸多不足,在目前而言,IDS主要起的還是監聽記錄的作用。用個比喻來形容:網路就好比一片黑暗,到處充滿著危險,冥冥中只有一個出口;IDS就像一支手電筒,雖然手電筒不一定能照到正確的出口,但至少有總比沒有要好一些。稱職的網管,可以從IDS中得到一些關於網路使用者的來源和訪問模式,進而依據自己的經驗進行主觀判斷(注意,的確是主觀判斷。例如使用者連續ping了伺服器半個小時,到底是意圖攻擊,還是無意中的行為?這都依據網路管理員的主觀判斷和網路對安全性的要求來確定對應模式。)對IDS的選取,跟上面談到的防火牆的選取類似,根據自己的實際要求和使用習慣,選取一個自己夠用的,會使用的就足夠了。

    最後,要說的依然是那句「世界上沒有一種技術能真正保證絕對地安全。」安全問題,是從裝置到人,從伺服器上的每個服務程式到防火牆、IDS等安全產品的綜合問題;任何一個環節工作,只是邁向安全的步驟。

UID

206045 

帖子

4350 

精華

1 

積分

3603 

現金

95103 元 

宣傳

0 次 

存款

3597 元 

閱讀權限

120 

性別

男 

在線時間

1120 小時 

註冊時間

2008-5-12 

最後登錄

2010-12-9 

查看詳細資料