构建Linux的专用通道VPN

wannagonna 2010-09-17

IPSEC应用于在两个网关间的Internet上点到点传递极其私密数据。数据在发送者的网关处加密,在接收者的网关处解密。也就是VPN(Virtual Private Network)。

IPSEC是Intenet协议安全,使用很强的密码系统提供认证和加密服务。IPSEC在IP层进行加密,对链路层的依赖型不大。可以工作在各种底层网络上。IPSEC可为IP层以上的协议提

供保护。
Freeswan就是在 Linux 下实现 IPSEC 的工具。
从http://www.freeswan.org/下载。

freeswan是以内核补丁形式提供的,所以必须先下载Linux内核,再下载对应于内核的 freeswan。
先要根据系统情况修改freeswan的Makefile文件,然后再编译,并把freeswan加到Linux内核的源代码中:
[root@mako freeswan-1.3]# make insert
[root@mako freeswan-1.3]# make programs
[root@mako 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/?]
Kernel/User netlink socket (CONFIG_NETLINK) [Y/n/?]
Netlink device emulation (CONFIG_NETLINK_DEV) [Y/n/?]
Freeswan的配置文件/etc/ipsec.conf可设定连接类型以及控制信息等。
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@mako /]# 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"中去。
最后把deep-keys和mail-keys这两个文件中的剩余部分包括(包括私钥)放进"ipsec.secrets"中去。
然后重新启动带有IPSec支持的内核的系统。
系统重启时会出现几个错误,这主要是IPSec在缺省情况下使用了实际并不存在的eth999接口。建议将ipsec程序的路径加入到用户环境变量中。
IPSec的网络需要允许网关服务器的TCP-IP转发。
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则构建好了。

相关推荐