红联Linux门户
Linux帮助

构建基于Linux的VPN网络

发布时间:2006-09-01 01:08:38来源:红联作者:Explore
构建VPN几乎是Linux的最高级应用之一了,学会了这项技术,是足以使你自豪的资本。VPN的主要用途就是建立一个加密的通信机制,然后通过把所有的你的子网的信息按照特定的方式加密传输,构成一个逻辑上的虚拟的网络。简单的说,就是一个Linux系统的IP层加密解决方案。这里面需要用到不少组件,下面一一介绍。

1、准备工作和安装

? 从http://www.kernel.org下载2.4.X的内核,除了2.4.15版本(该版本有一个致命错误)。然后把该内核放置到: /usr/src中。(这里我们使用Linux-2.4.18.tar.gz),然后释放:tar zxvf linux-2.4.18.tar.gz

? 删除原来的连接rm linux

? ln -s linux-2.4.18.tar.gz linux

? 检查当前的网卡和SCSI的型号(参见内核升级一章)

? cd linux (进入linux-2.4.18目录)

? make menugonfig

? make dep

? make bzImage

? 编译工作做到这里就打住!

? 从http://www.swox.com/gmp 下载gmp库的最新版本到/usr/local/src。

? tar zxvf gmp-4.0.1.tar.gz

? cd gmp-4.0.1

? ./configure

? make

? make install

? 从http://www.freeswan.org下载freeswan...?/usr/local/src

? tar zxvf freeswan-1.97.tar.gz

? 从http://www.strongsec.com/freeswan/ 下载x509patch-0.9.11-freeswan-1.97.tar.gz ,这个是补丁文件。释放,进入x509补丁目录,复制freeswan.diff到外面的freeswan源目录,然后回到freeswan源目录中运行:patch -p1 < freswan.diff

? 从http://www.openssl.org下载openssl-0...?头牛??肽柯?

? ./config (如果原来系统中有openssl需要先uninstall再安装,不过一般情况下你可能uninstall不下来8-)。如果无法uninstall,找到他们的路径,在这里通过--prefix=参数指定路径覆盖旧版本的文件。这里严重建议:如果你没有把握确定路径,最好这样做:到你用的发行包的开发商的FTP站点(如果你用turbolinux就去ftp.turbolinux.com用redhat就去ftp.redhat.com),用 anonymous用户和随便一个电子邮件作为密码登陆,找到你用的发行包版本的生机目录,然后下载相应的RPM包,注意:这里的包至少应该是 0.9.6b1以上的i386版本。下载完毕后用rpm -Uvh更新。这样做完了很干净。

? make (如果你用rpm包升级就不用这个步骤了)

? make test (如果你用rpm包升级就不用这个步骤了)

? make install (如果你用rpm包升级就不用这个步骤了)安装完了以后执行openssl命令,输入version看看是不是你刚刚安装的版本。如果不是,可能没有覆盖原来安装的旧版本。从1.20重新来过

? 然后回到freeswan的源目录,运行:make menugo,在networking options中选择关于iptables和ipsec相关的所有选项。其中ipsec是freeswan加上的,最好把前面括号中M(模块方式)换成* (编译进内核)。下列内核选项应该选上:

进入:Networking Options至少选择上:

 [*] Network packet filtering (replaces ipchains)
  [*] Network packet filtering debugging (NEW)
  进入:IP: Netfilter Configuration --->
  <*> Connection tracking (required for masq/NAT) (NEW)
FTP protocol support (NEW)
IRC protocol support (NEW)



注意:如果你需要使用DHCP功能,需要增加Pachet Socket mmapped IO和Socket Filtering两个选项,参见DHCP一章。

等等……

把下面的选项全部标记<*>
返回上一层菜单后,把列表选项最下面的凡是IPSEC相关的选项全部选为<*>。另外的,如果你打算使用拨号连接请在网络设备支持菜单选择ppp支持(注意,你用的ppp程序一定要2.4版本以上的)

? 然后检查网卡和硬盘选项是否正确,如果没有问题就逐层退出,然后保存配置。

? 退出后将自动编译内核,等待……

? 编译完成后,来到/usr/src/linux目录,运行:make modules;make modules_install

? cp System..map /boot/System.map-2.4.18-vpn

? cd arch/i386/boot

? cp bzImage /boot/vmlinuz-2.4.18-vpn

? cd /boot

? rm System.map

? ln -s System.map-2.4.18-vpn System.map

? vi /etc/lilo.conf

 boot=/dev/sda
  map=/boot/map
  install=/boot/boot.b
  prompt
  timeout=50
  lba32
  default=linux-vpn
  image=/boot/vmlinuz
label=linux
initrd=/boot/initrd
read-only
root=/dev/sda5
  image=/boot/vmlinuz-2.4.18-vpn
label=linux-vpn
initrd=/boot/initrd
read-only
root=/dev/sda5



? 运行lilo更新数据

? reboot

? 启动后,运行:ipsec setup restart 应该不报任何错误而正常出现freeswan的版本。

注意:还有一些必要的内核参数配置,这些配置可以在rc.local中实现。他们是:

  echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
  echo 1 > /proc/sys/net/ipv4/ip_forward



如果你把下面两项编译成模块(前面扩号是M而不是*):

   FTP protocol support (NEW)
IRC protocol support (NEW)



你需要在rc.local中加上:

modprobe ip_nat_ftp



安装完了,接下来我们将说明几种VPN的玩法。

2、配置Frees/wan用于支持双网关通信。也就是两个异地的子网通过一对ipsec的VPN网关进行交互访问。第一种玩法是网络对网络的VPN。一般的,某企业在甲乙两地(距离相当远)各有一个办公室,每个办公室各有一套LAN,他们分别通过专线连接到internet网络上。甲LAN上是企业的管理中心,运行着企业的管理系统。而乙LAN上的用户也需要使用该管理系统,尽管乙LAN可以通过internet(公网)连接过去,但是企业的老板说不行!我们的数据不能暴露在公网上,必须加密!好了,我们的VPN网络就可以应用于该企业的这种需求。首先在甲乙两个LAN的出口各放置一台我们的 Linux服务器,他们都安装好了ipsec(前面说的安装步骤一个都不少),两个LAN的数据分别通过各自的这台机器(ipsec gateway)进入公网,凡是经过该网关的数据全部都是加密的。在效果上,两个LAN的用户可以互相ping到对方的机器,尽管他们可能一个是 192.168.1.0/24网段,另一个是192.168.10.0/24网段的。他们好像在同一个局域网中工作,没有界限。公共网络的加密部分对他们来说也是透明的。而两个LAN在公共网络上交换的数据是密文的。这就是虚拟专用网VPN。
但愿你已经按照前面的步骤顺利的安装好了两台机器,下面我告诉你怎样配置成网对网的环境。

? 我们先配置甲网的ipsec网关(该网关有两个网卡,我们配置他们的地址分别为eth1:192.168.1.231和eth0:21.9.22.22)。安装完成后,我们首先要做的事情是生成CA证书。(用到刚才安装的openssl)

? 找到openssl.cnf文件,一般在/etc/ssl/中,也可能在/var/ssl中或/usr/ssl中(实在不行你就find / -name “openssl.cnf”找找嘛!),要是有好几个,你要搞清楚哪个是你安装的版本。改动其中的default_bits选项的值从1024到 2048,然后改动default_days的值到3650。让期限为10年!保存退出。

? 在/var/中建立一个目录:/var/sslca,改变该目录的权限为700(chmod 700 /var/sslca)

? 在你安装的openssl目录中找到CA.sh脚本。注意,应该是你当前运行的openssl版本的CA.sh

? cd /var/sslca 进入到你刚才建立的目录

? 比如你刚才找到的CA.sh在/usr/lib/ssl/misc/,那么就输入/usr/lib/ssl/misc/CA.sh -newca,接下来你会被问到一系列问题。问题和回答类似于下面的样子。如果你确认哪些你有把握更改就改, ~/sslca#/usr/lib/ssl/misc/CA.sh -newca
  CA certificate filename (or enter to create)
(enter)
  Making CA certificate ...
  Using configuration from /usr/lib/ssl/openssl.cnf
  Generating a 2048 bit RSA private key
  ........................................+++
  ........................................+++
  writing new private key to './demoCA/private/./cakey.pem'
  Enter PEM pass phrase:(enter password)
  Verifying password - Enter PEM pass phrase:(enter same password again)
  -----
  You are about to be asked to enter   
  information that will be incorporated
  into your certificate request.
  What you are about to enter is what is called a Distinguished Name or a DN.
  There are quite a few fields but you can leave some blank
  For some fields there will be a default value,
If you enter '.', the field will be left blank.
  -----
  Country Name (2 letter code) [AU]:US(enter)
  State or Province Name (full name) [Some-State]:State(enter)
  Locality Name (eg, city) []:City(enter)
  Organization Name (eg, company) [Internet Widgits Pty Ltd]:21vianet(enter)
  Organizational Unit Name (eg, section) []:(enter)
  Common Name (eg, YOUR name) []:CA(enter)
  Email Address []:ca@xxx.com(enter)
  ~/sslca#



? 下一步是给网关生成证书:

命令和要回答的问题如下:

~/sslca# /usr/lib/ssl/misc/CA.sh -newreq
Using configuration from /usr/lib/ssl/openssl.cnf
Generating a 2048 bit RSA private key
  ...................................+++
  ...............................+++
  writing new private key to 'newreq.pem'
  Enter PEM pass phrase:(enter password)
  Verifying password - Enter PEM pass phrase:(repeat password)
  -----
  You are about to be asked to enter information that will be incorporated
  into your certificate request.
  What you are about to enter is what is called a Distinguished Name or a DN.
  There are quite a few fields but you can leave some blank
  For some fields there will be a default value,
  If you enter '.', the field will be left blank.
  -----
  Country Name (2 letter code) [AU]:US(enter)
  State or Province Name (full name) [Some-State]:State(enter)
  Locality Name (eg, city) []:City(enter)
  Organization Name (eg, company) [Internet Widgits Pty Ltd]:ExampleCo(enter)
  Organizational Unit Name (eg, section) []:(enter)
  Common Name (eg, YOUR name) []:vpnserver.rd.xxx.com(enter)
  Email Address []:user@xxx.com(enter)
  Please enter the following 'extra' attributes
  to be sent with your certificate request
  A challenge password []:(enter)
  An optional company name []:(enter)
  Request (and private key) is in newreq.pem
  natecars@buzzword:~/sslca$ /usr/lib/ssl/misc/CA.sh -sign
  Using configuration from /usr/lib/ssl/openssl.cnf
  Enter PEM pass phrase:(password you entered for the ca certificate)
  Check that the request matches the signature
Signature ok
  The Subjects Distinguished Name is as follows
  countryName :PRINTABLE:'US'
  stateOrProvinceName :PRINTABLE:'State'
  localityName :PRINTABLE:'City'
  organizationName :PRINTABLE:'21vianet'
  commonName :PRINTABLE:'vpnserver.rd.xxx.com'
  emailAddress :IA5STRING:'rd@xxx.com'
  Certificate is to be certified until Feb 13 16:28:40 2012 GMT (3650 days)
  Sign the certificate? [y/n]:y(enter)
  1 out of 1 certificate requests certified, commit? [y/n]y(enter)
  Write out database with 1 new entries
Data Base Updated
  (certificate snipped)
  Signed certificate is in newcert.pem



在以上步骤中一定要记住你输入的密码。如果哪一不错了,想重新来过的话,记住删除/var/sslca目录下面的所有子目录即可。

? 把文件名字改为你需要的

~/sslca# mv newcert.pem vpnserver.rd.xxx.com.pem
  ~/sslca# mv newreq.pem vpnserver.rd.xxx.com.key



? 编辑.key文件,删除'-----BEGIN CERTIFICATE REQUEST-----'后面所有的东西,之后,这个文件应该从'-----BEGIN RSA PRIVATE KEY-----'至'-----END RSA PRIVATE KEY-----'结束。

? 如果正常的安装了x.509补丁,你应该可以看到/etc/ipsec.d及其下面的目录。如果没有,你就自己建立。然后按照下面的位置复制合适的文件:(此时你仍然在/var/sslca目录中)

 # cp vpnserver.rd.xxx.com.key /etc/ipsec.d/private
  # cp vpnserver.rd.xxx.com.pem /etc/ipsec.d
  # openssl x509 -in demoCA/cacert.pem -outform der -out rootca.der
  # cp rootca.der /etc/ipsec.d/cacerts/RootCA.der
  # openssl x509 -in host.example.com.pem -outform der -out /etc/x509cert.der
  # openssl ca -gencrl -out crl.pem
  # cp crl.pem /etc/ipsec.d/crls



? 在/etc/ipsec.secrets中加入一行:: RSA vpnserver.rd.xxx.com.key "password",然后删除其他所有行。其中的password是你前面生成密要的时候回答问题输入的密码。

 # basic configuration
  config setup
interfaces=%defaultroute
klipsdebug=none
plutodebug=none
plutoload=%search
plutostart=%search
uniqueids=yes
  conn %default
keyingtries=1
compress=yes
disablearrivalcheck=no
authby=rsasig
leftrsasigkey=%cert
rightrsasigkey=%cert
left=%defaultroute
leftcert=vpnserver.rd.xxx.com.pem
auto=add
pfs=yes
  conn roadwarrior
right=%any
  conn roadwarrior-net
leftsubnet=192.168.1.0/255.255.255.0
right=%any
  conn net-net
leftsubnet=192.168.1.0/255.255.255.0
right=%any
rightsubnet=192.168.10.0/255.255.255.0
  conn world-net
leftsubnet=*
right=%any
rightsubnet=192.168.10.0/255.255.255.0



黑体字的部分是你需要根据你实际的环境更改的。我们用的两端的子网是192.168.1.0/24和192.168.10.0/24。文件中 vpnserver.rd.xxx.com.pem是CA证书。这个配置是通用的,也就是说可以适用LAN-LAN方式的俩接和远端客户端两种方式。
? 下面配置分支机构的网关。这个机器也要事先安装完全freeswan等软件。

重新执行上面的2.7-2.9步骤生成分支机构的证书,注意:在回答问题的过程中,关于主机名称的部分的输入改变为你分支机构的网关机器名称,比如:vpncliet.rd.xxx.com。

? 复制下列生成的文件到分支机构网关上的相应位置(比如通过软盘复制):

 cp vpnserver.rd.xxx.com.pem /etc/ipsec.d
  cp vpnclient.rd.xxx.com.key /etc/ipsec.d/private
  cp vpnclient.rd.xxx.com.pem /etc/ipsec.d
  执行命令:openssl x509 -in vpnclient.rd.xxx.com.pem -
    outform der -out /etc/x509cert.de
  cp rootca.der /etc/ipsec.d/cacerts/RootCA.der
  cp crl.pem /etc/ipsec.d/crls



? 配置分支机构的/etc/ipsec.secrets 写上一行:

  RSA vpnclient.rd.xxx.com.key "password"。



其他行删除。Password就是前面回答问题的时候输入的密码。

? 配置/etc/ipsec.conf

 # basic configuration
  config setup
interfaces=%defaultroute
klipsdebug=none
plutodebug=none
plutoload=%search
plutostart=%search
uniqueids=yes
  conn %default
keyingtries=0
compress=yes
disablearrivalcheck=no
authby=rsasig
rightrsasigkey=%cert
leftrsasigkey=%cert
right=%defaultroute
rightcert=vpnclient.rd.xxx.com.pem
auto=add
pfs=yes
  conn roadwarrior
left=21.9.22.22
leftcert=vpnserver.rd.xxx.com.pem

  conn roadwarrior-net
left=21.9.22.22
leftcert=vpnserver.rd.xxx.com.pem
leftsubnet=192.168.1.0/255.255.255.0

  conn net-net
left=21.9.22.22
leftcert=vpnserver.rd.xxx.com.pem
leftsubnet=192.168.1.0/255.255.255.0
rightsubnet=192.168.10.0/255.255.255.0



其中黑体的部分是你可以根据实际情况修改的。

? 首先启动server端的ipsec:ipsec setup restart,然后同样启动客户端的ipsec

? 建立通道:ipsec auto -up net-net然后在Server端可以用命令ipsec whack status应该可以看到新建立的几个通道。此时,你在两个子网中应该可以互相ping 通。
3、配置Frees.wan用于支持远程客户端访问。也就是允许一个Windows客户端,来通过VPN和公司内部的网络进行通讯。

第2种VPN玩法其实就是把分支机构的LAN换成一个单独的,地址不固定的机器。这样的应用适合总经理出差的时候从外地ISP拨号上网连接到本部网络的情况。期间,非但有认证,而且通过ISP和公网的数据全部是加密的。这种方式在服务器端的配置和上面完全一样(记得吗?我们在行面给出的配置已经是兼顾了两种用法)。这里需要做的是把总经理的笔记本配成VPN客户端。他的笔记本应该是windows2000的并且升级到sp2。

? 首先重复2.7-2.9步骤生成证书,其中有关主机名的部分可以输入你总经理的机器名。类似于:win.rd.xxx.com。当然,总经理的机器要是同名的。

 openssl pkcs12 -export
-in win.rd.xxx.com.pem
    -inkey win.rd.xxx.com.key
    -certfile demoCA/cacert.pem
    -out win.rd.xxx.com.p12



? 用命令察看环境:最好把结果输出到文件记住,以后用得到。

 openssl x509 -in demoCA/cacert.pem -noout -subject



? 把上面生成的p12文件传送到总经理的机器上,放在一个正规的地方(这个文件很重要)。

? 在总经理的机器上从http://vpn.ebootis.de站点下载:ipsec.exe

? 在总经理的机器上从: http://agent.microsoft.com/windows2...ipsec资源工具。

? 安装上述两个软件,并且把他们放在同一个目录中。

? 建立一个ipsec的MMC:(希望你知道MMC是什么)

依次进入Start/Run/MMC,
File (or Console) - Add/Remove Snap-in
单击 'Add'
选 'Certificates', 然后选 'Add'
选 'Computer Account', 然后点 'Next'.
选 'Local computer', 然后点 'Finish'.
选 'IP Security Policy Management', 然后点 'Add'.
选 'Local Computer', 然后点 'Finish'
选 'Close' 然后点 'OK'



展开左侧窗口中 'Certificates (Local Computer)'
右键 'Personal', 选 'All Tasks' 然后点 'Import'
点 Next



输入哪个.p12 文件的路径 (就是刚才你从服务器网关复制过来的,浏览选择也可), 然后点'Next' 输入export password(密码), 然后点Next 选'Automatically select the certificate store based on the type of certificate', 然后点Next 点Finish, 如果有任何提示窗口弹出都选yes 退出MMC,保存当前配置到管理工具中,这样就不用每次都重新来过了。以上所做就增加了一个证书到总经理的机器上。

? 设置ipsec工具:

编辑总经理机器上的ipsec.conf文件,把rightca的=后面写成刚才openssl x509 -in demoCA/cacert.pem -noout -subject命令生成的结果。类似下面这样:

 conn roadwarrior
left=%any
right=(ip_of_remote_system)
rightca="C=US,S=State,L=City,O=21vianet,
      CN=CA,Email=ca@xxx.com"
network=auto
auto=start
pfs=yes
  conn roadwarrior-net
left=%any
right=(ip_of_remote_system)
rightsubnet=192.168.1.0/24
rightca="C=US,S=State,L=City,O=21vianet,
      CN=CA,Email=ca@xxx.com"
network=auto
auto=start
pfs=yes



黑体部分要注意配置正确。

? 运行ipsec.exe有下面输出:

 C:ipsec>ipsec
  IPSec Version 2.1.4 (c) 2001,2002 Marcus Mueller
  Getting running Config ...
  Microsoft's Windows XP identified
  Host name is: (local_hostname)
  No RAS connections found.
  LAN IP address: (local_ip_address)
  Setting up IPSec ...

Deactivating old policy...
Removing old policy...

  Connection roadwarrior:
MyTunnel : (local_ip_address)
MyNet : (local_ip_address)/255.255.255.255
PartnerTunnel: (ip_of_remote_system)
PartnerNet : (ip_of_remote_system)/255.255.255.255
CA (ID) : C=US,S=State,L=City,O=ExampleCo,...
PFS : y
Auto : start
Auth.Mode : MD5
Rekeying : 3600S/50000K
Activating policy...

  Connection roadwarrior-net:
MyTunnel : (local_ip_address)
MyNet : (local_ip_address)/255.255.255.255
PartnerTunnel: (ip_of_remote_system)
PartnerNet : (remote_subnet)/(remote_netmask)
CA (ID) : C=US,S=State,L=City,O=ExampleCo,...
PFS : y
Auto : start
Auth.Mode : MD5
Rekeying : 3600S/50000K
Activating policy...
  C:ipsec>

这时候你从客户端ping服务器后面的内网得到几个'Negotiating IP Security'之后就可以ping通了。这样总经理带着这台笔记本到有互联网络的地方就可以象在办公室一样连接到公司里了。

值的注意的是,出于安全性的问题,我们建议你关闭VPN网关上面的所有其他服务,并仔细配置防火墙。通常的,如果你希望把所有的流量都发送给主站网关,在从站就不需要增加iptables策略。否则,需要增加这样一条策略:

 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE



在主站由于路由的原因,需要增加下面的策略:

  iptables -t nat -A POSTROUTING -o ipsec0 -s ! 192.168.10.0/255.255.255.0 -
    j SNAT -to 192,168.1.231
  iptables -t nat -A POSTROUTING -o eth1 -s ! 192.168.10.0/255.255.255.0 -
    j SNAT -to 192,168.1.231

每行中前面的黑体是子网网段,后面的是本网关的内侧出口。
文章评论

共有 2 条评论

  1. YBnlbqj54 于 2009-11-18 20:29:27发表:

    谢谢!

  2. ljp50598313 于 2009-09-28 14:18:49发表:

    那你有没有在REDHAT下用ADSL动态IP地址做网络对网络VPN的方案嘛,共享一下嘛