一直想把自己做openswan和strongswan的经历记录下来,可是我这人又懒又没时间,所以只好在网上找了篇写得比较全的Openswan的东东,自己稍加修改贴了上来,哎,我们这些做技术的起早贪黑,真的是挤不出时间来写博客啊!

一、OpenSWan简介

    OpenSWan是Linux下IPsec的最佳实现方式,其功能强大,最大程度地保证了数据传输中的安全性、完整性问题。
    OpenSWan支持2.0、2.2、2.4以及2.6内核,可以运行在不同的系统平台下,包括X86、X86_64、IA64、MIPS以及ARM。
    OpenSWan是开源项目FreeS/WAN停止开发后的后继分支项目,由三个主要组件构成:
      配置工具(ipsec命令脚本)
      Key管理工具(pluto)
      内核组件(KLIPS/26sec)

    26sec使用2.6内核内建模块Netkey,用来替代OpenSWan开发的KLIPS模块,2.4及以下版本内核无Netkey模 块支持,只能使用KLIPS。如果你用的是2.6.9以上的内核,推荐使用26sec,可以不用给内核打Nat-T补丁就可以使用NAT,2.6.9以下 版本内核的NETKEY存在Bug,推荐使用KLIPS。
    更多详情请参见OpenSWan项目主页:http://www.openswan.org

二、系统环境

   操作系统(server):CentOS 4.5
   内核版本:2.6.9-55
   客户端(windows XP)
   主机网络参数设置: 如无特殊说明,子网掩码均为255.255.255.0 
   主机名      网卡eth0   网卡eth1    默认网关     用途
   LServer    192.168.1.10 172.16.1.1  192.168.1.1 Left网关
   RServer    192.168.1.20 172.16.2.1  192.168.1.1 Right网关
   LClient    172.16.1.2               172.16.1.1  Left客户机
   RClient    172.16.2.2               172.16.2.1  Right客户机


三、安装设置操作系统

系统采用最小安装:只安装开发工具
以下步骤只需在Local Server、Remote Server上执行。
分别在Local Server、Remote Server执行以下命令:
sysctl -a | egrep "ipv4.*(accept|send)_redirects" | awk -F "=" '{print $1"= 0"}' >> /etc/sysctl.conf   编辑/etc/sysctl.conf
vi /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  (其实现在的openswan包安装好后会在/etc/ipsec.d/samples/这个目录下面生成一个sysctl.conf的模板,直接把它替换掉原文件再执行以上命令即可)  
在LServer上执行以下命令设置NAT: 
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -d !172.16.2.0/24 -j MASQUERADE   
在RServer上执行以下命令设置NAT: 
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.2.0/24 -d !172.16.1.0/24 -j MASQUERADE
(请注意一下这两条iptables语句为的是将加密流量与非加密流量区别开来)


四、安装OpenSWan

   1. 下载源码包 
cd 
wget http://www.openswan.org/download/openswan-2.4.7.tar.gz
   2. 解压源码包 
tar zxvf openswan-2.4.7.tar.gz   
   3. 安装UserLand 
cd openswan-2.4.7
make programs
make install   
   4. 安装KLIPS 
cd ~/openswan-2.4.7
make KERNELSRC=/lib/modules/`uname -r`/build module minstall
depmod -a        加载KLIPS模块前必须先卸载NETKEY模块 
rmmod xfrmuser af_key esp4 ah4 ipcomp xfrm4_tunnel        执行以下命令加载KLIPS 
modprobe ipsec
   5. 验证安装
执行下面的命令验证OpenSWan是否正确安装 
ipsec --version      如果程序正确安装,此命令将显示以下结果:      
如果已加载的IPsec stack是KLIPS,显示如下 
Linux Openswan 2.4.7 (klips)
See `ipsec --copyright' for copyright information.      
如果没有加载任何IPsec stack,显示如下 
Linux Openswan U2.4.7/K(no kernel code presently loaded)
See `ipsec --copyright' for copyright information.
  
五、配置OpenSWan

1. OpenSWan主要配置文件
/etc/ipsec.secrets                 用来保存private RSA keys 和 preshared secrets (PSKs)
/etc/ipsec.conf                    配置文件(settings, options, defaults, connections) 
2. OpenSWan主要配置目录 
/etc/ipsec.d/cacerts               存放X.509认证证书(根证书-"root certificates")
/etc/ipsec.d/certs                 存放X.509客户端证书(X.509 client Certificates)
/etc/ipsec.d/private               存放X.509认证私钥(X.509 Certificate private keys)
/etc/ipsec.d/crls                  存放X.509证书撤消列表(X.509 Certificate Revocation Lists)
/etc/ipsec.d/ocspcerts             存放X.500 OCSP证书(Online Certificate Status Protocol certificates)
/etc/ipsec.d/passwd                XAUTH密码文件(XAUTH password file)
/etc/ipsec.d/policies              存放Opportunistic Encryption策略组(The Opportunistic Encryption policy groups)
3. OpenSWan连接方式
      OpenSWan有两种连接方式:
      1) Network-To-Network方式
         顾名思义,Network-To-Network方式是把两个网络连接成一个虚拟专用网络。当连接建立后,每个子网的主机都可透明地访问远程子网的主机。
         要实现此种连接方式,要满足以下两个条件:
         I. 每个子网各自拥有一台安装有OpenSWan的主机作为其子网的出口网关;
         II.每个子网的IP段不能有叠加
      2) Road Warrior方式
         当使用Network-To-Network方式时,作为每个子网网关的主机不能像子网内部主机那样透明访问远程子网的主机,也就是说:
         如果你是一个使用Laptop的移动用户,经常出差或是在不同的地点办公,你的Laptop将不能用Network-To-Network方式与公司网络进行连接。
         Road Warrior方式正是为这种情况而设计的,连接建立后,你的Laptop就可以连接到远程的网络了。
   4. OpenSWan的认证方式
      Openswan支持许多不同的认证方式,包括RSA keys、pre-shared keys、XAUTH、x.509证书方式
   5. 使用RSA数字签名(RSASIG)认证方式配制OpenSWan
      1) 在LServer、RServer上生成新的hostkey 
ipsec newhostkey --output /etc/ipsec.secrets
      继续以下2-4步骤配置LServer-RServer之间的Network-To-Network方式链接:
      2) 在LServer上执行下面的命令获得leftrsasigkey(即LServer的公钥Pulic Key) 
ipsec showhostkey --left         此命令的输出格式如下所示: 
# RSA 2192 bits   LServer.FoxBB.Com   Sat Mar  3 15:45:00 2007
leftrsasigkey=0sAQOBIJFmj......
      3) 在RServer上执行下面的命令获得rightrsasigkey(即RServer的公钥 Pulic Key) 
ipsec showhostkey --right         此命令的输出格式如下所示: 
# RSA 2192 bits   RServer.FoxBB.Com   Sat Mar  3 15:51:56 2007
rightrsasigkey=0sAQNZZZjj......
      4) 在LServer及RServer上编辑/etc/ipsec.conf 
vi /etc/ipsec.conf         在最后添加如下内容(leftrsasigkey及rightrsasigkey行换成前面2,3步所取得的值) 
conn net-to-net
    left=192.168.1.10             # LServer外网IP地址
    leftsubnet=172.16.1.0/24      # LServer内网IP段

    leftid=@LServer.uddtm.com      # LServer的标识
    leftrsasigkey=0sAQOBIJFmj...   # LServer的公钥
    leftnexthop=%defaultroute      # LServer的下一跳指定为默认路由地址


    right=192.168.1.20            # RServer外网IP地址
    rightsubnet=172.16.2.0/24     # RServer内网IP段
    rightid=@RServer.uddtm.com     # RServer的标识
    rightrsasigkey=0sAQNZZZjj...   # Rserver的公钥
    rightnexthop=%defaultroute     # RServer的下一跳指定为默认路由地址
    auto=add                       # 添加这个链接,但是在OpenSWan启动时不自动连接

     5)在LServer、RServer上执行下面的命令启动OpenSWan 
service ipsec start
     6)在LServer及RServer上执行下面的命令验证OpenSWan是否正常运行 
ipsec verify        如果OpenSWan正常运行,将会得到类似下面的输出 
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path                              [OK]
Linux Openswan U2.4.7/K2.6.9-55.EL (netkey)
Checking for IPsec support in kernel                         [OK]
NETKEY detected, testing for disabled ICMP send_redirects    [OK]
NETKEY detected, testing for disabled ICMP accept_redirects  [OK]
Checking for RSA private key (/etc/ipsec.secrets)            [OK]
Checking that pluto is running                               [OK]
Two or more interfaces found, checking IP forwarding         [OK]
Checking NAT and MASQUERADEing                              
Checking for 'ip' command                                    [OK]
Checking for 'iptables' command                              [OK]
Opportunistic Encryption Support                             [DISABLED]
     7)在LServer或RServer上执行下面的命令进行LServer-RServer之间的Network-To-Network连接 
ipsec auto --up net-to-net        将会得到类似下面的输出(如果最后的输出行中出现IPsec SA established,说明连接成功 ) 
104 "net-to-net" #1: STATE_MAIN_I1: initiate
003 "net-to-net" #1: received Vendor ID payload [Openswan (this version) 2.4.7 
PLUTO_SENDS_VENDORID PLUTO_USES_KEYRR]
003 "net-to-net" #1: received Vendor ID payload [Dead Peer Detection]
003 "net-to-net" #1: received Vendor ID payload [RFC 3947] method set to=110 
106 "net-to-net" #1: STATE_MAIN_I2: sent MI2, expecting MR2
003 "net-to-net" #1: NAT-Traversal: Result using RFC 3947 (NAT-Traversal):
no NAT detected
108 "net-to-net" #1: STATE_MAIN_I3: sent MI3, expecting MR3
004 "net-to-net" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG
cipher=oakley_3des_cbc_192 prf=oakley_md5 group=modp1536}
117 "net-to-net" #2: STATE_QUICK_I1: initiate
004 "net-to-net" #2: STATE_QUICK_I2: sent QI2, IPsec SA established {ESP=>0xa329d030
     
     8)测试IPSEC链接
 在LClient上执行 ping 172.16.2.2       
 或在RClient上执行 ping 172.16.1.2        
 在ping命令执行期间,在LServer或RServer上执行 tcpdump -i eth0 -n host 192.168.1.10 and 192.168.1.20       
 如果LClient和RClient可以互相ping通,tcpdump有类似下面的输出,说明Network-To-Network方式IPSEC已经成功连接 
12:34:32.478903 IP 192.168.1.10 > 192.168.1.20: ESP(spi=0xf225b168,seq=0x7f)
12:34:32.480050 IP 192.168.1.20 > 192.168.1.10: ESP(spi=0x845109ca,seq=0x7f)
12:34:33.450660 IP 192.168.1.10 > 192.168.1.20: ESP(spi=0xf225b168,seq=0x80)
12:34:33.450938 IP 192.168.1.20 > 192.168.1.10: ESP(spi=0x845109ca,seq=0x80)
12:34:34.449218 IP 192.168.1.10 > 192.168.1.20: ESP(spi=0xf225b168,seq=0x81)
12:34:34.451034 IP 192.168.1.20 > 192.168.1.10: ESP(spi=0x845109ca,seq=0x81)

 
    9)设置自动连接
测试通过后,可以把连接配置中 
auto=add     更改为: 
auto=start    这样当OpenSWan启动时就可自动进行连接