8.9. IPsec

Contributed by Yoshinobu Inoue , 5 March 2000.

IPsec 機制提供了 IP 層與 socket 層之間安全的通訊方式。這節將介紹如何使用。 有關執行細節,請參考開發人員手冊。

當前的 IPsec 執行模式既支援傳輸模式也支援隧道模式。但隧道模式有一些限制。在 http://www.kame.net/newsletter/上有比較詳細的例子:

為了使用這個功能,請保持清醒,必須將下面這些選項編譯進內核:

    options          IPSEC              #IP security
    options          IPSEC_ESP          #IP security (crypto; define w/IPSEC)

8.9.1. 基於IPv4 的傳輸模式例子

設置一個安全的連接以便在主機A (10.2.3.4)和主機B (10.6.7.8)之間配置一 個安全的通道。這兒列出了幾個複雜的例子。從主機A 到主機B ,只有老的AH 可以被使用。 從主機B 到主機A,新的AH 和新的ESP 將被結合起來。

現在,必須選擇一個演算法以用來適應"AH"/"new AH"/"ESP"/"new ESP"。請參考 setkey 的聯機手冊瞭解演算法的命名。選擇是對AH 用 MD5,對新AH 用 new-HMAC-SHA1, 對新 ESP 用帶有8 位的 new-DES-expIV

關鍵字的長度依賴於每個演算法。例如,關鍵字的長度對於 MD5 需要用16 位元,對於 new-HMAC-SHA1 需要用20 位元,對於 new-DES-expIV 需要用8 位元。現在分別選擇 "MYSECRETMYSECRET", "KAMEKAMEKAMEKAMEKAME", "PASSWORD"。

好的,為每個協議分派一個 SPI(Security Parameter Index)。請注意需要 為這個安全通道設計 3 個SPIs,因為產生了三個安全 headers。(one for from HOST A to HOST B, two for from HOST B to HOST A)。另外,也要注意 SPI 必須要超過或等於256。 依次選擇1000, 2000 和3000。

    
    	         (1)
    	HOST A ------> HOST B
    
    	(1)PROTO=AH
    		ALG=MD5(RFC1826)
    		KEY=MYSECRETMYSECRET
    		SPI=1000
    
    	         (2.1)
    	HOST A <------ HOST B
    	       <------
    	         (2.2)
    
    	(2.1)
    	PROTO=AH
    		ALG=new-HMAC-SHA1(new AH)
    		KEY=KAMEKAMEKAMEKAMEKAME
    		SPI=2000
    
    	(2.2)
    	PROTO=ESP
    		ALG=new-DES-expIV(new ESP)
    			IV length = 8
    		KEY=PASSWORD
    		SPI=3000
    
          

現在,設置安全連接。在主機A 和B 上執行setkey:

    
    # setkey -c
    add 10.2.3.4 10.6.7.8 ah-old  1000 -m transport -A keyed-md5 "MYSECRETMYSECRET" ;
    add 10.6.7.8 10.2.3.4 ah  2000 -m transport -A hmac-sha1 "KAMEKAMEKAMEKAMEKAME" ;
    add 10.6.7.8 10.2.3.4 esp 3000 -m transport -E des-cbc "PASSWORD" ;
    ^D
    
         

事實上,除非定義了安全策略記錄,否則 IPsec 通訊是不起作用的。在這個例子,必須設置每個主機。

    
    At A:
    
    # setkey -c
    spdadd 10.2.3.4 10.6.7.8 any -P out ipsec
    	ah/transport/10.2.3.4-10.6.7.8/require ;
    ^D
    
    At B:
    
    # setkey -c
    spdadd 10.6.7.8 10.2.3.4 any -P out ipsec
    	esp/transport/10.6.7.8-10.2.3.4/require ;
    spdadd 10.6.7.8 10.2.3.4 any -P out ipsec
    	ah/transport/10.6.7.8-10.2.3.4/require ;
    ^D
    
    
       HOST A --------------------------------------> HOST E
      10.2.3.4                                       10.6.7.8
              |                                     |
              ========== old AH keyed-md5 ==========>
    
              <========= new AH hmac-sha1 ===========
              <========= new ESP des-cbc ============
    
         

8.9.2. 用IPv6 傳輸模式的例子

另一個使用IPv6 的例子:

ESP 傳輸模式建議使用主機A 和B 之間的TCP 埠110。

    
                  ============ ESP ============
                  |                           |
               Host-A                        Host-B
              fec0::10 -------------------- fec0::11
    
          

加密演算法是blowfish-cbc,關鍵字是"kamekame",驗證演算法是hmac-sha1,關鍵字是"this is the test key"。在主機A 上配置:

    
            # setkey -c <<EOF
            spdadd fec0::10[any] fec0::11[110] tcp -P out ipsec
                    esp/transport/fec0::10-fec0::11/use ;
            spdadd fec0::11[110] fec0::10[any] tcp -P in ipsec
                    esp/transport/fec0::11-fec0::10/use ;
            add fec0::10 fec0::11 esp 0x10001
                    -m transport
                    -E blowfish-cbc "kamekame"
                    -A hmac-sha1 "this is the test key" ;
            add fec0::11 fec0::10 esp 0x10002
                    -m transport
                    -E blowfish-cbc "kamekame"
                    -A hmac-sha1 "this is the test key" ;
            EOF
    
          

在主機B 上:

            # setkey -c <<EOF
            spdadd fec0::11[110] fec0::10[any] tcp -P out ipsec
                    esp/transport/fec0::11-fec0::10/use ;
            spdadd fec0::10[any] fec0::11[110] tcp -P in ipsec
                    esp/transport/fec0::10-fec0::11/use ;
            add fec0::10 fec0::11 esp 0x10001 -m transport
                    -E blowfish-cbc "kamekame"
                    -A hmac-sha1 "this is the test key" ;
            add fec0::11 fec0::10 esp 0x10002 -m transport
                    -E blowfish-cbc "kamekame"
                    -A hmac-sha1 "this is the test key" ;
            EOF
    
          

注意SP 的方向。

8.9.3. 用IPv4 通道模式的例子

在兩個安全閘道之間的通道模式

安全協定是老的AH 通道模式,由RFC1826 制定,用 keyed-md5 作為驗證演算法,關鍵字是"this is the test"。

    
                                 ======= AH =======
                                 |                |
             Network-A       Gateway-A        Gateway-B        Network-B
            10.0.1.0/24 ---- 172.16.0.1 ----- 172.16.0.2 ---- 10.0.2.0/24
    
          

在閘道A 上配置:

    
            # setkey -c <<EOF
            spdadd 10.0.1.0/24 10.0.2.0/24 any -P out ipsec
                    ah/tunnel/172.16.0.1-172.16.0.2/require ;
            spdadd 10.0.2.0/24 10.0.1.0/24 any -P in ipsec
                    ah/tunnel/172.16.0.2-172.16.0.1/require ;
            add 172.16.0.1 172.16.0.2 ah-old 0x10003 -m any
                    -A keyed-md5 "this is the test" ;
            add 172.16.0.2 172.16.0.1 ah-old 0x10004 -m any
                    -A keyed-md5 "this is the test" ;
    
            EOF
    
          

如果埠號碼範圍被忽略,就象上面一樣使用"[any]"。`-m'指定了使用 SA 的模式。"-m any"意味著安全協定的模式。可以為通道和傳輸模式都使用這個SA。

在閘道B 上:

    
            # setkey -c <<EOF
            spdadd 10.0.2.0/24 10.0.1.0/24 any -P out ipsec
                    ah/tunnel/172.16.0.2-172.16.0.1/require ;
            spdadd 10.0.1.0/24 10.0.2.0/24 any -P in ipsec
                    ah/tunnel/172.16.0.1-172.16.0.2/require ;
            add 172.16.0.1 172.16.0.2 ah-old 0x10003 -m any
                    -A keyed-md5 "this is the test" ;
            add 172.16.0.2 172.16.0.1 ah-old 0x10004 -m any
                    -A keyed-md5 "this is the test" ;
    
            EOF
    
          

在兩個安全閘道之間建立SA 包

在閘道A 和B 之間必須使用AH 傳輸模式和 ESP 通道模式。在這個例子中,先應用 ESP 通道模式,然後是AH 傳輸模式。

    
                                ========== AH =========
                                |  ======= ESP =====  |
                                |  |               |  |
           Network-A          Gateway-A        Gateway-B           Network-B
        fec0:0:0:1::/64 --- fec0:0:0:1::1 ---- fec0:0:0:2::1 --- fec0:0:0:2::/64
    
          

8.9.4. 使用IPv6 的通道模式的例子

加密演算法是 3des-cbc,針對 ESP 的驗證演算法是 hmac-sha1。針對AH 的驗證演算法是 hmac-md5。在閘道A 上配置:

    
            # setkey -c <<EOF
            spdadd fec0:0:0:1::/64 fec0:0:0:2::/64 any -P out ipsec
                    esp/tunnel/fec0:0:0:1::1-fec0:0:0:2::1/require
                    ah/transport/fec0:0:0:1::1-fec0:0:0:2::1/require ;
            spdadd fec0:0:0:2::/64 fec0:0:0:1::/64 any -P in ipsec
                    esp/tunnel/fec0:0:0:2::1-fec0:0:0:1::1/require
                    ah/transport/fec0:0:0:2::1-fec0:0:0:1::1/require ;
            add fec0:0:0:1::1 fec0:0:0:2::1 esp 0x10001 -m tunnel
                    -E 3des-cbc "kamekame12341234kame1234"
                    -A hmac-sha1 "this is the test key" ;
            add fec0:0:0:1::1 fec0:0:0:2::1 ah 0x10001 -m transport
                    -A hmac-md5 "this is the test" ;
            add fec0:0:0:2::1 fec0:0:0:1::1 esp 0x10001 -m tunnel
                    -E 3des-cbc "kamekame12341234kame1234"
                    -A hmac-sha1 "this is the test key" ;
            add fec0:0:0:2::1 fec0:0:0:1::1 ah 0x10001 -m transport
                    -A hmac-md5 "this is the test" ;
    
            EOF
    
          

用不同的結尾來使用SA

在主機A 和閘道A 之間需要使用 ESP 通道模式。加密演算法是 cast128-cbc,針對 ESP 的 驗證演算法是 hmac-sha1。建議在主機A 和B 之間使用ESP 傳輸模式。加密演算法是 rc5-cbc, 針對 ESP 的驗證演算法是 hmac-md5。

    
                  ================== ESP =================
                  |  ======= ESP =======                 |
                  |  |                 |                 |
                 Host-A            Gateway-A           Host-B
              fec0:0:0:1::1 ---- fec0:0:0:2::1 ---- fec0:0:0:2::2
    
          

在主機A 上配置:

    
            # setkey -c <<EOF
            spdadd fec0:0:0:1::1[any] fec0:0:0:2::2[80] tcp -P out ipsec
                    esp/transport/fec0:0:0:1::1-fec0:0:0:2::2/use
                    esp/tunnel/fec0:0:0:1::1-fec0:0:0:2::1/require ;
            spdadd fec0:0:0:2::1[80] fec0:0:0:1::1[any] tcp -P in ipsec
                    esp/transport/fec0:0:0:2::2-fec0:0:0:l::1/use
                    esp/tunnel/fec0:0:0:2::1-fec0:0:0:1::1/require ;
            add fec0:0:0:1::1 fec0:0:0:2::2 esp 0x10001
                    -m transport
                    -E cast128-cbc "12341234"
                    -A hmac-sha1 "this is the test key" ;
            add fec0:0:0:1::1 fec0:0:0:2::1 esp 0x10002
                    -E rc5-cbc "kamekame"
                    -A hmac-md5 "this is the test" ;
            add fec0:0:0:2::2 fec0:0:0:1::1 esp 0x10003
                    -m transport
                    -E cast128-cbc "12341234"
                    -A hmac-sha1 "this is the test key" ;
            add fec0:0:0:2::1 fec0:0:0:1::1 esp 0x10004
                    -E rc5-cbc "kamekame"
                    -A hmac-md5 "this is the test" ;
    
            EOF