Linux 在 Windows 工作站环境中的应用,第一部分

作者:Larry Finger

本系列文章介绍了如何开发一个基于 Linux 的服务器,以支持亚利桑那州梅萨市一家 55 岁以上房车度假村的计算机实验室中运行 MS Windows 的多台工作站。老年人白天玩沙狐球,晚上玩宾果游戏的陈旧刻板印象已经过时,如果曾经真实的话。这些活动有其作用;然而,我们的居民同样有可能在电脑室里,发送和接收电子邮件或浏览网页,研究他们最新的财务、医疗或娱乐问题。我们的设施保护本地机器免受经验不足和/或不称职的用户的侵害,但也为需要它们的用户提供复杂的服务。

背景

在开始这个项目之前,我曾使用过各种各样的计算机系统;然而,我的 UNIX 和 Linux 经验很少。我的计算机背景始于 1963 年,当时我是一名 Fortran 程序员,在大型机上支持我自己的科学研究。在 1970 年代初期,我是一个小型团队的成员,该团队开发了用于将 PDP-11 连接到科学仪器的实时软件和硬件。1981 年,我成为 VAX-11/780 的系统管理员,并运行各种系统。在这个职位上,我获得了一些 UNIX 和 Linux 系统的经验,直到 1999 年年中退休。那时,我成为了一名全职房车居民,致力于避开寒冷的天气。

1999 年 11 月,我们到达亚利桑那州梅萨市,并在梅萨帝王房车度假村(一个 55 岁以上的社区)安家落户。鉴于我长期以来与计算机打交道,我自然加入了计算机俱乐部。它在六七年前成立,当时一位居民每周将他的个人电脑带到教室一次,教居民如何使用这种机器。下一步是他和他的学生进行募款,购买一台 PC 用于教学目的。

到我到达梅萨市时,计算机俱乐部已经从简陋的起步发展到一个专门的计算机室,配备了 8 台基于 Windows 的 PC。这些机器共享一个 DSL 宽带互联网连接,路由和网络地址转换服务由运行在其中一台 PC 上的 WinGate 软件提供。这个配置是由一位顾问提出并实施的,因为计算机俱乐部没有内部的网络专业知识。

在我在梅萨市的第一个季度,俱乐部设施扩展到 12 台计算机。在接下来的夏天(2000 年),房车度假村被 Cal-Am Properties, Inc. 收购,该公司致力于为旗下物业的居民提供计算机访问。该公司的初步贡献是增加了十台新的工作站,并更换了两台最旧的计算机。然而,在这一点上,我们遇到了一个问题:我们的 WinGate 许可证只能支持 5 个并发的互联网会话,这对于 22 个工作站来说远远不够。因为我比其他人有更多的网络经验,所以我被要求提出解决这个问题的方案。我拒绝了为 WinGate 软件购买额外许可证的第一个选项,因为这将相对昂贵。此外,我的实时背景和 Windows 经验使我对在关键任务角色中使用 Windows 98 高度不信任。

第二个选择是将最近退役的机器之一(其资源不足以运行 Windows 98)转换为路由器。我了解到 Linux 可以在最低限度的硬件上良好运行,所以我开始在一台 133MHz 奔腾处理器、16MB 内存、1.4GB 硬盘和两个以太网接口上开发路由器。由此产生的系统是基于 SuSE 6.4 发行版构建的,采用了 2.2.x 内核。防火墙和网络地址转换功能由 ipchains 设施提供。这个系统不仅是用剩余设备构建的,没有硬件成本,而且显然可以处理所有工作站。它还增加了防火墙功能。“成本”仅仅是开发时间。该系统于 2000 年 11 月投入使用,并为我们服务了一年多。

2002 年 1 月,路由器内存从 16MB 升级到 32MB,内核升级到 2.4.x 系列,防火墙使用 iptables 功能重写,这增加了关于每个数据包的状态信息。我们不仅可以根据 TCP 或 UDP 端口阻止外部连接尝试,还可以只允许通过那些包含明确请求的信息的数据包。

2002 年末,一台配备 400MHz 处理器、64MB 内存和 6GB 硬盘的计算机可用。路由器系统被转移到这台机器上,之前的单元成为冷备用。然而,它从未被调用过,因为较新的单元也很稳定。它一直运行到 2004 年 6 月,只有在内核升级和耗尽电池备用电源的长时间断电时才需要重启。有一次,路由器在两次重启之间运行超过一年。

当前配置

在 2004 年夏天,度假村业主扩大并翻新了计算机室,用 39 台新的 Windows XP 工作站替换了所有旧的计算机设备,这些工作站通过 T-1 线路连接到互联网。这是一个使用我们最快的旧计算机(AMD Athlon 1800+)升级服务器的绝佳机会。它有 256MB 内存、两个总存储量为 10GB 的磁盘驱动器和两个网络接口。SuSE 9.1 发行版(具有 2.6.x 内核)是新系统的基础。两个硬盘驱动器使用以下方案进行分区

  • 交换分区,相当于 Windows 系统上的交换文件,被放置在每个驱动器上,/dev/hda(主 IDE 系统上的主驱动器,在 Windows 术语中为 C:)上有 2.0 GB,/dev/hdb(从驱动器)上有 0.5 GB。在驱动器之间分割交换空间可以提高系统响应速度;然而,这个系统很少交换,这可能无关紧要。

  • /dev/hda 的其余部分 7.8 GB 被格式化为 Reiser 文件系统,挂载为 /,即文件系统的根目录。

  • /dev/hdb 的其余部分 4.0 GB 被格式化为 Reiser 文件系统,挂载在 /home 上,这是通常专门用于用户文件存储的位置。

Linux 的优点之一是它支持几种不同的文件系统,用户可以在其中进行选择。我选择 Reiser 文件系统是因为它的日志功能,这避免了系统崩溃或电源故障时的长时间恢复。当有大量小文件时,它也比 Linux 默认的 ext2 文件系统更有效率。Linux 还将多个磁盘驱动器呈现为看起来像一个单片文件系统。即使是跨网络挂载的远程文件系统,也使用与本地文件完全相同的路径形式进行引用。

我们当前的 Windows 环境由 38 个用户站组成,每个用户站都配备了 2.4GHz Celeron 处理器、256MB 内存和 40GB 硬盘。单台教师机配备了 3.0GHz P4 处理器、512MB 内存和 80GB 硬盘。所有机器都配备了 Windows XP Pro、DVD ROM - CD/RW 光驱和 17 英寸平板 LCD 显示器。其他设备包括 XGA 投影仪、HP2300N 黑白激光打印机、HP4650N 彩色激光打印机和两台扫描仪。我们还有几个免费的 RJ-45 端口,用户可以使用个人笔记本电脑连接到互联网。此外,整个园区都提供免费 Wi-Fi 接入。图 1 显示了我们计算机设施的一部分。

Linux in a Windows Workstation Environment, Part I

房车公园的每位居民都有资格使用计算机;然而,在冬季(11 月 1 日至 3 月 31 日),只有俱乐部会员才能使用打印机或参加课程。在一年中的剩余时间里,彩色打印机被禁用,但可以使用黑白打印机。在旺季,计算机从早上 7 点到晚上 9 点开放,每周七天,每个季度大约有 25,000 个个人用户会话。本季度,所有 38 台机器经常处于繁忙状态,并且有更多用户在等待。俱乐部规则禁止个人用户安装新程序、在任何计算机上存储文件或更改任何设置。一个在每天午夜恢复每台机器的软件程序强制执行这些规则。

现在我已经更加熟悉 Linux,我想提供一个或多个带有 Linux 桌面的系统;然而,我认为我们的用户群不会支持这一点。事实上,我们的许多用户都是通过死记硬背来操作计算机的,即使缺少一个桌面图标也会迷失方向。

防火墙

Linux 盒子在当前设置中最重要功能是充当 Windows 工作站的网关,为它们执行网络地址转换,并保护网络免受外部入侵。这些任务是通过使用一个启动时脚本来完成的,该脚本利用了 Linux 的 iptables 功能。第一步是确保加载必要的内核模块。这些模块可能会自动加载;然而,如果缺少任何这些模块,这些指令将生成错误。

modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp

下一步是关闭数据包转发,并在所有接口上启用路由验证,以防止 IP 欺骗。此语法适用于 bash shell。注意:/proc 是一个伪文件系统,包含描述和控制驱动程序和进程的信息。

echo 0 > /proc/sys/net/ipv4/ip_forward
for i in /proc/sys/net/ipv4/conf/*/rp_filter 
do
  echo 1 > $i
done

下一组命令将符号 IPTABLES 定义为 iptables 二进制文件的绝对路径,删除所有现有规则并删除所有用户定义的链。

IPTABLES="/usr/local/sbin/iptables"
$IPTABLES -F                            # delete all the rules
$IPTABLES -X                            # delete all user-defined chains

我们现在为标准链设置策略。除非我们有接受它们的规则,否则传入的数据包将被丢弃;而传出和转发的数据包将被接受,除非有规则丢弃它们。

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

我们现在建立网络地址转换 (NAT)。此规则会将所有通过 eth1(外部)接口发出的数据源 NAT 到该接口的 IP。这种形式对于动态 IP 是正确的。

$IPTABLES -t nat -A POSTROUTING -o eth1 -j MASQUERADE

我们现在创建三个日志链和一个静默链,以丢弃稍后输入的规则将识别的数据包。数据包被丢弃而不是拒绝,以向潜在的入侵者隐藏我们的存在。为了帮助防止任何拒绝服务攻击成功,生成日志条目的最大速率受到限制。反斜杠 (\) 字符用于将命令延续到新行。

$IPTABLES -N firewall
$IPTABLES -A firewall -m limit --limit 15/minute -j LOG \
      --log-prefix "*** Firewall:"
$IPTABLES -A firewall -j DROP
$IPTABLES -N dropwall
$IPTABLES -A dropwall -m limit --limit 15/minute -j LOG \
      --log-prefix "*** Dropwall:"
$IPTABLES -A dropwall -j DROP
$IPTABLES -N badflags
$IPTABLES -A badflags -m limit --limit 15/minute -j LOG \
      --log-prefix "*** Badflags:"
$IPTABLES -A badflags -j DROP
$IPTABLES -N silent
$IPTABLES -A silent -j DROP

本地环回设备(127.0.0.1 或 lo)和内部以太网接口(eth0)被认为是受信任的,任何发往外部的数据包都会在不进一步检查的情况下路由。根据您的用户情况,这种假设可能不适用于您的网络。

$IPTABLES -A INPUT  -i lo -j ACCEPT
$IPTABLES -A OUTPUT -i lo -j ACCEPT
$IPTABLES -A INPUT  -i eth0 -j ACCEPT
$IPTABLES -A OUTPUT -i eth0 -j ACCEPT

所有来自我们名称服务器(外部)的数据包都被接受。

$IPTABLES -A INPUT -i eth1 -s 198.6.1.4 -j ACCEPT
$IPTABLES -A INPUT -i eth1 -s 198.6.1.5 -j ACCEPT
$IPTABLES -A INPUT -i eth1 -s 198.6.1.195 -j ACCEPT

下一组规则捕获所有具有非法标志组合的格式错误的数据包,并将它们放置在 badflags 链上,该链记录并丢弃它们。

$IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j badflags
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j badflags
$IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
       -j badflags
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j badflags
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j badflags
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j badflags

下一节静默丢弃那些生成大量日志条目但被认为无害的数据包,包括 Windows 机器生成的 netbios 内容。

$IPTABLES -A INPUT -i eth1 -s 167.216.187.186 -j silent
$IPTABLES -A INPUT -p udp --sport 137 --dport 137 -j silent

大多数 icmp 数据包被丢弃。只接受类型 8(ping)和类型 0(ping 回复)。Ping 限制为每秒一次。

$IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit \
       --limit 1/second -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type 0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -j firewall

只有来自 10.10.x.0 网络通过 eth1 进入的 Secure-shell 数据包才被接受。

$IPTABLES -A INPUT -i eth1 -s 10.10.0.0/16 -p tcp --dport 22 -j ACCEPT

任何来自外部接口 (eth1) 的剩余数据包都会被丢弃,除非它们的状态为 ESTABLISHED 或 RELATED。任何外部计算机都无法与内部的任何计算机建立连接。

$IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

最后一个规则是将仍在 INPUT 上的任何内容发送到 dropwall 链。这样我们就不会得到静默丢弃。

$IPTABLES -A INPUT -j dropwall

最后一步是打开数据包转发,并在控制台上回显适当的行。

echo 1 > /proc/sys/net/ipv4/ip_forward
echo "The MRCC Firewall is up and running."

上述规则已经保护我们的网络免受外部攻击近四年了。

下一篇文章预告

我的下一篇文章将介绍 Linux 系统为我们的网络提供的基本支持功能,包括用于本地内联网的 Web 服务器、仅缓存名称服务器和 DHCP 服务器。

资源

防火墙 - iptables,作者 Kyle Wheeler。

Linux ISO,众多 Linux 发行版的 CD 镜像列表

“桌面成功的工具”

“桌面游击战术:便携式瘦客户端方法”

Larry Finger 从华盛顿特区卡内基科学研究所退休,目前是亚利桑那州梅萨市梅萨帝王房车度假村计算机俱乐部的志愿者技术顾问。

加载 Disqus 评论