使用源碼搭建IPV6 IPsec隧道

本文檔的Copyleft歸rosetta所有,使用GPL發佈,可以自由拷貝、轉載,轉載時請保持文檔的完整性。

原文地址:http://blog.csdn.net/rosetta

        Openswan是Linux下IPsec的最佳實現方式,我之前使用的版本是openswan-2.4.7,它最大的缺點是不支持IPV6,現在國家大力扶持IPV6項目,下一代互聯網IPV6全面普及已近在咫尺。有關操作系統、內核、應用層軟件對於IPV6的支持配置問題將會更加受到關注。
        本文將介紹如何在Linux下從源碼安裝openswa-2.6.38,並配置建立IPV6靜態隧道,最後測試受隧道保護的子網之間通信。
       
1,實驗環境
        1).VMware CentOS 5.4虛擬機一臺, 使用虛擬機有一個好處:當你配置完一邊後,通過VMware的clone工具克隆一個鏡像作爲隧道的另一端,這樣就不需要在隧道另一端做重勞動,所以你只需安裝配置一遍。        
        需要注意的是CentOS 5.4內核版本比較老,爲2.6.18-164,我試了在該內核下無法插入openswan的ipsec.ko模塊,一insmod 內核就崩潰,具體原因沒有去查,看openswan的READE,應該需要打內核補丁,我先不管它了,使用上回編譯的2.6.34.11內核。
        2).windows主機只要支持IPV6地址配置即可,我使用的是win7, xp是無法滿足的。
        3).軟件環境當然使用的就是今天的主角openswa-2.6.38了,這個版本應該是目前最新的,可以從其官方下載ftp://ftp.openswan.fi/pub/openswan/      
        4).VMware網絡接口類型:bridged
        5).地址配置。
                windows主機,在本地鏈接中增加即可:99:1::165/64
                Linux:
                       eth0:99:1::162/64
                                77::1/64(保護子網通信時使用)
                          ip -f inet6 addr add 99:1::162/64 dev eth0
                          ip -f inet6 addr add 77::1/64 dev eth0
                對端Linux:此設備要等會把這邊安裝完畢並配置好IPV6隧道後再clone再出來,所以此時還有這臺設備,但爲了方便起見把這臺機器的IP地址先確定是可以的。
                        eth0:99:1::228/64
                        88::1/64(保護子網通信時使用)
          
2,編譯安裝openswan-2.6.38
        在編譯之前請確保完成以下步驟:
       1,以內核2.6.34.11爲例:
        cd /lib/modules/2.6.34.11-xxx/  (xxx可以是你編譯內核時自命名的)
                ln -sf build /opt/study_new/kernel/linux-2.6.34.11 (做指向內核源的符號鏈接)
                ln -sf source /opt/study_new/kernel/linux-2.6.34.11
        2,執行 rmmod xfrmuser af_key esp4 ah4 ipcomp xfrm4_tunnel
                刪除內核的netkey支持

        現在可以開始編譯openswan-2.6.38源碼了
        解壓tar -zxvf openswan-2.6.38.tar.gz後,cd openswan-2.6.38/
        執行:make programs;make install
                會把應用程序pluto,whack,tncfg等拷貝至/usr/local/libexec/ipsec/
        執行:make module;
                會在./modobj26/目錄生成ipsec.ko
        執行:make minstall
                會把ipsec.ko拷貝至/lib/modules/2.6.34.11-topsec/kernel/net/ipsec/ipsec.ko

        最後執行:service ipsec restart 使用最近的ipsec.ko

        安裝成功的標誌,通過以下命令檢查:
        [root@localhost ~]# ipsec version
        Linux Openswan 2.6.38 (klips)
        See `ipsec --copyright' for copyright information.

        [root@localhost ~]# ipsec verify
        Checking your system to see if IPsec got installed and started correctly:
        Version check and ipsec on-path                                 [OK]
        Linux Openswan 2.6.38 (klips)
        Checking for IPsec support in kernel                            [OK]
         KLIPS: checking for NAT Traversal support                      [OK]
         KLIPS: checking for OCF crypto offload support                 [N/A]
         SAref kernel support                                           [N/A]
        Checking that pluto is running                                  [OK]
         Pluto listening for IKE on udp 500                             [OK]
         Pluto listening for NAT-T on udp 4500                          [OK]
        Checking for 'ip' command                                       [OK]
        Checking /bin/sh is not /bin/dash                               [OK]
        Checking for 'iptables' command                                 [OK]
        Opportunistic Encryption Support                                [DISABLED]

        [root@localhost ~]# ifconfig
        eth0      Link encap:Ethernet  HWaddr 00:0C:29:9B:26:37  
                  inet addr:10.10.10.162  Bcast:10.10.10.255  Mask:255.255.255.0
                  inet6 addr: 77::1/64 Scope:Global
                  inet6 addr: 99:1::162/64 Scope:Global
        
        ipsec0    Link encap:Ethernet  HWaddr 00:0C:29:9B:26:37  
                  inet addr:10.10.10.162  Mask:255.255.255.255
                  inet6 addr: 77::1/128 Scope:Global
                  inet6 addr: 99:1::162/128 Scope:Global

3,配置IPV6隧道
        1),配置密鑰策略文件
                vim /etc/ipsec.secrets      
                只保留如下內容:
                99:1::162 99:1::228 : PSK "123456"
        2),配置隧道參數
                vim ipv6tun.sh
                內容如下:
                WHACK=/usr/local/libexec/ipsec/whack
                $WHACK --name v6tun --ipv6 \
                    --host 99:1::162 --client 77::/64 \
                    --to \
                    --host 99:1::228 --client 88::/64 \
                    --ike aes-md5 \
                    --psk --encrypt  --tunnel  --esp 3des-md5 \
                $WHACK --listen
        
        此時一邊的環境已配置完畢
        可以通過whack命令查看當前隧道狀態,如果看到類似以下執行結果,表明成功:
        [root@localhost dotunnel]# cd /usr/local/libexec/ipsec/
        [root@localhost ipsec]# ./whack --sta
        000 using kernel interface: klips
        000 interface ipsec0/eth0 77::1
        000 interface ipsec0/eth0 99:1::162
        000 interface ipsec0/eth0 10.10.10.162
        ****中間省略一堆信息*****
        "aaa": 77::/64===99:1::162[+S?C]...99:1::228[+S?C]===88::/64; unrouted; eroute owner: #0
        000 "aaa":     myip=unset; hisip=unset;
        000 "aaa":   ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 0
        000 "aaa":   policy: PSK+ENCRYPT+TUNNEL; prio: 64,64; interface: eth0;
        000 "aaa":   dpd: action:clear; delay:0; timeout:0;  
        000 "aaa":   newest ISAKMP SA: #0; newest IPsec SA: #0;
        000 "aaa":   IKE algorithms wanted: AES_CBC(7)_000-MD5(1)_000-MODP1536(5), AES_CBC(7)_000-MD5(1)_000-MODP1024(2); flags=-strict
        000 "aaa":   IKE algorithms found:  AES_CBC(7)_128-MD5(1)_128-MODP1536(5), AES_CBC(7)_128-MD5(1)_128-MODP1024(2)
        000 "aaa":   ESP algorithms wanted: 3DES(3)_000-MD5(1)_000; flags=-strict
        000 "aaa":   ESP algorithms loaded: 3DES(3)_192-MD5(1)_128

4,克隆一個鏡像
        系統此時的狀態是最好不過的,只要克隆一個一樣的鏡像,我們只需改下IP地址,重啓一下ipsec服務即可。
        具體操作:
        1),配置IP地址,如果使用ip -f inet6命令配置,當系統重啓後IP地址就消失了,所以來這個一勞永逸的辦法。
                vim /etc/sysconfig/network-scripts/ifcfg-eth0

                DEVICE=eth0
                BOOTPROTO=static
                ONBOOT=yes
                HWADDR=#執行ifconfig eth0後把HWaddr的值帖過來
                IPADDR=10.10.10.228
                GATEWAY=10.10.10.1
                NETMASK=255.255.255.0
                BROADCAST=10.10.10.255
                IPV6INIT=yes
                IPV6ADDR=99:1::228/64

                service network restart 生效  

        2),配置密鑰策略文件,只要把之前的兩個IP地址倒個就行
            vim /etc/ipsec.secrets
                99:1::228 99:1::162 : PSK "123456"
                
        3),配置隧道參數,同樣兩端IP和保護子網地址倒個。
                vim ipv6tun.sh
                內容如下:
                WHACK=/usr/local/libexec/ipsec/whack
                $WHACK --name v6tun --ipv6 \
                    --host 99:1::228 --client 88::/64 \
                    --to \
                    --host 99:1::162 --client 77::/64 \
                    --ike aes-md5 \
                    --psk --encrypt  --tunnel  --esp 3des-md5 \
                $WHACK --listen
        
        可能通過第3步的方法查看命令是否執行成功。
       
         可以先測試一下兩臺主機是否可以ping通:
         [root@localhost openswan-2.6.38]# ping6 99:1::228
        PING 99:1::228(99:1::228) 56 data bytes
        64 bytes from 99:1::228: icmp_seq=0 ttl=64 time=4.94 ms
        64 bytes from 99:1::228: icmp_seq=1 ttl=64 time=19.5 ms    

5,協商並通信
        發現openswan-2.6-38協商速度超級慢,不知道什麼原因?但最終可以協商成功。
       [root@localhost dotunnel]# cd /usr/local/libexec/ipsec/
        [root@localhost ipsec]# ./whack --initiate --name v6tun    
        [root@localhost ipsec]# ./eroute
        0          77::/64            -> 88::/64            => tun0x1003@99:1::228      
        說明隧道協商成功,其兩端保護子網爲77::/64和88::/64

        測試一下通信,成功。
         [root@localhost ipsec]# ping6 88::1 -I 77::1
        PING 88::1(88::1) from 77::1 : 56 data bytes
        64 bytes from 88::1: icmp_seq=0 ttl=64 time=0.385 ms
        64 bytes from 88::1: icmp_seq=1 ttl=64 time=0.371 ms
                
總結:每次做開發和學習之前的環境搭建是最費時費力的,但所謂工欲善其事,必先利其器,把環境搭建好了,再去看代碼時就會如魚得水,代碼看不懂加幾個printf看看執行結果就容易弄懂了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章