下一页 上一页 目录

3. Linux 主机设置

本 HOWTO 假设您使用的是 2.4 系列的内核,因为它使用了 iptables。除此之外,没有已知的问题表明它不能在 2.2 内核的主机上工作,只需将脚本适配到 ipchains 即可。

当然,您需要安装 iptables 用户空间工具,如果您想运行 CGI 工具来更改密码,还需要安装 Apache HTTP 服务器和 SAMBA。并且您需要一个编译了 iptables 模块的内核。

您可能希望使用 DHCP。如果是这样,设置起来很容易。请记住配置 DHCP 服务器,使其同时提供域名服务器 IP 地址和网关 IP 地址。Windows 机器将很好地利用这些信息。

3.1 基本系统设置

通常,来自常见 Linux 发行版的任何基本系统设置都适用于此网关示例。只需检查您是否安装了 Samba 和 IPTABLES。

3.2 额外的目录结构

要完成本 HOWTO 的示例,将需要额外的目录结构。

这用于跟踪用户和 IP 地址。

/var/run/smbgate/

这是我放置用户特定脚本的地方。

/etc/smbgate/users/

以及组特定脚本。

/etc/smbgate/groups/

netlogon 共享的目录。

/home/samba/netlogon/

tracking 共享的目录。

/home/samba/samba/

这些目录结构是示例中的一些脚本和守护进程所必需的。

3.3 防火墙设置

您的发行版内核不太可能没有编译 Iptables,并且用户空间工具也不太可能没有安装。无论如何,如果您没有安装,请参考 http://www.netfilter.orghttp://www.iptables.org 获取软件和文档。

为了使网关正常工作,您将需要一个基本的防火墙设置。请查看 IPTABLES TUTORIAL 上的 iptables 教程。这是一篇有趣的读物。无论如何,如果您没有时间细看,以下代码可能有些(非常)宽松,但可能适合您的需求。

#!/bin/sh
IPTABLES=/usr/sbin/iptables
/sbin/depmod -a
/sbin/insmod ip_tables
/sbin/insmod ip_conntrack
/sbin/insmod ip_conntrack_ftp
/sbin/insmod ip_conntrack_irc
/sbin/insmod iptable_nat
/sbin/insmod ip_nat_ftp
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT 
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -F FORWARD 
$IPTABLES -t nat -F

您会注意到这段代码实际上什么都不做,只是加载与 nat 和防火墙相关的内核模块,并开启数据包路由。您可以(并且应该)在那里放置任何规则,使您的网关具有标准行为,但真正的魔法将由 SAMBA 守护进程调用的脚本完成。

请记住,这段代码没有任何安全性!请勿在生产环境中使用这些示例。此示例仅用于教育目的。您必须添加适合您系统的防火墙配置。

警告过了!

3.4 SAMBA 设置

检查您是否安装了 Samba。如果您的发行版没有预装 Samba,请参考 http://www.samba.org 获取软件包和关于如何安装 Samba 的文档。浏览他们的网站并了解相关信息。该网站有大量的文档,也许您的 LINUX 发行版也有大量的 SAMBA 文档。

我们需要将 SAMBA 设置为主要域控制器 (Primary Domain Controller)。我将在此处提供一个示例配置文件,但您应该阅读 Samba HOWTO Collection 并尽可能多地了解 PDC。

基本 SAMBA 设置。

由于我不打算重写 SAMBA 文档,这里提供一个示例 smb.conf 文件。

# Global parameters
[global]
workgroup = DOMAIN
netbios name = LINUX
server string = Linux PDC
encrypt passwords = Yes
map to guest = Bad Password
passwd program = /usr/bin/passwd
unix password sync = Yes
max log size = 50
time server = Yes
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
add user script = /usr/sbin/useradd -d /dev/null -g 100 -s /bin/false -M %u
logon script = %a.bat
domain logons = Yes
os level = 64
lm announce = True
preferred master = True
domain master = True
dns proxy = No
printing = lprng
[homes]
comment = Home Directories
path = /home/%u
read only = No
[printers]
comment = All Printers
path = /var/spool/samba
printable = Yes
browseable = No
available = No
[netlogon]
comment = NetLogon ShARE
path = /home/samba/netlogon
guest account = 
[samba]
comment = login tracking share
path = /home/samba/samba
browseable = No
root preexec = /usr/local/bin/netlogon.sh %u %I
root postexec = /usr/local/bin/netlogoff.sh %u

您将不得不使用它,或者如果您真的想控制您的服务器和网络,请阅读 SAMBA 文档。

“登录脚本”

使用 “logon script = %a.bat” 会使 Samba 评估访客操作系统 (guest OS) 并调用适当的登录脚本。如果您想要一个静态脚本,只需更改为 “logon script = netlogon.bat”。实际上,您可以在这里做任何事情,甚至在登录期间生成任何脚本。

netlogon 和 tracking 共享。

netlogon 共享是 Windows 工作站从中下载登录脚本的地方。我们需要这个共享,以便在那里放置一个登录脚本,该脚本将告诉工作站挂载一个共享,该共享将用于跟踪用户的 IP 地址。

如您所见,您的 smb.conf 中必须有一行类似如下的内容。

logon script = netlogon.bat

这行代码将告诉您的 Windows 客户端下载并执行名为 netlogon.bat 的脚本。此脚本必须放置在 netlogon 共享中。因此,我们还需要一个 netlogon.bat 脚本用于您的 Windows 工作站。您可以使用以下示例并将其放置在 netlogon 共享中,在本例中为:/home/samba/netlogon/NETLOGON.BAT。

REM NETLOGON.BAT
net use z: \\linux\samba /yes

此脚本将告诉 Windows 工作站挂载指定的共享,这样我们就可以通过 smbstatus 程序的输出来跟踪用户和工作站。

非常简单!但还不够...

如您所见,我们还需要一个 tracking 共享,在本示例中,我将其命名为 samba。您可以在 smb.conf 中看到 tracking 共享的配置。

[samba]
comment = login tracking share
path = /home/samba/samba
browseable = No
root preexec = /usr/local/bin/netlogon.sh %u %I
root postexec = /usr/local/bin/netlogoff.sh %u

正如您可以猜测或了解到的,如果您阅读过 SAMBA 文档,root preexec 和 root postexec 行告诉 SAMBA 在用户挂载或卸载共享时运行指示的脚本。在本例中,我们将用户名作为参数传递给脚本。请注意行尾的 %u。这些脚本是调用脚本或程序来修改我们网关的数据包过滤规则的关键。

请注意,netlogon.sh 脚本必须检查引用的工作站是否已挂载 tracking 共享。

查看 netlogon.sh 和 netlogoff.sh 脚本。

#!/bin/sh
#
# netlogon.sh
#
# usage:
# netlogon.sh <username>
#
if [ -f /var/run/smbgate/$1 ] ; then
    exit 0
fi
echo $2 > /var/run/smbgate/$1
IPTABLES='/usr/sbin/iptables'
EXTIF='eth0'
COMMAND='-A'
ADDRESS=`cat /var/run/smbgate/$1`
GROUP=`groups $1 | gawk '// { print $3 }'`
if [ -f /etc/smbgate/users/$1 ] ; then
    /etc/smbgate/users/$1 $COMMAND $ADDRESS $EXTIF
else
    if [ -f /etc/smbgate/groups/$GROUP ] ; then
        /etc/smbgate/groups/$GROUP $COMMAND $ADDRESS $EXTIF
    else
        /etc/smbgate/users/default.sh $COMMAND $ADDRESS $EXTIF
    fi
fi

此脚本 (netlogon.sh) 旨在在用户登录时运行,并将根据用户名和用户所属的组选择要执行的脚本。用户的 IP 地址将被写入 /var/run/smbgate 中的一个文件,以用于跟踪目的。该文件将以用户名命名,并在用户注销时稍后使用。IP 地址将作为参数传递给一个以用户名命名的脚本,该脚本最终将更新防火墙。

请注意,此 netlogon.sh 脚本首先尝试用户脚本,如果找不到用户脚本,则尝试组脚本,如果找不到组脚本,则尝试 default.sh 脚本。您可以根据自己的意愿和需要修改此逻辑和行为,只需记住相应地修改其他部分。

如果用户属于多个组,这些脚本很可能会失败。我没有时间编写更好的代码。

#!/bin/sh
#
# netlogoff.sh
#
# usage:
# netlogoff.sh <username>
#
IPTABLES='/usr/sbin/iptables'
EXTIF='ppp0'
COMMAND='-D'
TRACKSHARE="samba"
ADDRESS=`cat /var/run/smbgate/$1`
GROUP=`groups $1 | gawk '// { print $3 }'`
NM=`smbstatus -u $1 | grep $TRACKSHARE | wc -l`
if [ $NM -gt 0 ]; then
    exit
fi
if [ -f /etc/smbgate/users/$1 ] ; then
    /etc/smbgate/users/$1 $COMMAND $ADDRESS $EXTIF
else
    if [ -f /etc/smbgate/groups/$GROUP ] ; then
        /etc/smbgate/groups/$GROUP $COMMAND $ADDRESS $EXTIF
    else
        /etc/smbgate/users/default.sh $COMMAND $ADDRESS $EXTIF
    fi
fi
rm -f /var/run/smbgate/$1

此脚本 (netlogoff.sh) 旨在在用户注销时运行,并将从 /var/run/smbgate/user 文件中获取地址,该地址将作为参数传递给 /etc/smbgate/users/user 脚本,该脚本将防火墙更新到用户未登录时所需的状态。

某些版本的 Windows,例如 Windows 2000,每次登录可能会多次挂载 tracking 共享。这可能会导致 netlogon.sh 和 netlogoff.sh 出现问题,多次触发脚本。这可能会造成混乱。因此,您可能更喜欢在 cron 中使用注销检查脚本,而不是由 SAMBA 触发的 netlogoff.sh 脚本。这是一个示例。

#!/bin/sh
# checklogout.sh
#
# usage:
# intended to run at cron (maybe each 10 minutes)

TRACKDIR="/var/run/smbgate"
DIRLENGTH=${#TRACKDIR}
TRACKSHARE="samba"
EXTIF='eth0'
COMMAND='-D'
if [ -d $TRACKDIR ]; then
  for n in $TRACKDIR/*; do
    [ -d $n ] && continue;
    if [ -f $n ] ; then 
      IPADDRESS=`cat $n`
      USERNAME=${n:$DIRLENGTH+1}
      NMS=`smbstatus -u $USERNAME | grep $TRACKSHARE | grep $IPADDRESS | grep -v grep | wc -l`
      if [ $NMS == 0 ] ; then
        rm -f $n
        GROUP=`groups $USERNAME | gawk '// { print $3 }'`
        if [ -f /etc/smbgate/users/$USERNAME ] ; then
          /etc/smbgate/users/$USERNAME $COMMAND $IPADDRESS $EXTIF
        else
          if [ -f /etc/smbgate/groups/$GROUP ] ; then
            /etc/smbgate/groups/$GROUP $COMMAND $IPADDRESS $EXTIF
          else
            /etc/smbgate/users/default.sh $COMMAND $IPADDRESS $EXTIF
          fi
        fi
      fi
    else
      exit 0
    fi
  done
fi 

在这种情况下,您应该从 smb.conf 中 tracking 共享的 root postexec 子句中删除。

root postexec = /usr/local/bin/netlogoff.sh %u

以下是一个标准的 /etc/smbgate/users/user 脚本。这是实际修改防火墙规则的脚本。

#!/bin/sh
#
COMMAND=$1
ADDRESS=$2
EXTIF=$3
IPTABLES='/usr/sbin/iptables'
$IPTABLES $COMMAND POSTROUTING -t nat -s $ADDRESS -o $EXTIF -j MASQUERADE

我们还应该在 /etc/smbgate/users/ 中放置一个 default.sh 脚本,以使网关具有默认行为。

#!/bin/sh
#
# default.sh
COMMAND=$1
ADDRESS=$2
EXTIF=$3
IPTABLES='/usr/sbin/iptables'
#$IPTABLES $COMMAND POSTROUTING -t nat -s $ADDRESS -o $EXTIF -j MASQUERADE
exit 0


下一页 上一页 目录