对于客户端与服务器之间的通讯用SSL进行加密是一个很好的选择,但是很多情况下需要建立一种企业级的通讯通道。在两个网关之间的 Internet上点到点的传递极其私密的数据,出于这种加密和认证的需要,IPSEC 应运而生。
IPSEC 是 Intenet 协议安全,它使用很强的密码系统提供认证和加密服务。IPSEC 在 IP 层进行加密,所以它对链路层的依赖型不大。它可以工作在各种底层网络上。IPSEC 可以为 IP 层以上的协议提供保护。对于用户来说,这种保护看起来是透明的。
IPSEC 可以提供在两个网关之间的不安全的互联网上的安全通道的这种能力。在这种通道中传送的数据都是要求保密性非常高的数据,数据在发送者的网关处加密,在接收者的网关处解密。这就是 VPN(Virtual Private Network)。Freeswan 就是在 Linux 下实现 IPSEC 的工具。
您可以到下面的站点下载 freeswan:
http://www.freeswan.org/
由于 freeswan 是以内核补丁形式提供的,所以您必须先下载 Linux 内核,再下载对应于内核的 freeswan。我们先要根据自己的系统情况修改 freeswan 的 Makefile 文件,然后用下面的命令进行编译,并且把 freeswan 加入到 Linux 内核的源代码中:
[root@sound freeswan-1.3]# make insert [root@sound freeswan-1.3]# make programs [root@sound freeswan-1.3]# make install |
然后我们就需要编译内核,这里不想再介绍如何编译内核,只提示要改变的内核选项,下面这些选项您都要确定选"Y":
IPSec options (FreeS/WAN) IP Security Protocol (FreeS/WAN IPSEC) (CONFIG_IPSEC) [Y/n/?] IPSEC: IP-in-IP encapsulation (CONFIG_IPSEC_IPIP) [Y/n/?] IPSEC: PF_KEYv2 kernel/user interface (CONFIG_IPSEC_PFKEYv2) [Y/n/?] IPSEC: Enable ICMP PMTU messages (CONFIG_IPSEC_ICMP) [Y/n/?] IPSEC: Authentication Header (CONFIG_IPSEC_AH) [Y/n/?] HMAC-MD5 authentication algorithm (CONFIG_IPSEC_AUTH_HMAC_MD5) [Y/n/?] HMAC-SHA1 authentication algorithm (CONFIG_IPSEC_AUTH_HMAC_SHA1) [Y/n/?] IPSEC: Encapsulating Security Payload (CONFIG_IPSEC_ESP) [Y/n/?] 3DES encryption algorithm (CONFIG_IPSEC_ENC_3DES) [Y/n/?] IPSEC Debugging Option (DEBUG_IPSEC) [Y/n/?] |
一些内核选项会被 freeswan 自动打开,即使这些选项原来是关闭的。尽管这样还是建议您不要关闭下面的选项:
Kernel/User netlink socket (CONFIG_NETLINK) [Y/n/?] Netlink device emulation (CONFIG_NETLINK_DEV) [Y/n/?] |
Freeswan 的配置文件 "/etc/ipsec.conf" 许可您设定您的 IPSEC 设置,连接类型以及控制信息等。IPSEC 目前支持两种类型的连接:手工连接和自动连接。手工连接需要的密钥保存在 "/etc/ipsec.conf" 文件中,这种连接没有自动连接安全。对于一个商业应用来说,使用手工(固定)密钥是不安全和不可靠的。在自动密钥连接模式下产生一个 256 位共享密钥,将其复制到连接通道的各个节点上后,那些企图截取数据包的网络攻击者将很难攻破这种安全连接。在自动密钥连接模式下,一个密钥的有效期是 8 个小时,这种配置有效地阻止了那些企图用暴力法猜出密钥的攻击者。自动连接的密钥由一个叫 Pluto 的密钥协商守候进程产生,缺省使用叫 IKE 的密钥协商协议。这个协议根据 "/etc/ipsec.secrets" 文件中的信息确定不同的系统。
我们下面举一个例子论述配置和使用的整个过程。假如我们有下面的 VPN 通道:
SubnetDeep===Deep------Deepgate..………....Mailgate-------Mail===SubnetMail Untrusted net 左边子网= SubnetDeep (192.168.1.0/24) 左边的主机 = Deep (deep.openna.com)(202.164.186.1) 左边的网关 = Deepgate (205.151.222.250) Internet = Untrusted net 右边的网关 = Mailgate (205.151.222.251) 右边的主机 = Mail (mail.openna.com)( 208.164.186.2) 右边的子网= SubnetMail (192.168.1.0/24) |
我们要编辑 ipsec.conf 文件来来满足我们的需要。在这个文件中有两大个段落。第一个 "config" 是关于 IPSEC 的一些普通配置信息的,后一个 "conn" 指定特定的 IPSEC 连接通道。具体的配置信息可以参看 man 帮助页。
"ipsec.secrets" 包含 pluto 守候进程认证网关之间通讯的密钥。有两种类型的密钥,一种是共享的密钥,一种是RSA的私人密钥。下面的命令产生 256 位的共享密钥:
[root@deep /]# ipsec ranbits 256 > temp |
现在这个共享密钥在 temp 文件中,我们要把它复制到 "ipsec.secrets" 文件中。"ipsec.conf" 和 "ipsec.secrets" 都要拷贝到 VPN 通道另一端的网关上。"ipsec.conf" 文件中的 "config setup" 字段可能要根据接口的不同有所改变。
接下来我们要创建 RSA 的密钥对了:
我们在两个网关上都建立密钥对:
[root@deep /]# ipsec rsasigkey --verbose 1024 > deep-keys [root@mail /]# ipsec rsasigkey --verbose 1024 > mail-keys |
然后我们将前面产生的 temp 文件中的共享密钥放在每个网关的 "ipsec.conf" 文件中,在文件中的 "conn" 字段加入下面几行:
authby=rsasig leftrsasigkey=<Public key of deep> rightrsasigkey=<Public key of mail> |
然后在两个网关上处理 deep-keys 和 mail-keys 这两个 RSA 公钥,我们把这个个文件中的 "#pubkey=" 部分拷贝到各自的 "ipsec.conf"中去,如下:
authby=rsasig leftrsasigkey=0x010395daee1be05f3038ae529ef2668afd79f5ff1b16203c9ceaef801cea9cb74bcfb51a6ecc08890d3 eb4b5470c0fc35465c8ba2ce9d1145ff07b5427e04cf4a38ef98a7f29edcb4d7689f2da7a69199e4318b4c8d0ea25d33e4f 084186a2a54f4b4cec12cca1a5deac3b19d561c16a76bab772888f1fd71aa08f08502a141b611f rightrsasigkey=0x01037631b81f00d5e6f888c542d44dbb784cd3646f084ed96f942d341c7c4686cbd405b805dc728f86 97475f11e8b1dd797550153a3f0d4ff0f2b274b70a2ebc88f073748d1c1c8821dc6be6a2f0064f3be7f8e4549f8ab9af649 44f829b014788dd202cf7d2e320cab666f5e7a197e64efe0bfee94e92ce4dad82d5230c57b89edf |
最后把deep-keys和mail-keys这两个文件中的剩余部分包括(包括私钥)放进"ipsec.secrets"中去。
然后重新启动带有IPSec支持的内核的系统。系统重启时会出现几个错误,这主要是IPSec在缺省情况下使用了实际并不存在的eth999接口。建议你将ipsec程序的路径加入到用户环境变量中。
IPSec的网络设置首先,需要允许网关服务器的TCP-IP转发。在Red Hat Linux系统中的实现方法:
将 FORWARD_IPV4="false" 改为 FORWARD_IPV4="yes" 即可。
另一个方法是直接修改/proc文件系统,执行以下命令即可:
cat 1 > /proc/sys/net/ipv4/ip_forward |
然后我们要重新启动网络:
[root@deep /]# /etc/rc.d/init.d/network restart |
这时pluto守候进程要启动,它尝试去连接另一边的网关上的pluto守候进程,这样一个连接就可以建立了。所以我们要在ipchains的配置文件中加入一些包过滤规则许可以下的协议通过网关通往另一边的网关:
UDP port 500 for IKE implemented by the Pluto daemon Protocol 50 for ESP encryption and/or authentication Protocol 51 for AH packet-level authentication |
必须保证IP欺骗选项没有被打开,可以将下面的命令添加到/etc/rc.d/rc.local文件中:
[root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/ipsec0/rp_filter [root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter |
最后要注意的是, 任何使用了 IPSec 的内部网络的所有伪装(masquerade),规则都必须在允许 IPSec 的规则之后进行,否则主机将试图伪装 (masquerade) 数据包,而不是将它们传递给 IPSec。所以我们还要在两边网关的 ipchains 配置文件中加入下面的设定来保证能够正常的转发 IPSEC 的数据包:
# Masquerade internal traffic. # All internal traffic is masqueraded externally. ipchains -A forward -i $EXTERNAL_INTERFACE -s $LOCALNET_1 -j MASQ Where EXTERNAL_INTERFACE="eth0" # You external interface to the Internet. Where LOCALNET_1=" 192.168.1.0/24" # whatever private range you use. |
现在可以重启机器了,我们所要做的设置都完成了,一个 VPN 已经构建好了。
.- 上一篇:Portsentry网络反扫描工具
- 下一篇:Hping2---网络探测工具