使用openswan在Linux下构建IPSec VPN过程
前言:
反把复复尝试了很多次,在网上相关文档的指导下,终于实现了在RH Linux 9.0 (kernel 2.4.20-8 )上以源码方式安装[b][color=Blue]openswan-2.4.27[/color][/b],但老系统安装新版本的软件却是颇为劳心费神之事,不为别的,只为学习,呵呵:lol:。此实验在RH Linux 9.0 (kernel 2.4.20-8 )上实现,请注意您的内核版本(这一点很重要)。
[color=Red]第一部分:VPN简介[/color]
Linux平台上的VPN大致可以为分为三类:
IPSec VPN(Openswan,frees/wan,strongswan,KAME)
IPSec(IP Security)是一种较老的也是采用的最为广泛的VPN技术,是由IETF开发的一组身份验正和数据加密的协议,提供了私有性、完整性、真实性和防重播等安全服务,可以用于IP网络中的数据保密、完整性检查、身份验正、密匙管理等许多方面。
IPSec在Linux上的实现主要分为两类,第一类是曾被称作Frees/wan的项目,如今已经分裂为openswan和strongswan。它们都提供自身的内核堆栈(kernel stack),也可以基于新近的内核中所提供的代码。第二类是BSD之上的KAME,它只能使用内核堆栈。大多ipsec规范本身并不在本地网络中为远程主机提供一个虚拟IP,不过仍有不少为此而实现的扩展可以解决诸如此类的问题。因此,可以将Microsoft的支持L2TP的产品运行于ipsec之上。
ipsec是面各连接的协议,为很多家商业类的路由器所采用。Openswan基于自身的XAUTH扩展,也可以作为Cisco,Nortel以及其它多家VPN集成产品的客户端。
ipsec可以让我们在不改变外部防火墙规则的情况下,在内核级别相当容易的对什么能通过隧道或什么不能作出安全的处理;其在实现NET-TO-NET以及host-to-net的配置方面也表现出了很大的灵活性。但灵活也就意味着实现起来的困难,所以ipsec的成功配置运行相当有难度,此外,尽管已经其在对NAT-Travel的支持方面做了不少改进,但还是不能较好的工作于一些NAT网关之后。
SSL VPN (openVPN)
近来,加密套接字层(SSL)虚拟专用网(VPN)逐渐流行起来。这种VPN的最大好处在于,你仅仅需要一个单独的TCP或者UDP端口便可以轻易的穿越大多数的防火墙进行数据传送。SSL VPN在Linux系统上的最好实现是OpenVPN,其相当成熟和富于特色。
PPTP VPN (PoPToP)
PPTP(Point to Point Tunneling Protocol)是由微软发起的可以工作在包括Windows 95在内的微软多个操作系统上的协议。虽然已经采用了相当长一段时间,但其仍存在许多安全方面的问题。它主要是基于GRE(Generic Routing Encapsulation)通过隧道来传送一个PPP连接。Linux系统上PPTP实现的主要代表是PoPToP。如果你的确需要PPTP的话,烈建议你用基于IPSEC的L2TP来代替PPTP,因为它更加安全,并且提供了和PPTP一样的功能。
[color=Red]第二部分,openswan的安装[/color]
FreeS/WAN是基于IPSec的VPN项,现在已经停止开发,其分裂为两个项目,Openswan与 Strongswan。其可以用自身的IPsec内核堆栈(Kernel stack),称为KLIPS,也可以用2.6内核中的堆栈代码;因为IPSec工作在网络层,所以需要系统内核态的支持,但2.4的内核没有实现内核堆栈,故必须打klips补丁。同时,若想要实现NAT Traversal的支持,还需要打上NAT-T补丁。
openswan是新项目,且frees/wan已经于2004年停止开发,于是我们想当然地要用openswan了。
既然要做网关转发数据,两个或更多的NIC自然是必不可少的了.
一、安装内核原代码
1。你可以从网上下载2.4的最新版本至/usr/src,并解压缩;我这里使用发行光盘中自带的内核源码实现,挂载RH 9.0的第二张盘并执行以下命令安装
#rpm -ivh kernel-source-2.4.20-8.i386.rpm
2.检查/usr/src目录下的linux和linux-2.4是否已链接到新近安装的内核源码,如果没有,则执行以下命令创建链接:
#ln -s linux-2.4.20-8 linux
#ln -s linux-2.4.20-8 linux-2.4
二、下载openswan、klips补丁和nat-t补丁至/usr/src目录中
1.下载地址为:[url]http://www.openswan.org/code[/url],请下载以下全部三个软件包
openswan-2.4.7.tar.gz
openswan-2.4.7.kernel-2.4-klips.patch.gz
openswan-2.4.7.kernel-2.4-natt.patch.gz
2.解压openswan,并将补丁拷贝至其解压出的目录中
#cd /usr/src
#tar zxvf openswan-2.4.7.tar.gz
#cp openswan-2.4.7.kernel-2.4-* /usr/src/openswan-2.4.7
三、进入源码目录,进行内核编译的准备工作
1.清理源代码树
#cd /usr/src/linux-2.4
#make mrproper
2.生成内核源码
#cp ./configs/kernel-2.4.20-i686.config .config
#make menuconfig
选择你所需要的内核选项,保存退出即可。请注意,尽量不要把关于开发以及实验性的选项编译进来。
注:如果你的Linux是安装在VMWare之上的话,请确保选择了以下几项:
Ram Disk驱动:
Block devices--->
< * > RAM disk support
(4096) Default RAM disk size (NEW)
< * > Initial RAM disk (initrd) support
文件系统:
File systems--->
[ * ] Ext3 journalling file system support
[ * ] JBD (ext3) debugging support
SCSI驱动,如果你使用的是模拟SCSI硬盘(若是升级安装内核,BusLogic SCSI support项亦必需设置为‘M’),此项尤其应该注意:
< * > SCSI support--->
SCSI low-level drivers --->
< M >BusLogic SCSI support
虚拟网卡AMD PCnet32 驱动:
Device Drivers --->
Networking support --->
Ethernet (10 or 100Mbit) --->
<*> AMD PCnet32 PCI support
3.建立新内核模块所需要的目录
#mkdir -pv /lib/modules/2.4.20-8custom
四、应用内核补丁,并编译安装内核
1.应用内核补丁,并编译内核
#cd /usr/src/openswan-2.4.7
#make nattpatch | (cd /usr/src/linux-2.4 && patch -p1 && make bzImage)
#cd /usr/src/linux && make dep bzImage
2.编译并安装内核模块
#cd /usr/src/linux-2.4
#make modules
#make modules_install
3.安装内核
#make install
4.检查/boot目录,是否显示有以下三项
#ls /boot |grep custom
initrd-2.4.20-8custom.img
System.map-2.4.20-8custom
vmlinuz-2.4.20-8custom
因为一些不知明的原因,这个initrd文件时常会引出kernel panic,所以我们把它移至别处并重新生成一个
#mv /boot/initrd/initrd-2.4.20-8custom.img
#mkinitrd /boot/initrd-2.4.20-8custom.img 2.4.20-8custom
5.检查/boot/grub/grub.conf文件中是否有如下几行:
#more /boot/grub/grub.conf
title Red Hat Linux (2.4.20-8custom)
root (hd0,0)
kernel /vmlinuz-2.4.20-8custom ro root=LABEL=/
initrd /initrd-2.4.20-8custom.img
好了,如果一切就绪,就可以重启你的系统了,注意要启用新内核。:)祈祷……
五、如果新内核启用没有任何问题,那么就可以开始以下的openswan的安装过程啦
1.确保启用了新的内核
#uname -r
2.4.20-8custom
2.安装生成userland tools 和 ipsec.o
#cd /usr/src/openswan-2.4.7
#make KERNELSRC=/usr/src/linux-2.4 programs module
#make KERNELSRC=/usr/src/linux-2.4 install minstall
注意:以上第二个步骤(#make KERNELSRC=/usr/src/linux-2.4 programs module)过程中若出现类同以下的错误,则需要编辑/usr/src/openswan-2.4.7/linux/net/ipsec/pfkey_v2.c文件删除“owner"对应的行,大概在原文的122和132行,把它删除即可。
cc -include /usr/src/openswan-2.4.7/packaging/linus/config-all.h -O3 -Wall -DIPCOMP_PREFIX -D__KERNEL__ -I/usr/src/linux-2.4.20-8/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=i686 -I/usr/src/openswan-2.4.7/linux/include -I/usr/src/linux-2.4/include -I -DIPCOMP_PREFIX -DARCH=i386 -DMODVERSIONS -include /usr/src/linux-2.4/include/linux/modversions.h -DMODULE -DMODVERSIONS -include /usr/src/linux-2.4.20-8/include/linux/modversions.h -DKBUILD_BASENAME=pfkey_v2 -c -o pfkey_v2.o /usr/src/openswan-2.4.7/linux/net/ipsec/pfkey_v2.c
/usr/src/openswan-2.4.7/linux/net/ipsec/pfkey_v2.c:122: unknown field `owner' specified in initializer
/usr/src/openswan-2.4.7/linux/net/ipsec/pfkey_v2.c:122: warning: initialization makes integer from pointer without a cast
/usr/src/openswan-2.4.7/linux/net/ipsec/pfkey_v2.c:122: initializer element is not computable at load time
/usr/src/openswan-2.4.7/linux/net/ipsec/pfkey_v2.c:122: (near initialization for `pfkey_family_ops.authentication')
/usr/src/openswan-2.4.7/linux/net/ipsec/pfkey_v2.c:132: unknown field `[color=Red]owner[/color]' specified in initializer
/usr/src/openswan-2.4.7/linux/net/ipsec/pfkey_v2.c:132: warning: initialization from incompatible pointer type
make[2]: *** [pfkey_v2.o] Error 1
make[2]: Leaving directory `/usr/src/openswan-2.4.7/modobj'
make[1]: *** [module24] Error 2
make[1]: Leaving directory `/usr/src/openswan-2.4.7'
make: *** [module] Error 2
3.检查/lib/modules/2.4.20-8custom/kernel/net/ipsec的输出中是否有ipsec.o
#ls /lib/modules/2.4.20-8custom/kernel/net/ipsec
ipsec.o
4.安装openswan,[ 这一刻等的太久了吧:) ]
#cd /usr/src/openswan-2.4.7
#make programs
#make install
六、启动并检查启动状态
1.编辑/etc/sysctl.conf,找到如下两项:
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
改作:
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
然后用以下命令重新启用此文件
#sysctl -p
2.启动openswan
#service ipsec start
ipsec_setup: Starting Openswan IPsec 2.4.7...
3.检查状态
#ipsec verify
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path [color=Green][OK][/color]
Linux Openswan 2.4.7 (klips)
Checking for IPsec support in kernel [color=Green] [OK][/color]
Checking for RSA private key (/etc/ipsec.secrets) [color=Green] [OK][/color]
Checking that pluto is running [color=Green][OK][/color]
Two or more interfaces found, checking IP forwarding [color=Green] [OK][/color]
Checking NAT and MASQUERADEing
Checking for 'ip' command [color=Green][OK][/color]
Checking for 'iptables' command [color=Green][OK][/color]
Opportunistic Encryption Support [color=Red] [DISABLED][/color]
[size=2][color=Red]