FOSS 网络基础设施和安全/FOSS 主要网络功能
前言 — 缩略语列表 — FOSS 和 GNU/Linux 简介 — 网络概念和架构 — FOSS 主要网络功能 — FOSS 安全功能 — 网络规划 — 进一步参考 — 词汇表 — 关于作者 — 致谢 — 关于 APDIP — 关于 IOSN
DNS 是将互联网的技术方面连接到网络用户的粘合剂。简单地说,DNS 提供名称到 IP 地址的转换,反之亦然。互联网基于 IP 协议,这意味着互联网上的计算机仅通过 IP 地址知道彼此的路径。但是,大多数人不可能记住互联网上每台计算机的数字 IP 地址。这就是 DNS 派上用场的地方。
DNS 的主要目的是将名称映射到互联网上的对象。该对象可以是 IP 地址或邮件服务器、域名服务器甚至个人电话号码的标识。毕竟,与数字相比,名称更容易记忆。
早期版本的 DNS 是一个名为 hosts.txt 的文件,该文件在 1970 年代 ARPANET[1] 的早期由斯坦福研究院网络信息中心 (SRI-NIC) 手动维护。这个 hosts.txt 文件在一个计算机上更新,并由世界各地的计算机拉取。虽然这种方法在一段时间内有效,但当更多主机添加到网络时,名称冲突变得迫在眉睫。平面单文件映射根本无法扩展。因此,创建了 DNS。它在 RFC 1034 和 1035 中定义。
DNS 包含三个组件
- DNS 命名空间 - 域名;
- DNS 服务器 - 托管命名空间的服务器;以及
- 解析器 - 使用服务器的客户端。
这三个组件协同工作以创建可行的名称解析解决方案。DNS 的设计方式是,所有数据都保存在本地,但可以在全球范围内检索。数据分布在不同的域名服务器之间,没有一台计算机拥有所有数据。数据在内部始终保持一致,从而提供稳定的系统。此外,DNS 的设计方式允许任何设备将 DNS 查询发送到服务器。
DNS 命名空间是一个概念。名称是对地址、对象和物理存在的引用,这些引用构成了人类可理解的参考,用于标识端点。DNS 命名空间是为 DNS 定义的命名空间。在互联网上,域名为 DNS 命名空间提供层次结构,因此,互联网地址的标识方式是有序的。
让我们举一个比较的例子。如果有人要给我寄一封信,它将被寄到
- Gaurab Raj Upadhaya
- 205/8 Sahayogi Marg, Kathmandu, Nepal
在这个例子中,地址提供了一种方式,使信件可以从世界任何地方寄给我。同样,如果有人要给我发一封电子邮件,他们可以使用以下任一电子邮件地址
在这两种情况下,虽然电子邮件最终都到了同一个邮箱,但它们到达该地址的方式却不同。需要理解的是,使电子邮件起作用的域名层次结构。它是 DNS 命名空间的一部分。域名是 DNS 命名空间的实现。域名系统使用倒置的树状结构。DNS 树的顶层称为“根”。[2] “根”用“.”(点)引用。紧邻“根”下方的是国家代码顶级域名 (ccTLD) 和全球顶级域名 (gTLD)。这两个顶层是在全球范围内预定义和固定的。ccTLD 按照 ISO 3166 标准分配。gTLD 由互联网名称与数字地址分配机构 (ICANN) 决定。ccTLD 的示例包括 .np、.in、.my、.uk、.se 等。ccTLD 始终是两位字母代码。gTLD 的示例包括 .com、.org、.net、.gov、.edu、.mil、.info、.name 和 .aero。
顶级域名(TLD)之下是用户级空间,通常称为域名。例如,.net 下的所有内容都在 .net 域中,而 .uk 下的所有内容都在英国域中。同理,lahai.com 下的子域名,例如 evo.lahai.com,就属于 lahai.com 域。
在顶级域名下创建的每个域名都称为子域名。因此,在上面的例子中,evo.lahai.com 是 lahai.com 的子域名。
区域和委派
[edit | edit source]从计算机的角度来看,每个 DNS 命名空间都由其区域文件反映,也称为“管理命名空间”。名称服务器上的每个域名或子域名都有自己的区域文件,它是提供映射的主要文件。
DNS 的可扩展性在于它能够将子域名的委派定义到其他服务器和其他区域文件。因此,根区域文件将 ccTLD 和 gTLD 功能委派给各自的服务器,而每个 ccTLD 或 gTLD 服务器进一步将其特定的域名信息委派给其注册所有者。因此,实际的名称到对象映射将仅由该域的权威区域提供。这个过程可以比作父母将权力委派给他们的孩子。
名称服务器
[edit | edit source]名称服务器托管 DNS 区域文件。它们回答指向它们的查询。名称服务器有两种类型。
- 权威名称服务器
- 主服务器
- 从服务器
- 非权威名称服务器
- 缓存名称服务器
- 缓存转发器
大多数实现是两种或多种类型的组合。
权威名称服务器
[edit | edit source]权威名称服务器托管指定域的主区域文件。名称服务器的权威性基于来自顶级域的委派。因此,任何服务器要成为 evo.lahai.com 域的权威服务器,它必须在 lahai.com 区域文件中进行委派。
主文件是托管主文件的地方。从服务器从主服务器镜像文件。一个主服务器可以有多个从服务器。单个主服务器可以支持超过 2000 万个名称,但实际上这样做可能不是一个好主意。不同的 DNS 服务器软件能够处理大量的 DNS 查询。一个常用的例子是每秒 30 万次查询。数据库主副本的变化会立即复制到从服务器,或者根据管理员设置的时间安排复制。
递归名称服务器
[edit | edit source]递归名称服务器不是它提供数据的每个域的权威服务器。它代表其他客户端执行操作,并在其内存中缓存结果。如果在预定义的时间段内发送相同的查询,那么它会从缓存中提供数据,而不是搜索整个 DNS 结构。对于缓存转发器,服务器使用另一个 DNS 服务器来获取结果。当数据被转发到客户端时,它们会被标记为非权威数据。
混合实现
[edit | edit source]在较小的组织中,单个名称服务器可以用于多种目的。一个服务器可以成为几个特定域的权威服务器,但它也可以作为其他域的非权威缓存服务器。由于最近出现的 DNS 缓存中毒事件,强烈建议不要将同一台服务器用于权威和缓存功能。
解析器
[edit | edit source]解析器是向服务器请求 DNS 数据的客户端。解析器通常在操作系统级别以库的形式实现,以便多个应用程序可以使用它。
DNS 安全性
[edit | edit source]互联网的一个重要优势是用户能够使用名称访问正确的服务器和系统。配置错误的 DNS 或格式错误的 DNS 查询会阻止用户使用;因此,需要一个安全的 DNS 系统。遵循以下简单要点非常重要
- 只允许授权系统从主服务器进行区域传输。
- 至少要有两个 DNS 服务器,并且记住不要将它们放在同一个位置。
- 确保你的正向和反向 DNS 信息一致。
- 遵循当前的 DNS 实施最佳实践。
使用 BIND 进行 DNS
[edit | edit source]BIND 是 DNS 协议的实现。它提供了域名系统主要组件的公开可重新分发的参考实现,包括
- DNS 服务器 (named);
- DNS 解析器库;以及
- 用于验证 DNS 服务器正常运行的工具。
BIND DNS 服务器被用于互联网上绝大多数的名称服务机器,因为它提供了一个健壮且稳定的架构,组织的命名架构可以建立在这个架构之上。BIND 分发版中包含的解析器库提供了域名和互联网地址之间转换的标准接口,旨在与需要名称服务的应用程序链接。
获取和安装 BIND
[edit | edit source]BIND 通常在大多数 GNU/Linux 发行版中默认安装。否则,你始终可以从 BIND 主页获取副本:http://www.isc.org/products/BIND/。BIND 在不同 GNU/Linux 发行版中的安装过程可能不同。最好遵循发行版指南进行安装。
BIND 的配置
[edit | edit source]BIND 配置必须分三个阶段进行。
首先,需要配置客户端或解析器库,然后配置服务器本身,最后配置工具。
解析器配置
[edit | edit source]解析器是 DNS 系统的客户端。即使你没有在计算机上运行 DNS 服务器,你也需要安装解析器。自然,为了配置 BIND,你首先需要配置解析器库。这可以通过配置以下文件来完成
- /etc/host.conf
该文件指定如何执行主机名解析。它已经过时,但较旧的安装程序可能仍在使用它。
- /etc/nsswitch.conf
该文件已取代 host.conf。它指定名称解析发生的顺序。它告诉计算机尝试将名称转换为 IP 地址的顺序。
- # /etc/nsswitch.conf
任何以 # 号开头的行都是注释。
'#' 在此示例中,主机通过 DNS 解析,然后从文件解析。
- hosts: dns files
'#' 仅文件用于网络名称解析
- networks: files
安装期间创建的默认文件通常就足够了。
- /etc/resolv.conf
resolv.conf 是基本的 DNS 配置文件,它指定 DNS 服务器和域名。这里三个关键词是“domain”、“search”和“nameserver”。
# /etc/resolv.conf
# Our domain
domain gaurab.org.np
# Default search domains in order of priority
search gaurab.org.np lahai.com.np
#
# We use the local server as the first name server.
nameserver 127.0.0.1
# we have second name server at up stream provider.
nameserver 206.220.231.1
该文件也是在安装期间创建的,如果你的网络配置没有改变,你可以保持它不变。
服务器配置
[edit | edit source]‘named’ 是最著名的 FOSS DNS 守护进程。守护进程是一种在服务器上作为服务持续运行的软件程序。因此,DNS 服务器通常被称为“名称守护进程”或简称为“named”。DNS 服务器的文件名也是“named”。
对于 BIND 版本 4.x.x,named 使用配置文件 /etc/named.boot。但在 BIND 的更高版本(8.x.x)中,配置文件是 /etc/named.conf。
出于我们的目的,我们使用 /etc/named.conf。在以下示例中,指定了 lahai.com 和 gaurab.org.np 域的主 DNS。还显示了 wlink.com.np 域的从属 DNS。
//
// /etc/named.conf file for ns.lahai.com
// in this file ‘//’ is the comment.
// you specify the default data directory for DNS. Now all DNS
// related files should go into /var/named or any other
// directory as specified.
options {
directory “/var/named”;
};
// First you need to add the DNS root zone file name. It’s there
// by default.
zone “.” {
type hint;
file “named.ca”;
};
// Now we are specifying a master domain called lahai.com
// whose information is stored in the file ‘named.lahai.com’
zone “lahai.com” {
type master;
file «named.lahai.com»;
};
// the whole thing can also be done in a single line.
zone “gaurab.org.np” { type master; file “named.gaurab.org.np”;};
// Now this server is also a slave for another domain “wlink.com.np’
zone “wlink.com.np” { type slave; masters { 202.79.32.33; };
file “slave/named.wlink.com.np”; };
zone “0.0.127.in-addr.arpa” { type master; file “named.local”; }
该文件为添加有关主机名和 IP 地址的实际数据奠定了基础。/etc/named.conf 文件可以接受许多其他配置指令,但这里不会讨论这些指令。
在 named.conf 文件中进行相关条目后,有必要为相应的域创建主机名记录。所有文件都应放置在 named.conf 文件中 directory 指令指定的目录中。
named.local 文件为环回接口或环回地址使用的 127.0.0.0 网络提供反向区域查找。默认文件应保持不变。named.ca 为 DNS 服务器提供根服务器信息。默认情况下不应编辑。现在让我们来看一个 lahai.com 域的示例 DNS 文件(named.lahai.com)
; file /var/named/named.lahai.com
@ IN SOA ns.lahai.com. gaurab.lahai.com. (
2004050801 ; serial number
86400 ; refresh: once per day (1D)
3600 ; retry: one hour (1H)
3600000 ; expire: 42 days (6W)
604800 ; minimum: 1 week (1W)
)
# we are specifying three Name servers.
IN NS ns.lahai.com.
IN NS a.ns.hopcount.ca.
IN NS ns1.lahai.com.
# local mail is distributed on another server
IN MX 10 mail.lahai.com.
IN MX 20 ns.lahai.com.
; loopback address
localhost. IN A 127.0.0.1
# The glue records so that the NS records can resolve.
ns IN A 204.61.208.110
ns1 IN A 202.79.55.14
# main DNS entry
www IN A 207.189.222.2
mail IN A 202.51.76.8
# Aliases for the www machine.
tftp IN CNAME www
以上文件是“lahai.com”域的主文件。如果要添加“lahai.com”域的额外名称,例如 pop3.lahai.com 和 smtp.lahai.com,则应在上述文件中添加它们。
此文件中列出名称服务器的顺序使它们成为主服务器和从属服务器。第一个 NS 始终为主服务器,另外两个是从属服务器。每次更新主服务器时,它都可以自动向文件中列出的其他 NS 服务器发送通知。此参数可以在 named.conf 文件中配置。
关于反向 DNS 的说明
[edit | edit source]大多数与 DNS 相关的错误通常是由于反向 DNS 配置错误造成的。反向 DNS 是将数字映射到名称,或者说是正向名称解析的相反操作。许多应用程序使用此功能来验证网络源 IP 地址是否有效。一个常见的例子是 SPAM 或未经请求的商业电子邮件(垃圾邮件)预防软件,它可能拒绝接受来自未配置反向 DNS 的任何域的邮件。
反向 DNS 通过从区域互联网注册机构 (RIR) 之一委托特定组的 IP 地址来实现,在亚太地区是亚太网络信息中心 (APNIC) (http://www.apnic.net)。由于互联网服务提供商 (ISP) 通常是 APNIC 成员,因此他们负责为他们及其客户使用的 IP 地址配置适当的反向 DNS。
由于每台计算机都有自己的环回接口以及与其关联的 IP 地址,因此 BIND 附带了named.local 文件的默认安装,该文件是 127.0.0.0 网络的反向 DNS。此文件如下所示
; /var/named/named.local
$TTL 86400
@ IN SOA localhost. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS localhost.
1 IN PTR localhost.
管理 BIND DNS
[edit | edit source]BIND 包含一个名为rndc 的实用程序,它允许您使用命令行语句在本地或远程管理 named 守护进程。rndc 程序使用‘/etc/rndc.conf’文件进行其配置选项,这些选项可以用命令行选项覆盖。
在您可以使用 rndc 之前,您需要将以下内容添加到您的 named.conf 文件中
/etc/named.conf
controls {
inet 127.0.0.1 allow { localhost; } keys { <key-name>; };
};
key “<key-name>” {
algorithm hmac-md5;
secret “<key-value>”;
};
在这种情况下,<key-value> 是一个 HMAC-MD57[3] 密钥。您可以使用以下命令生成自己的 HMAC-MD5 密钥
- dnssec-keygen -a hmac-md5 -b <bit-length> -n HOST <key-file-name>
建议使用至少 256 位长度的密钥。应该放置在 <keyvalue> 区域中的实际密钥可以在 <key-file-name> 中找到。
配置文件 /etc/rndc.conf
options {
default-server localhost;
default-key “<key-name>”;
};
server localhost {
key “<key-name>”;
};
key “<key-name>” {
algorithm hmac-md5;
secret “<key-value>”;
};
<key-name> 和 <key-value> 应与它们在 /etc/named.conf 中的设置完全相同。
要测试所有设置,请尝试 rndc reload 命令。您应该看到类似于以下内容的响应
- rndc: reload command successful
您还可以使用 rndc reload 来重新加载对 DNS 文件所做的任何更改。
DNS 工具
[edit | edit source]有两个常用的工具来测试 DNS:nslookup 和dig。Nslookup 是两者中较旧的一个,不太受欢迎。您可以使用dig 实用程序来测试 DNS 服务。在大多数 Unix 和类 Unix 系统上使用命令‘man dig’可以访问相关的联机帮助页。
邮件服务器
[edit | edit source]互联网和电子邮件在互联网的早期被认为是同义词。即使在今天,超过四分之一的互联网总流量仍然是电子邮件,FOSS 统治电子邮件世界也就不足为奇了。在互联网上,电子邮件通过简单邮件传输协议 (SMTP) 工作,该协议在RFC 2821 中定义。SMTP 是一种非常简单的协议,旨在使邮件服务器之间的电子邮件传输尽可能容易。
SMTP 以纯文本形式工作,并在邮件服务器之间进行通信,邮件服务器也称为邮件传输代理或 MTA。“sendmail”是最流行的邮件服务器软件。其他示例包括 exim、qmail 和 postfix。闭源替代方案是 Lotus Notes 和 Microsoft Exchange。
FOSS 的魅力在于可用的软件复杂性。虽然 exim 和 postfix 的占用空间更小,并且在服务器上消耗的内存更少,但 sendmail 是一款运行着世界上最繁忙邮件服务器的复杂软件。
FOSS 邮件服务器的另一个重要优势是软件的模块化。Sendmail 本身提供了大量的扩展和包含模块的条款。这使得开发人员可以更轻松地扩展软件以满足其内部需求。如果您需要为您的电子邮件服务器开发一个扩展来自动处理不同类型的电子邮件,FOSS 是一个更好的选择。
其他与邮件相关的协议
[edit | edit source]两个主要的与邮件相关的协议是邮局协议 (POP) 和互联网邮件访问协议 (IMAP)。这些协议为用户提供最终用户功能。POP 和 IMAP 由电子邮件软件用于访问存储在服务器上的电子邮件。因此,如果您使用电子邮件客户端(如 Eudora 或 Thunderbird),那么它将使用 POP 或 IMAP 从您的邮件服务器将电子邮件拉取到本地计算机。
处理垃圾邮件
[edit | edit source]未经请求的商业电子邮件 (UCE) 或垃圾邮件对于所有服务提供商来说都是一个日益严重的问题。现在,大多数邮件服务器软件至少都具有最低限度的反垃圾邮件功能。
传入垃圾邮件
[edit | edit source]Spam Assassin 是一种流行的软件,用于过滤传入的垃圾邮件。它可以被调用用于单个用户或整个系统,并提供配置一组复杂规则来检测和删除传入垃圾邮件的能力。
阻止传出垃圾邮件
[edit | edit source]提供商也有义务不让他们网络被垃圾邮件发送者用来发送邮件。允许开放中继的配置错误的邮件服务器是垃圾邮件的最大来源之一。越来越多的邮件服务器被配置为默认情况下不开放中继。感染病毒的计算机也是垃圾邮件的另一个来源。
FOSS 最大的优势之一是其可扩展性。邮件服务器中提供的反垃圾邮件功能最能体现这一点。如今,几乎 80% 的电子邮件被认为是 UCE,通常被称为垃圾邮件或简称为垃圾邮件。UCE 不仅消耗大量带宽和网络资源,而且还会给用户带来困扰并降低组织的生产力。
当今最好的反垃圾邮件工具都是 FOSS。为了阻止垃圾邮件,必须确定其来源,而还有什么比成千上万的用户共同识别垃圾邮件发送者更好的方法呢?FOSS 概念确保每个垃圾邮件都不会被漏报,以便轻松识别来源。
一种常见的反垃圾邮件技术是使用实时黑名单或 RBL。不同的 RBL 列出了已知是大量垃圾邮件来源的网络的 IP 地址。同样,这些列表的开放性以及 Spam Assassin 等软件使得更容易根据用户的自身需求调整软件。
例如,在企业环境中,用户需要使用大写字母发送电子邮件,因为这是他们工作性质决定的。现在,如果整封电子邮件都用大写字母写成,大多数反垃圾邮件工具都会将其识别为垃圾邮件。但是,如果使用 FOSS 解决方案,我们可以修改代码并删除针对网络内部发出的邮件的这一标准。
Sendmail 是 Linux 下可用的 SMTP 服务器之一。它也是最古老的开源软件之一,被广泛使用。许多人认为 sendmail 太复杂,难以使用。Sendmail 有其优点和缺点。由于它具有许多功能,因此它是一个复杂的软件。但是,与此同时,sendmail 的基本操作可以轻松管理。
Sendmail 配置通过直接编辑 sendmail 配置文件(不推荐)或使用 M4 宏语言从一组变量创建新的配置文件来处理。
现在我们将处理 sendmail。以下是默认 sendmail 安装所需的最小更改。
许多发行版中软件的默认安装仅限于邮件服务器仅在回环地址上监听,[4] 即服务器无法通过网络访问。要使 sendmail 可从网络访问,您需要编辑 /etc/mail/sendmail.mc 文件中的相应行。您应该编辑以从以下行中删除 127.0.0.1
- DAEMON_OPTIONS (‘Port=smtp, Name=MTA’)
之后,您需要运行 m4 宏以创建新的 sendmail 配置文件
[root@mail /etc/mail]# m4 sendmail.mc > sendmail.cf
[root@mail /etc/mail]# service sendmail restart
这应该会为 sendmail 守护程序启用网络可访问性。sendmail.mc 文件中还有许多其他选项可以尝试。
编辑 /etc/mail/local-host-names 并添加您的站点使用的所有域名和域名别名。
# local-hosts-names -
# include all aliases for your machine here.
lahai.com
gaurab.org.np
ns.lahai.com
# some examples
mail.you.com
yoursite1.com
mail.yoursite1.com
yoursite2.com
mail.yoursite2.com
yoursite3.com
mail.yoursite3.com
这些是必要的,以便 sendmail 接受这些域名的邮件。
但是,上述配置并不能完全解决虚拟域名用户的问题。为此,请使用 virtusertable 功能。转到 /etc/mail/virtusertable
# /etc/mail/virtusertable
#virtual e-mail address real username
[email protected] user1_yoursite1
# for domain pop, i.e, all e-mail in a domain into a single account
@yoursite2.com yoursite2
请确保在进行更改后重新启动 sendmail 守护程序。
- [root@mail /etc/mail]# service sendmail restart
Sendmail 通过 /etc/mail/access 文件提供访问控制功能。
# /etc/mail/access
[email protected] REJECT
aol.com REJECT
207.46.131.30 REJECT
[email protected] OK
linux.org.np RELAY
192.0.2. OK
OK - 接受邮件。RELAY - 即使邮件不是发往我们的主机,也接受来自此主机或用户的邮件;也就是说,接受来自此主机的其他主机的中继邮件。REJECT - 以通用消息拒绝邮件。
要求您允许您自己的网络 RELAY。否则,网络上使用服务器作为其传出 SMTP 服务器的计算机将无法发送电子邮件。
该脚本位于 /etc/rc.d/init.d/sendmail,并在计算机启动时自动启动。您也可以使用其他命令启动它
[root@mail /etc/mail]# /etc/init.d/sendmail start
[root@mail /etc/mail]# service sendmail restart
从安全角度来看,最好让 sendmail 从 xinetd.conf 运行,而不是作为独立的守护程序运行。为此,我们需要将其添加到 /etc/xinetd.d 目录中,并将其从 /etc/rc.d/init.d 中删除,然后将 sendmail 队列处理添加到 cron 中。以下是您需要执行的操作
1. 使用 xinetd 时,在 /etc/xinetd.d/ 中创建一个类似于 sendmail 的文件
default: on
service sendmail
{
socket_type = stream
wait = no
user = root
server = /usr/bin/sendmail -bs
}
2. 编辑 /etc/rc.d/init.d/sendmail,使其在最开始的某个位置有 exit 0(这可能不是最好的方法,因此请确保记录对这些文件的更改),以便此文件除了启动 sendmail 之外不做任何操作。
3. 通过编辑您的(root 的)crontab9(要编辑,请使用 crontab -e),添加类似于以下内容的行
- */20 * * * * /usr/sbin/sendmail -q
这将每 20 分钟(如果存在)处理一次 sendmail 队列。
其他流行的邮件服务器是 postfix、exim 和 qmail。虽然 postfix 是某些 Linux 发行版的默认安装,但许多小型服务提供商采用了 exim,因为它简单、健壮。Exim 还内置了强大的反垃圾邮件功能。
FOSS 在 Web 服务器市场的主导地位是众所周知的。Apache Web 服务器是互联网上进行的 Web 服务器调查中无可争议的领导者。它还有许多优势:它是第一个引入基于名称的虚拟主机的领导者,并且是第一个真正模块化的 Web 服务器,可以与数据库服务器无缝协作。它还具有完全内置的身份验证、授权和访问控制功能,以及脚本支持。
最新的调查统计数据可在 http://news.netcraft.com/archives/web_server_survey.html 找到
Apache 还与 OpenSSL 完全集成,OpenSSL 提供安全套接字层,[5] 从而能够将 Apache Web 服务器用于电子商务和安全交易。而且,最棒的是,它可以通过基于文本的配置文件(httpd.conf)进行完全配置。
配置 Apache 相当容易,除非您想在 Web 服务器上运行复杂的软件。默认情况下,配置文件通常位于“/etc/httpd/conf”中。其他配置文件位于“/etc/httpd”中。Apache 也通常安装在“/usr/local/apache”中。
Apache 的主要配置文件是 httpd.conf。Apache 通常可以开箱即用。
指令是定义 Apache 实际运行方式、文件在服务器上的位置、Apache 可以使用多少机器资源、允许访问者查看哪些内容、服务器可以处理多少个并发访问者以及其他参数的设置。
让我们看看主要指令
- /etc/httpd/conf/httpd.conf – 主配置文件
服务器标识
- ServerName:构建自引用 URL
- ServerAdmin:服务器管理员的电子邮件,显示在错误消息中
- 文件位置
- DocumentRoot - 网站静态内容所在的位置
- ServerRoot – 用于不以斜杠“/”开头的文件的相对位置
- ErrorLog – 用于记录服务器范围内的错误消息
- PidFile – 包含 httpd 进程的进程 ID
- Alias – 用于在 DocumentRoot 之外提供文件
- ScriptAlias – CGI 脚本(动态内容生成器)的位置
- DirectoryIndex - 指定的文件默认显示
- Userdir – 用于从用户主目录中的 public_html 目录提供文件,例如 http://www.site.com/~user
- 进程创建
- MaxClients – 允许来自客户端的并发连接数
- 服务器池调节 - 在 UNIX 下,Apache 是多进程的;它平衡了生成子进程所需的开销与系统资源。您可以更改诸如 MinSpareServers、MaxSpareServers、StartServers、MaxClients 等设置以微调服务器的性能。
- User、Group – 设置 Apache 子进程的权限
- 网络配置
- BindAddress - 将服务器限制为监听单个 IP 地址
- Listen - 指定多个 IP 地址和/或端口
- KeepAlive - HTTP 的扩展,提供持久连接
- Port – Web 服务器运行的 TCP 端口号;可以更改为未使用的端口
- URL 重定向
- 将请求重定向到另一个 URL Redirect permanent /foo/ http://www.example.com/bar/
虚拟主机是在一台物理机器上维护多个 Web 服务器名称的做法。例如,同一台物理机器可以同时托管 http://www.apdip.net 和 http://www.iosn.net。
参数特定于虚拟主机,它会覆盖一些主要的服务器配置默认值。虚拟主机可以分为两种类型:基于 IP 的和基于名称的。
在基于 IP 的虚拟主机中,连接的 IP 地址用于确定要服务的正确虚拟主机。这种方法要求每个虚拟主机都有一个单独的 IP 地址。在基于名称的虚拟主机中,主机名作为 HTTP 标头的一部分发送,这意味着许多不同的主机可以共享同一个 IP 地址。但是,您需要在 DNS 中将每个主机映射到 IP 地址。这缓解了对稀缺 IP 地址的需求。基于名称的虚拟主机不能与 SSL 安全服务器一起使用,并且较旧的软件可能不兼容。
- NameVirtualHost – 指定要监听的 IP 地址和端口号(可选)
- <VirtualHost> – 与 NameVirtualHost 相同的参数
- ServerName – 指定要服务的哪个主机
- DocumentRoot – 文件系统中该主机的内容所在的位置
- ServerAlias – 使主机可以通过多个名称访问
以下是一个示例。
NameVirtualHost *
<VirtualHost *>
ServerName www.domain.tld
DocumentRoot /www/domain
</VirtualHost>
<VirtualHost *>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
serverAlias otherdomain.tld *.otherdomain.tld
</VirtualHost>
如果找不到匹配的虚拟主机,则将使用第一个与 IP 地址匹配的虚拟主机。所有其他标准 Apache 指令都可以在虚拟主机指令内部使用。
.htaccess 文件是一个包含 Apache 指令的文本文件
AccessFileName .htaccess …在 httpd.conf 中
.htaccess 文件内容
AuthName “restricted stuff”
AuthType Basic
AuthUserFile /usr/local/etc/httpd/htusers
AuthGroupFile /usr/local/httpd/htgroup
require valid-user
require group staff
require user lahai gaurab
AuthName “restrict posting”
AuthType Basic
AuthUserFile /usr/local/etc/httpd/htusers
AuthGroupFile /usr/local/httpd/htgroup
<Limit POST>
require group admin
</Limit>
htpasswd – 用于管理用户以进行访问控制
htpasswd -c /usr/local/etc/httpd/users martin
htpasswd /usr/local/etc/httpd/users ritesh
/usr/local/etc/httpd/htusers contents:
martin:WrU808BHQai36
jane:iABCQFQs40E8M
art:FAdHN3W753sSU
/usr/local/httpd/htgroup contents:
staff:martin jane
admin:lahai gaurab
与邮件服务器和 Web 服务器一样,FOSS 也在代理和缓存服务器领域树立了标准。Squid 是网络世界中代理服务的代名词。它是一个高度模块化、高性能的代理和 Web 缓存服务器。Squid 网站是 http://www.squid-cache.org。Squid 代理缓存可以集群以提供更好的速度和访问。Squid 缓存也是最早实现分层缓存系统的缓存系统之一。
Squid 的一些优势
- 面向 Web 客户端的高性能代理缓存服务器
- 一个功能齐全的 Web 代理缓存
- 设计用于在 UNIX 系统上运行
- 免费的开源软件
- 在单个无阻塞 I/O 驱动进程中处理所有请求
- 将元数据和特别是热门对象缓存在 RAM 中
- 缓存 DNS 查找
- 实现对失败请求的负面缓存
- 支持 SSL、广泛的访问控制和完整的请求日志记录
- 使用 ICP,缓存可以以层次结构或网状结构排列,以实现额外的带宽节省
Squid 包含
- 主服务器程序 Squid
- 用于更快 DNS 查找的 DNS 查找程序 dnsserver
- 用于重写请求和执行身份验证的可选程序
- 一些管理和客户端工具
- 默认配置文件拒绝所有客户端请求
- 配置为仅允许访问受信任的主机和/或用户
- 仔细设计您的访问控制方案
- 不时检查它以确保它按预期工作
- 如果代理允许来自不受信任的主机或用户的访问,人们会滥用它
- 使其浏览匿名
- 故意使用您的代理进行可能是非法的交易
- 存在列出开放访问 HTTP 代理的网站
以下是一个 Squid 配置的示例:要运行基本的 Squid,唯一可配置的是代理端口。默认的 Squid 代理端口是 3128,但您可以随时更改它。
Network options
http_port port Hostname: port
Squid 以其复杂的访问控制系统而闻名。您可以不仅根据 IP 地址,而且根据域名来允许和限制访问。使用正则表达式可以让您为通过代理服务器的访问创建复杂的规则。对于 Squid 中的访问控制,使用了一个类似于路由器中使用的复杂访问控制系统。它基本上是一个两步过程
- 使用 acl 命令定义列出的访问权限;以及
- 根据之前创建的访问列表允许或拒绝访问。
i. acl 用于定义访问列表。 'acl' 的字面意思是访问控制列表。 默认的 ACL 是
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 80 21 443 563 70 210 1025-65535
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
ii. http_access - 用于控制客户端对 http 的访问 如果没有“access”行,则默认允许请求。
Default
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all
“deny all”行非常重要。
{{TextBox|示例
- 限制来自 192.168.2/24 的 IP 在工作时间(周一至周五上午 9 点至下午 5 点)访问
acl ip_acl src 192.168.2/24
acl time_acl time M T W H F 9:00-17:00
http_access allow ip_acl time_acl
http_access deny all
- 规则从上到下读取
acl xyz src 172.161.163.86
acl morning time 06:00-11:00
acl lunch time 14:00-14:30
http_access allow xyz morning
http_access deny xyz
http_access allow xyz lunch
- 小心允许子网的顺序
acl mynetwork src 10.0.0.0/255.0.0.0
acl servernet src 10.0.1.0/255.255.255.0
http_access deny servernet
http_access allow mynet
- Always_direct 和 never_direct 标签
# always go direct to local machines
always_direct allow my-iplist-1
always_direct allow my-iplist-2
# never go direct to other hosts
never_direct allow all
在所有 http_access 规则之后,如果访问没有被拒绝,则允许访问。
如果“http_access”行都没有匹配,则默认值与列表中的最后一行相反。
建议在访问列表的末尾添加“deny all”或“allow all”条目。
iii. cache_dir: 存储缓存数据的目录
- cache_dir /usr/local/squid/cache/ 100 16 256
可以支持多个挂载点的多个磁盘
cache_dir /usr/local/squid/cache1/ 10000 16 256
cache_dir /usr/local/squid/cache2/ 20000 16 256
iv. cache_mgr: 缓存管理员的电子邮件地址
附加到返回给用户的错误页面末尾
- cache_effective_user squid
- cache_effective_group squid
- 在绑定到传入网络端口后更改用户和组 ID
- 网络端口
- ftp_user: 设置用于 FTP 代理的电子邮件地址
客户端: 连接到缓存并请求页面,并打印出有用的计时信息 v. Squid 日志
/usr/local/squid/logs/cache.log
/usr/local/squid/logs/access.log
这会获取适当的数据包,缓存请求并解决缓存最大的问题,即以透明的方式让用户使用缓存服务器。 需要考虑四个因素
- 正确的网络布局 - 所有网络流量都需要通过过滤设备
- 过滤: 过滤掉适当的数据包
- 内核透明度: 将端口 80 连接重定向到 Squid
- Squid 设置: Squid 需要知道它应该以透明模式运行
有关如何实现透明代理的详细说明,请访问 http://www.linuxdoc.org/HOWTO/mini/TransparentProxy.html。