在你开始设定系统前,你应该要先瞭解一下网路连接的细节。现在,我假定你有两个防火墙 ,各保护一个公司内部网路。所以,现在每个防火墙应该会有两个网路界面(至少)。拿一 张纸,写下它们的 IP 位址和网路遮罩。每个 VPN 的防火墙,将会使用到数个 IP 位址区 段。这些 IP 位址区段,应该设定在你公司现有的子网路的范围以外。我建议使用“私有” IP 位址区段的范围。如下所示:
为了说明,此处我举了一个设定的案例:有两台 bastion [译注] 主机,分别被称为 fellini 和 polanski。它们各有一个界面连接网际网路 (-out),一个界面连接公司内部网路 (-in) ,以及,一个界面连接 VPN (-vpn)。所有的 IP 位址和网路遮罩,如下:
译注: bastion 是指暴露在公司网路外部的防火墙闸道。
所以我们有个计划。
你将会需要
目前使用的版本:
你现在的工作不是编译就是安装所搜集到的工具。 并参阅其(以及 firewall-howto) 详细的说明文件。现在,我们已经安装好这些工具了。
设定防火墙以及其它的项目。你必须在两台防火墙主机之间,允许 ssh 资料的流通。这 是指,主防火墙会有网路连线到次防火墙的埠 22。在次防火墙上启动 sshd,来验证是否 允许你“登入(login)”。这个步骤尚未测试过,请告诉我你的测试结果。
以你日常使用的工具(例如,vi﹑mkdir﹑chown﹑chmod)在次防火墙上建立一个使用者帐 户,你也可以在主防火墙上建立一个使用者帐户,但是,我认为在开机阶段设定连线就可以 了,所以,使用原始的 root 帐户就已足够。有任何人可以为我们说明一下,在主防火墙上 使用 root 帐户,会有什么危险性?
你可以使用 ssh-keygen 程序。如果,你要自动设置 VPN,你可以设定一个没有密码的 “私人钥匙(private key)”。
在次防火墙中,复制你刚才产生的“公共钥匙(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。
请按照我在 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' 命令)。
当你的 master 帐户是 root 时(以我的例子而言),你不必做任何事情。至于 slave 帐户,则会在你的 /etc/sudoers 的文档中出现一行:
Cmnd_Alias VPN=/usr/sbin/pppd,/usr/local/vpn/route slave ALL=NOPASSWD: VPN
正如你所看到的,我在次防火墙主机上,使用了一些命令稿(scripts),来设定 ppp 和路由表。
在主防火墙主机上,我使用了一个成熟的启始命令稿:
#! /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