本节书摘来自异步社区《Linux防火墙(第4版)》一书中的第2章,第2.5节,作者:【美】Steve Suehring(史蒂夫 苏哈林)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.5 过滤传出数据包
如果您的环境代表了一个可信赖的环境,那么过滤传出数据包可能看上去并不像过滤传入数据包那样重要。您的系统不会对无法穿过防火墙的消息进行响应。住宅站点通常采用这种方式。然而,哪怕是对住宅站点来说,对称的过滤也很重要,尤其是当防火墙保护着运行微软公司Windows系统的计算机。对于商用站点来说,传出过滤的重要性是毫无争议的。
如果您的防火墙保护着由微软公司Windows系统构成的局域网,那么控制传出流量将变得更加重要。被盗用的Windows计算机已在历史上(并将继续)被用于协助DoS攻击和其他对外部的攻击。特别是基于这个原因,对离开您的网络的数据包进行过滤是十分重要的。
过滤传出消息也能够让您运行局域网服务而不致将它泄漏到互联网中,这些数据包不属于那里。这不仅仅是禁止外部访问本地局域网服务的问题。也是不要将本地系统的信息广播到互联网的问题。例子是如果您在运行着本地的DHCPD、NTP、SMB或者其他用于内部的服务。其他令人讨厌的服务可能在广播wall或syslogd消息。
一个相关的源头是某些个人电脑软件,它们有时会忽略互联网服务端口协议和保留的分配。这相当于一个连接到互联网的计算机上运行着面向局域网使用而设计的程序。
最后的原因就是简单地保持本地的流量本地化,那些不应离开局域网但却可以这样做的流量。保持本地流量本地化从安全角度来说是一个好主意,但也是保护带宽的一种手段。
2.5.1 本地源地址过滤
基于源地址进行传出数据包过滤是容易的。对于小型站点或连接到互联网的单一计算机来说,源地址总是您计算机正常使用时的IP地址。没有原因应允许一个拥有其他源地址的传出数据包传出,防火墙应该阻止它。
对于那些IP地址由他们的ISP动态分配的人来说,在地址分配阶段存在短暂的异常。这个异常针对DHCP,主机广播消息时使用0.0.0.0作为它的源地址。
对于那些在局域网中,而防火墙计算机使用动态分配的IP地址的人来说,限制传出数据包包含防火墙计算机源地址的行为是强制性的。它能避免许多常见的配置错误,这些错误对于远程主机来说像是源地址欺骗或非法源地址。
如果您的用户或他们的软件不是100%值得信赖的,那么保证本地流量仅包含合法的、本地地址是很重要的,它能避免被用来作为源地址欺骗参与到DoS攻击中。
最后的一点尤其重要。RFC 2827,“Network Ingress Filtering:Defeating Denial of Service AttacksWhich Employ IP Source Address Spoofing”(更新的RFC 3704,“Ingress Filtering for Multihomed Networks”)是讨论这一点的当前的“最佳实践”。理想情况下,每个路由器都应过滤明显非法的源地址并保证离开本地网络的流量仅包含属于本地网络的可路由的源地址。
2.5.2 远程目的地址过滤
同传入数据包过滤一样,您可能想要只允许特定种类的寻址到特定远程网络或个人计算机的传出数据包通过。这种情况下,防火墙规则将定义特定的IP地址或一个有限目的IP地址的范围,仅有这些数据包能够被允许通过。
第一类由目的地址过滤的传出数据包是去往您所联系的远程服务器的数据包。尽管有些数据包,例如那些发往Web或FTP服务器的,可能去往互联网的任何角落,但其他远程服务只会由您的ISP或特定的受信任的主机合法地提供。可能仅由您的ISP提供的服务的例子是邮件服务(例如SMTP或POP3)、DNS服务、DHCP动态IP地址分配和Usenet新闻服务。
第二类由目的地址过滤的传出数据包是发往远程客户端的数据包,这些客户端访问您的站点提供的服务。再次的,尽管一些传出服务连接,例如从您本地Web服务发出的响应可能会到达任何地方,但其他本地服务只会向一少部分受信任的远程站点或朋友们提供。受限制的本地服务的例子是:telnet、SSH、基于Samba的服务、通过portmap访问的RPC服务。防火墙规则不仅拒绝针对这些服务的到来的连接,而且会拒绝从这些服务向任何人传出的响应。
2.5.3 本地源端口过滤
“显式地定义您网络中的哪个服务端口能够被用于传出连接”有两个目的:一个是针对您的客户端程序,另一个则是针对您的服务器程序。指定您传出连接允许的源端口有助于保证您的程序正确地工作,它也能保护其他人使其不受任何不应传递至互联网的本地网络流量的影响。
从您的本地客户端发起的传出连接将总是从非特权源端口号发出。在防火墙规则中将您的客户端限制为非特权端口有助于通过保证您的客户端程序按预期运行以保护其他人免受您这端存在的潜在的错误的影响。
从您的本地服务器程序发出的传出数据包将总是从分配给它们的服务端口号发出,并且只响应接收到的请求。“在防火墙层次里限制您的服务器仅使用分配给它们的端口”可以保证您的服务器在协议层面正确地工作。更重要的是,它能帮助保护任何您可能从外部访问的私有的本地网络服务。它还能保护远程站点免受本应限制在您的本地系统的网络流量的打扰。
2.5.4 远程目的端口过滤
您的本地客户端程序被设计用来连接到通过已分配的服务端口提供服务的网络服务器。从这个角度看,限制您的本地客户端仅连接到相关的服务器服务端口号能保证协议的正确性。限制您的客户端连接到特定的目标端口还有一些其他的目的:第一,它帮助防止本地的、私有网络客户端无意中试图访问互联网上的服务器。第二,它能禁止传出的错误,端口扫描和其他可能来源于您的站点的恶作剧。
您的本地服务器程序将几乎总是参与到由非特权端口发起的连接中。防火墙规则将限制您服务器的流量仅能传出到非特权目的端口。
2.5.5 传出TCP连接状态过滤
传出的TCP数据包接受规则可以使用TCP连接相关的连接状态,就像传入规则做的那样。所有的TCP连接都遵循同样的连接状态集合,这在客户端和服务器间可能会有不同。
从本地客户端传出的TCP数据包将在第一个发出的数据包中设置SYN标志,这是三次握手的一部分。最初的连接请求将设置SYN标志,但不设置ACK标志。您的本地客户端防火墙规则将允许设置了SYN标志或ACK标志的传出数据包。
从本地服务器传出的数据包将总是响应由远程客户端程序发起的连接请求。每个从您的服务器发出的数据包都会设置ACK标志。您的本地服务器防火墙规则将要求所有从您的服务器传出的数据包都设置了ACK标志。