Linux 在 Windows 工作站环境中的应用,第二部分:本地网络支持
本系列文章介绍了如何开发一个基于 Linux 的服务器,以支持亚利桑那州梅萨市一个 55 岁以上房车度假村计算机实验室中运行 Microsoft Windows 操作系统的多台工作站。第一部分 介绍了我们组织的背景、Linux 系统的建立以及 iptables 防火墙的规则。本文介绍了网络功能,例如 IP 地址服务、仅缓存名称服务器、内网 Web 服务器以及使用服务器消息块 (SMB) 协议的打印和文件服务。
如前一篇文章所述,我们的计算机实验室通过 T1 线路连接到互联网,该线路与商业和销售办公室以及房车度假村的 Wi-Fi 连接共享,所有这些都共享一个 IP 地址。上游路由器处理 10.10.x.0 网络中不可路由地址的必要网络地址转换 (NAT)。在安装我们的防火墙之前,计算机实验室中的所有机器都被分配了 10.10.4.0 网络上的地址。现在,只有防火墙的外部接口属于该网络。防火墙的内部地址、打印机、实验室中的所有计算机以及临时连接到网络的任何笔记本电脑都被分配了 10.10.10.x 形式的地址。防火墙/服务器接口的固定地址为 10.10.10.1,打印机的固定地址为 10.10.10.253 和 10.10.10.254。所有其他机器都从 Linux 系统上运行的 DHCP 服务器获取其 IP 地址。为了便于维护,我更喜欢控制桌面计算机的地址。因此,我们的 DHCP 控制文件根据客户端的 MAC 地址分配固定地址。
SuSE 发行版中的 DHCP 服务器由文件 etc/dhcpd.conf 控制。下面显示了我们文件部分内容的注释列表。第一个语句定义了网络的名称。此名称已注册;但是,没有外部 DNS 条目指向此系统。因此,此处的使用是虚构的。
option domain-name "mesaregalcc.org";
下一个条目枚举了此网络的名称服务器,首先是我们的服务器的 IP 地址,该服务器缓存 DNS 条目。本文稍后将介绍此功能的配置。反斜杠 (\) 表示该命令在下一行继续。
option domain-name-servers 10.10.10.1, 198.6.1.4, 198.6.1.5, \ 198.6.1.195;
接下来,我们定义网络的网关/路由器。
option routers 10.10.10.1;
下一个节定义了网络和要使用的动态地址范围。如图所示,我们有 50 个动态分配的 IP 号码。这些地址被分配给带入计算机室并临时连接到有线网络的笔记本电脑。
subnet 10.10.10.0 netmask 255.255.255.0 { option broadcast-address 10.10.10.255; range 10.10.10.50 10.10.10.199; max-lease-time 3600; }
下一个节阻止 DHCP 服务器在外部接口上发出任何地址。上游路由器处理此功能。
subnet 10.10.4.0 netmask 255.255.255.0 { }
最后一组语句定义了工作站的固定地址,分配如下:教师的计算机的 IP 地址等于 10.10.10.200;名为 mrlab1.mesaregalcc.net 的计算机的 IP 地址为 10.10.10.201;依此类推。# 字符表示注释的开始。
group { option subnet-mask 255.255.255.0; option broadcast-address 10.10.10.255; max-lease-time 100000; # host MRLAB1 { hardware ethernet 00:0F:FE:02:C2:12; fixed-address 10.10.10.201; } ... }
如上所述,工作站客户端在尝试解析网络地址时首先联系 Linux 计算机。我们的名称服务器不尝试解析任何未知地址,而是缓存由外部名称服务器解析的地址。使用此功能有两个原因。首先,它加快了对经常访问的外部机器的名称服务。其次,SuSE 发行版配置此功能基本上无需任何更改。唯一需要更改的配置文件 /etc/named.conf 的行如下所示
# The forwarders record contains a list of servers to which unsatisfied queries # should be forwarded. Enable this line and modify the IP address to # your provider's name server. Up to three servers may be listed. # ******* This next line is the only one changed at Mesa Regal. forwarders { 198.6.1.4, 198.6.1.5, 198.6.1.195; };
计算机俱乐部的 网站 用于发布课程、会议和演示的日程安排信息。该网站的导航栏还包含指向一些热门网站的链接,包括 AOL、Juno、Hotmail 和 Yahoo 的 Web 邮件网站,以及 Google 和 Hotbot 的搜索网站。由于此网站被用作实验室中所有计算机的主页,因此每天都会被访问很多次。为了减少外部线路的带宽,已配置 Web 服务器以提供此网站的本地副本。这项工作量非常小,因为我们不使用任何 CGI 脚本,也不需要任何日志记录。
通过在本地存储 Web 内容,我们的网站管理员可以在不连接到外部网站的情况下编辑更改的内容。每天晚上,cron(Linux 版本的任务计划程序)都会启动一个脚本,该脚本生成过去 24 小时内已更改的网站文件列表。然后,它使用 wput 命令(一种使用 FTP 的间接方式)将它们传输到外部网站。为了确保对 Web 材料的受控写入访问,它存储在受密码保护的 Samba 共享中,稍后将讨论。
我使用 Apache Web 服务器作为我们内网的服务器。尽管最新版本 2.0 实现了许多新的安全功能,但我最初尝试使用最新软件失败了。我们仅使用简单的网页,并且没有安全问题,因为服务器仅从内部网络访问。因此,我正在使用较旧的 V1.3 版本。控制文件 httpd.conf 可以包含大量参数;但是,只需要少量参数来为我的系统量身定制。其中第一个是服务器类型。在 Linux 下,守护程序可以由 Internet 超级守护程序 inetd 触发,也可以作为独立程序启动。我选择了后一种选项。
ServerType standalone
要配置的下一个参数是配置、错误和日志文件的根目录。
ServerRoot "/usr/local/apache"
我们还指定了 IP 地址和端口。如果未指定此参数,则程序将侦听所有接口。但是,我明确希望排除外部接口,但使用标准端口。
Listen 10.10.10.1:80
我们还需要指定存储我们的网页的目录,以及一个 Directory 节以允许所有人访问该材料。
DocumentRoot "/home/web" <Directory "/home/web"> Order allow,deny Allow from all </Directory>
本地主页服务和仅缓存名称服务器的结合大大缩短了工作站的响应时间,并减少了外部网络上的流量。每项的好处都远远超过了设置它们所需的最小努力。
为了为 Windows 工作站提供文件和打印服务,我们使用 Samba。引用 samba.org 的话:“Samba 是一个开源/自由软件套件,它为 SMB/CIFS 客户端提供无缝的文件和打印服务。Samba 是免费提供的,与其他 SMB/CIFS 实现不同,并且允许 Linux/Unix 服务器和基于 Windows 的客户端之间的互操作性。” 使用此软件包,我们的 Linux 计算机为两台打印机和三个不同的文件共享提供打印机共享。
Samba 配置文件通常是 /etc/samba/smb.conf,它包含名为 [global] 的节中的全局参数定义。在本节中,我注释了在我们系统上定义的参数
[global] max smbd processes = 40 # one server process for each workstation workgroup = MRLAB # name reported to network browser netbios name = server # NetBIOS name reported by server security = share # needed for guest services to work hosts allow = 10.10.10.0/24 # limit to our network guest account = nobody # the guest has the privileges of this user log file = /usr/local/samba/var/log smb passwd file = /usr/local/samba/lib/smbpasswd max log size = 500 # size in kB preferred master = yes # this machine is master for net domain master = yes # we have no other domain servers deadtime = 5 # no. of minutes till connection expires server string = Samba # name in printer comment box on Windows interfaces = 10.10.10.1/24 # serve only our internal network wins support = No # no Wins name resolution show add printer wizard = yes # Wizard is shown on NT/XP/2K clients max print jobs = 20 # number of simultaneous print jobs printer admin = root # only the superuser can manipulate printers null passwords = yes # we want to have no password for some users load printers = no # do not create shares automatically printing = bsd # BSD-type printing
下一节定义了打印机驱动程序下载区域的参数。如果正确定义了此节,则可以在 Windows 客户端上安装打印机驱动程序,而无需任何其他驱动程序文件来源。
[print$] path = /usr/local/samba/drivers # the root location for the driver tree browseable = yes public = yes # accessed without password read only = yes # cannot be written write list = root # except by the superuser
[printers] 节定义了所有打印机通用的参数。
[printers] comment = All Printers path = /var/spool/samba # spool directory printer admin = root # the administrator account public = yes # no authentication needed printable = yes # spool files OK for this share use client driver = no # browsable = yes # can be browsed read only = yes
我们提供给 Windows 客户端的每台打印机都由一个单独的节定义。括号内的名称 bw_laser 是报告的名称。print command 是在收到打印作业时生成的命令。在大多数情况下,这将是对 lpr 命令的简单调用。但是,我们的系统在调用打印后台处理程序之前会执行额外的处理,如下所述。在此行中,%s 宏扩展为后台处理文件名,%I 扩展为客户端的 IP 地址。
[bw_laser] min print space = 1000 # minimum spool space in kB printable = yes # spool files OK for this share print command = /usr/local/samba/lib/process_bw %s %I
度假村规则允许房车度假村的任何居民使用计算机;但是,只有计算机俱乐部的成员才允许打印。他们的会员费用于购买纸张和打印机耗材。以前,我们无法控制任何用户可以打印的页数。结果,打印成本失控。本季,每位会员在加入时都获得了一个用户号码和密码。当收到打印作业时,为该打印机定义的命令行脚本执行以下步骤
页数通过检查 Postscript 文件中的相应行来计数。
作业中的页数和提交计算机的 IP 号码被传递给一个程序,该程序尝试与 Windows 工作站上运行的特殊服务器程序建立 TCP 连接。如果连接被拒绝,则打印作业立即被丢弃;否则,将发送用户号码和密码的请求。
一旦输入用户数据或超过超时期限,结果将传回 Linux 机器。如果密码与该用户的帐户文件条目不匹配,则程序会再次尝试。尝试三次后,将向用户发送一条合适的message,并且打印作业被中止。
一旦收到有效密码,我们就会验证作业中的页数和本季的总页数是否在限制范围内。如果任何一项测试失败,则作业将被中止。
当所有测试都通过后,打印作业将发送到打印后台处理程序,并且本季的总数将更新。即使我们本季的 100 页彩色和 1000 页黑白页的限制很宽松,身份验证过程以及与本季上限相关的心理因素也使我们的打印成本降低了 2 倍。
在上述身份验证过程中,用户号码和密码以明文形式传输。安全风险是可以接受的,因为这些密码不用于任何登录帐户。许多用户已将他们的号码和密码写在他们的姓名徽章背面,这是一个更严重的安全风险。
俱乐部规则禁止用户在 Windows 工作站上存储任何文件或安装任何新程序。这些规则通过使用一个名为 GoBack 的程序以自动还原模式运行来强制执行。每当计算机重新启动时,任何已删除的文件都会被恢复,任何已添加的文件都会被删除。
由于用户有存储文件的合理需求,因此定义了许多 Samba 文件共享。第一个是公共共享,它作为磁盘驱动器 S 安装在所有工作站上。无需任何身份验证即可从所有计算机访问此共享上的文件。当然,已警告用户不要在此位置存储任何敏感信息。下面显示了 smb.conf 中描述此共享的节
[guest] # share name path = /home/samba # path to this share public = yes # no password needed writable = yes # read/write printable = no # but not a printer share browsable = yes # can be browsed with Windows Explorer, etc.
为了存储一些需要无需密码即可访问但应分开保存的文件,定义了另一个共享,但未安装在任何工作站上。可以通过浏览“网上邻居”来访问这些文件,但是访问它们需要足够的努力,以至于它们不会被意外销毁。
[xphone] # share name path = /home/xphone # path public = yes # no password needed writable = yes # read/write printable = no # but not a printer share browsable = yes # can be browsed with Windows Explorer, etc.
为了存储我们的会员数据库和我们的网站文件,还定义了一个受密码保护的共享。它与其他共享的不同之处在于将 public 关键字设置为 no 并设置有效用户的名称。注意:Linux 用户数据库中没有 web 帐户;它仅存在于 Samba 密码系统中,该系统由一个单独的程序维护。一旦给定的工作站登录到此共享,则当它处于空闲状态五分钟后,连接将断开。此时间是在上面的全局节中定义的。此共享的身份验证已加密。
[web] # share name path = /home/web # path public = no # password needed writable = yes # read/write printable = no # not a print share browsable = yes # can be browsed valid users = web # the user for this share
所有这些 Samba 共享都没有附加任何配额。为了防止某些用户创建大量巨型文件并剥夺 Linux 内核的工作空间的可能性,已为 /home 建立了一个单独的分区,它是所有 Samba 文件共享的根目录。在我们的例子中,这个单独的分区甚至位于单独的磁盘上,但这对于其他安装可能不是必需的。
Larry Finger 从华盛顿特区卡内基科学研究所退休,目前是亚利桑那州梅萨市梅萨皇家房车度假村计算机俱乐部的志愿技术顾问。除了维护本系列文章中描述的系统外,他还合作开发了一个程序 以显示晶体结构模型。