Next Previous Contents

4. 开始建置

4.1 规划

在你开始设定系统前,你应该要先瞭解一下网路连接的细节。现在,我假定你有两个防火墙 ,各保护一个公司内部网路。所以,现在每个防火墙应该会有两个网路界面(至少)。拿一 张纸,写下它们的 IP 位址和网路遮罩。每个 VPN 的防火墙,将会使用到数个 IP 位址区 段。这些 IP 位址区段,应该设定在你公司现有的子网路的范围以外。我建议使用“私有” IP 位址区段的范围。如下所示:

为了说明,此处我举了一个设定的案例:有两台 bastion [译注] 主机,分别被称为 fellini 和 polanski。它们各有一个界面连接网际网路 (-out),一个界面连接公司内部网路 (-in) ,以及,一个界面连接 VPN (-vpn)。所有的 IP 位址和网路遮罩,如下:

译注: bastion 是指暴露在公司网路外部的防火墙闸道。

所以我们有个计划。

4.2 搜集工具

你将会需要

目前使用的版本:

4.3 编译与安装

你现在的工作不是编译就是安装所搜集到的工具。 并参阅其(以及 firewall-howto) 详细的说明文件。现在,我们已经安装好这些工具了。

4.4 其它子系统的设定

设定防火墙以及其它的项目。你必须在两台防火墙主机之间,允许 ssh 资料的流通。这 是指,主防火墙会有网路连线到次防火墙的埠 22。在次防火墙上启动 sshd,来验证是否 允许你“登入(login)”。这个步骤尚未测试过,请告诉我你的测试结果。

4.5 设定 VPN 的使用者帐户

以你日常使用的工具(例如,vi﹑mkdir﹑chown﹑chmod)在次防火墙上建立一个使用者帐 户,你也可以在主防火墙上建立一个使用者帐户,但是,我认为在开机阶段设定连线就可以 了,所以,使用原始的 root 帐户就已足够。有任何人可以为我们说明一下,在主防火墙上 使用 root 帐户,会有什么危险性?

4.6 为 master 帐户,产生一个 ssh key

你可以使用 ssh-keygen 程序。如果,你要自动设置 VPN,你可以设定一个没有密码的 “私人钥匙(private key)”。

4.7 为 slave 帐户,设置自动的 ssh 登入环境。

在次防火墙中,复制你刚才产生的“公共钥匙(public key)”到,使用者帐户 slave 中 的 .ssh/authorized_keys 文档里,并且,设定文档的使用权限,如下:

drwx------ 2 slave slave 1024 Apr 7 23:49 ./  
drwx------ 4 slave slave 1024 Apr 24 14:05 ../  
-rwx------ 1 slave slave 328 Apr 7 03:04 authorized_keys  
-rw------- 1 slave slave 660 Apr 14 15:23 known_hosts  
-rw------- 1 slave slave 512 Apr 21 10:03 random_seed  

其中,第一行是 ~slave/.ssh,第二行是 ~slave。

4.8 加强 ssh 在 bastion 主机上的安全性。

请按照我在 sshd_conf 上的设定:

PermitRootLogin no  
IgnoreRhosts yes  
StrictModes yes  
QuietMode no  
FascistLogging yes  
KeepAlive yes  
RhostsAuthentication no  
RhostsRSAAuthentication no  
RSAAuthentication yes  
PasswordAuthentication no  
PermitEmptyPasswords no 

密码认证(PasswordAuthentication)被关闭了,所以,你只有使用授权过的 key,才能够 完成登入的动作。(当然,你也已经关闭了,telnet 与 'r' 命令)。

4.9 允许 ppp 的执行,和这两个帐户的路由。

当你的 master 帐户是 root 时(以我的例子而言),你不必做任何事情。至于 slave 帐户,则会在你的 /etc/sudoers 的文档中出现一行:

Cmnd_Alias VPN=/usr/sbin/pppd,/usr/local/vpn/route  
slave ALL=NOPASSWD: VPN  

正如你所看到的,我在次防火墙主机上,使用了一些命令稿(scripts),来设定 ppp 和路由表。

4.10 撰写命令稿程序

在主防火墙主机上,我使用了一个成熟的启始命令稿:

#! /bin/sh
# 程序架构  这个文档是个建立在 /etc/init.d/ 目录下的命令稿实例。
#               你应该在 /etc/init.d 目录下使用这个命令稿。
#
#               作者 Miquel van Smoorenburg <miquels@cistron.nl>.
#               Debian GNU/Linux 修订版作者
#               Ian Murdock <imurdock@gnu.ai.mit.edu>.
#
# 版本:               @(#)skeleton  1.6  11-Nov-1996  miquels@cistron.nl
#

PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11/:
PPPAPP=/home/slave/ppp
ROUTEAPP=/home/slave/route
PPPD=/usr/sbin/pppd
NAME=VPN
REDIR=/usr/local/bin/pty-redir
SSH=/usr/bin/ssh
MYPPPIP=192.168.0.1
TARGETIP=192.168.0.2
TARGETNET=193.6.37.0
MYNET=193.6.35.0
SLAVEWALL=polanski-out
SLAVEACC=slave

test -f $PPPD || exit 0

set -e

case "$1" in
  start)
        echo setting up vpn
        $REDIR $SSH -o 'Batchmode yes' -t -l $SLAVEACC $SLAVEWALL sudo $PPPAPP >/tmp/device
        TTYNAME=`cat /tmp/device`
echo tty is $TTYNAME
        sleep 10s
        if [ ! -z $TTYNAME ]
        then
        $PPPD $TTYNAME ${MYPPPIP}:${TARGETIP}
        else
                echo FAILED!
                logger "vpn setup failed"
        fi
        sleep 5s
        route add -net $TARGETNET gw $TARGETIP
        $SSH -o 'Batchmode yes' -l $SLAVEACC $SLAVEWALL sudo $ROUTEAPP
    ;;
  stop)
        ps -ax | grep "ssh -t -l $SLAVEACC " | grep -v grep | awk '{print $1}' | xargs kill
    ;;
  *)
    # echo "Usage: /etc/init.d/$NAME {start|stop|reload}"
    echo "Usage: /etc/init.d/$NAME {start|stop}"
    exit 1
    ;;
esac

exit 0
 

slave 帐户可以使用命令稿来设定路由 (/usr/local/vpn/route):

#!/bin/bash  
/sbin/route add -net 193.6.35.0 gw 192.168.0.1  

而其 .ppprc 的内容,如下:

passive  


Next Previous Contents