Contributed by Yoshinobu Inoue <shin@FreeBSD.org>, 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)
設置一個安全的連接以便在主機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 ============
另一個使用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 的方向。
在兩個安全閘道之間的通道模式
安全協定是老的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
加密演算法是 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