使用openswan搭建IPV6 IPsec VPN隧道
目录
Openswan是Linux下IPsec的最佳实现方式,我之前使用的版本是openswan-2.4.7,它最大的缺点是不支持IPV6,现在国家大力扶持IPV6项目,下一代互联网IPV6全面普及已近在咫尺。有关操作系统、内核、应用层软件对于IPV6的支持配置问题将会更加受到关注。
本文将介绍如何在Linux下从源码安装openswa-2.6.38,并配置建立IPV6静态隧道,最后测试受隧道保护的子网之间通信。
由于没有时间的ipv6环境(目前只有教育网有),因此有vmware来搭建环境测试。
		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:                     
| 1 2 3 4 |  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地址先确定是可以的。
                       
| 1 2 |  eth0:99:1::228/64                         88::1/64(保护子网通信时使用) | 
		2.安装opsneswan
	
可以通过包的管理安装亦可通过源码编译安装,版本不低于2.6.37即可,太低版本的不支持ipv6;vps上建议使用包来安装,毕竟编译安装需要消耗的资源稍大一点,下面主要说一下编译安装的方法
		在编译之前请确保完成以下步骤:
       1,以内核2.6.34.11为例:
	
| 1 2 3 | 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,执行 
| 1 | rmmod xfrmuser af_key esp4 ah4 ipcomp xfrm4_tunnel  | 
删除内核的netkey支持
        现在可以开始编译openswan-2.6.38源码了
        解压
| 1 | tar -zxvf openswan-2.6.38.tar.gz后,cd openswan-2.6.38/ | 
        执行:
| 1 | make programs;make install  | 
 会把应用程序pluto,whack,tncfg等拷贝至/usr/local/libexec/ipsec/
        执行:
| 1 | make module; | 
 会在./modobj26/目录生成ipsec.ko
        执行:
| 1 | make minstall | 
会把ipsec.ko拷贝至/lib/modules/2.6.34.11-topsec/kernel/net/ipsec/ipsec.ko
最后执行:service ipsec restart 使用最近的ipsec.ko
安装成功的标志,通过以下命令检查:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | [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).配置密钥策略文件
| 1 | vim /etc/ipsec.secrets  | 
只保留如下内容:
| 1 | 99:1::162 99:1::228 : PSK "123456" | 
        2).配置隧道参数
| 1 | vim ipv6tun.sh | 
内容如下:
| 1 2 3 4 5 6 7 8 | 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命令查看当前隧道状态,如果看到类似以下执行结果,表明成功:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |  [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地址就消失了,所以来这个一劳永逸的办法。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |  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地址倒个就行
| 1 2 | vim /etc/ipsec.secrets                  99:1::228 99:1::162 : PSK "123456" | 
                
        3).配置隧道参数,同样两端IP和保护子网地址倒个。
| 1 | vim ipv6tun.sh | 
内容如下:
| 1 2 3 4 5 6 7 8 | 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通:
| 1 2 3 4 |   [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协商速度超级慢,不知道什么原因?但最终可以协商成功。
| 1 2 3 4 |   [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
测试一下通信,成功。
| 1 2 3 4 |  [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看看执行结果就容易弄懂了。
 
																			
近期评论