ubuntu 12.04 利用openswan实现ipsec vpn(lan-to-lan和host-to-lan)

来源:互联网 发布:it s high noon 编辑:程序博客网 时间:2024/06/06 00:04

注意:ubuntu 12.04,openswan是U2.6.37/K3.2.0-65-generic-pae(netkey)

1.网络拓扑

我们要做的事是这样的,在两个私网的网关上安装openswan,配置相关信息,使得两个私网内主机可以互相访问,用虚拟机模拟实际情况应该是这样的

client1 (eth0)<---------->(eth1)  server1  (eth0)<------------->  (eth0)server2  (eth1)<------------>(eth0)  client2

172.16.1.2  172.16.1.1               202.38.2.2             202.38.2.3         172.16.2.1              172.16.2.2

其中172.16.1.1是172.16.1.2的网关,172.16.2.1是172.16.2.2的网关,202,.38.2.2和202.38.2.3互为网关。

静态设置ip的方法是编辑/etc/network/interfaces

sudo vi /etc/network/interfaces
其中server1的该文件为


其他的参照上图配置


2.修改网关内核参数

作为网关,必须具有路由功能,而ubuntu默认是关闭的,需要打开

sudo vim /etc/sysctl.conf
编辑成

net.ipv4.ip_forward=1

net.ipv4.conf.default.rp_filer=0

注意:将前面的#也去掉

此外,我们需要设置网关禁用ICMP重定向,否则会报错。

写一个shell脚本

vi a.sh

修改权限,使其可执行

sudo chmod a+x a.sh
执行的命令为
sudo bash a.sh
如果重启,这个脚本就得重新执行,可以在/etc/rc.local中添加执行a.sh的语句,让它开机执行。

3.安装配置openswan

在两个网关上都安装openswan

sudo apt-get install openswan
安装过程提示是否安装X.509证书,选否。

我们采用rsa密钥认证身份,生成密钥的命令为

sudo ipsec newhostkey --output /etc/ipsec.secrets
如果这个命令长时间没反应的话,需要修改/usr/lib/ipsec/newhostkey的第64行,将它改为

ipsec rsasigkey $verbose --random /dev/urandom $host bits
原因可能是使用/dev/random生成随机数出现bug造成程序阻塞,用/dev/urandom来代替它。

查看rsa公钥的命令为

sudo ipsec showhostkey --left
是left和right都一样,输出的都是本服务器的公钥。
编辑配置文件/etc/ipsec.conf,在config setup 部分将protostack改为netkey,其它不需要改动,conn部分如下:

简单说明一下,left是指一端服务器外网ip,leftsubnet是指一端私网网段,nexthop都是%defaultroute,leftid是一个标识符,这还用服务器ip地址,leftrsasigkey是一端公钥,相应的,right就是另一端的,这个配置文件两端服务器都是一样的。

以上都做完以后,验证一下各种条件是否满足

sudo ipsec verify
最好的结果应该是这样的:

否则,根据对应的错误进行检查和修正。

4.建立连接

这一步比较简单,在服务器

sudo ipsec auto --up sample
出现以下提示则说明连接建立

在client1 ping client2,应该能ping通

ping 172.16.2.2
此时在服务器上用tcpdump抓包,应该是这样的:


5.Road-Warrior模式

lan2lan中网关不能访问对端子网,所以需要Road-Warrior模式,使得移动主机可以访问远程子网,网络拓扑如下:

client1 (eth0)<---------->(eth1)  server1  (eth0)<------------->  (eth0)laptop

172.16.1.2               172.16.1.1             202.38.2.2              202.38.2.4

所有的配置都相同,除了配置文件写法不同,前面两个网关的配置文件相同,且文件中left指的是1,right指的是2,但在这种模式下,left指的是自己,right指的是远端。

服务器添加一个新连接:


注意right写的是%any,意思是对端的ip可以是动态变化的,laptop的配置文件是这样的:


如果laptop的ip是动态变化的,left可以写成%defaultroute。

6.详细抓包分析

在服务器使用wireshark进行抓包,在filter中输入isakmp过滤,至少可以看见9个包,其中6个的Info注明主模式,剩下的注明快速模式,如果看不见主模式,可能是因为openswan是开机自动运行的,而且我们配置文件中“auto=start”,使得一开机服务器就开始连接,可能抓不到前面的包,解决的办法,可以把auto设为add,也可以在一台服务器上先开始抓包,再启动另一台服务器,总而言之,抓到的包如下:


因为虚拟机屏幕宽度,我忽略了No.和Time两列,下面逐个分析:

①首先注意到每个包开头的两个Cookie,它们分别是发起方和响应方使用ip地址和端口信息以及本地产生的秘密值进行散列计算得到的,作用是防止攻击者伪造IP进行阻塞攻击


这是第一个包,所以Responder cookie 还是0.,同时注意到包头的邻接载荷指向Security Association,SA有一个参数Proposal,Proposal通过协议ID来指示是替什么协议进行协商SA,

Proposal还包含了该协议能使用的所有密码算法,每一套算法用Transform载荷封装,,其各种属性分别对应生命周期单位,生命周期长度,加密算法,哈希算法,认证方式,群描述,密钥长度。


②这个包和第一个包几乎一样,但只有一个Transform,它就是响应方所选择的Transform,从图中可以看出选择了第0个。


③这是发起方用来交换密钥信息的包,所以包含Key Exchange载荷,除此之外,还有Nonce载荷,它要求在应答中出现,用来抗重放攻击。


④与上一包的格式相同,是响应方的密钥信息,略。

⑤⑥双方根据密钥信息算出主密钥及扩展密钥,并用其中一个对前面交换的数据哈希后供对方进行认证。

⑦⑧快速模式开始,与协商IKE SA类似,协商IPSEC SA,同时再次发送比⑤⑥多出ID(IP,port,protocol)的哈希进行认证,此外还有可选的DH密钥交换。

⑨发送包含双方nonce值的哈希用来确认。

0 0