8. 附录

8.1. 服务器、端口和数据包

让我们快速地、以非技术性的方式了解一些网络概念,以及它们如何潜在地影响我们的安全。我们不需要了解太多的网络知识,但对事物如何运作有一个大致的了解,肯定会对我们处理防火墙和其他相关问题有所帮助。

您可能已经注意到,Linux 是一个非常面向网络的操作系统。许多操作都是通过连接到各种类型的"服务器"来完成的 -- X 服务器、字体服务器、打印服务器等。

服务器提供"服务",这些服务提供各种功能,既可以提供给本地系统,也可以潜在地提供给其他远程系统。通常,同一个服务器会同时提供这两种功能。有些服务器在后台默默地工作,而另一些服务器本质上更具交互性。我们可能只有在需要打印东西时才会注意到打印服务器,但无论我们是否使用它(当然,前提是我们启用了它),它都在那里运行、监听并等待连接请求。一个典型的 Linux 安装会有很多很多类型的服务器可用。默认安装通常会启用其中的一些服务器。

即使我们没有一直连接到真正的网络,我们仍然可以说处于"联网"状态。以我们友好的本地 X 服务器为例。我们可能倾向于认为它只是提供一个 GUI 界面,但这只是部分正确。它通过为客户端应用程序"服务"来实现这一点,因此它确实是一个服务器。但是 X Windows 也能够通过网络为远程客户端提供服务 -- 甚至像互联网这样的大型网络。虽然我们可能并不真的想这样做 ;-)

是的,如果您没有运行防火墙或没有采取其他预防措施,并且连接到互联网,那么很可能有人 -- 任何人 -- 都可能连接到您的 X 服务器。默认情况下,X11 在 TCP "端口" 6000 上进行"监听"。这个原则也适用于大多数其他服务器 -- 除非采取一些措施来限制或阻止连接,否则它们可以很容易地被连接。

在像 Linux 和互联网这样基于 TCP/IP(传输控制协议/互联网协议)的网络中,每台连接的计算机都有一个唯一的 "IP 地址"。把它想象成一个电话号码。您有一个电话号码,为了给别人打电话,您必须知道那个电话号码,然后拨打它。电话号码必须是唯一的,系统才能正常工作。IP 地址通常表示为 "点分四段" 格式,例如 152.19.254.81。

在这种类型的网络中,服务器被称为"监听"。这意味着它们打开了一个"端口",并正在等待传入的连接到该端口。连接可以是本地的,就像我们的 X 服务器通常的情况一样,也可以是远程的 -- 意味着来自另一台"某个地方"的计算机。因此,服务器在特定的"端口""监听"传入的连接。大多数服务器都有一个默认端口,例如 Web 服务器的 80 端口。或者 X11 的 6000 端口。请参见/etc/services以获取常用端口及其相关服务的列表。

"端口"实际上只是内核网络堆栈中的一个地址,是 TCP 和其他协议用来组织计算机之间的连接和数据交换的一种方法。总共有 65,536 个可用的 TCP 和 UDP 端口,尽管通常一次只使用相对较少的端口。这些端口被分为"特权"端口(1024 以下的端口)和"非特权"端口(1024 及以上的端口)。大多数服务器都使用特权端口。

一次只能有一个服务器监听或"绑定"到一个端口。尽管该服务器很可能能够通过一个端口打开多个连接。计算机通过这些"端口"连接相互通信。一台计算机将打开一个到另一台计算机上的"端口"的连接,从而能够通过已建立的连接在它们各自的端口之间交换数据。

回到电话的比喻,并稍微扩展一下,想象一下给一个拥有复杂电话系统的大型组织打电话。该组织有许多"部门":销售、运输、账单、收货、客户服务、研发等。每个部门都有自己的"分机"号码。因此,运输部门可能是 21 分机,销售部门可能是 80 分机等等。主电话号码是 IP 地址,而部门的分机号码在这个比喻中就是端口。"部门"的号码在我们打电话时总是相同的。而且通常他们可以处理许多同时传入的呼叫。

数据本身包含在"数据包"中,这些数据包是小块数据,通常每个数据包小于 1500 字节。数据包用于控制和组织连接,以及携带数据。有不同类型的数据包。有些专门用于控制连接,然后有些数据包将我们的数据作为其有效负载携带。如果有大量数据,它将被分成多个数据包,这几乎总是它的工作方式。数据包将一次一个地传输,然后在另一端"重新组装"。例如,一个网页需要多个数据包来传输 -- 也许是数百甚至数千个。这一切都发生得非常快且透明。

我们可以从 netstat 输出的这一行摘录中看到两个计算机之间的典型连接

 tcp    30    0 169.254.179.139:1359    18.29.1.67:21      CLOSE_WAIT

 

有趣的部分是第四列和第五列中的 IP 地址和端口。端口是冒号右边的数字。冒号的左侧是每台计算机的 IP 地址。第四列是本地地址,或我们连接的端点。在示例中,169.254.179.139 是我的 ISP 分配的 IP 地址。它连接到 18.29.1.67 上的 21 端口 (FTP),即 rpmfind.net。这是在从 rpmfind.net 进行 FTP 下载之后。请注意,虽然我连接到他们 FTP 服务器的 21 端口,但我的 FTP 客户端使用的端口是 1359。这是一个随机分配的"非特权"端口,用于我端到两端"对话""会话"。数据双向移动:我:端口#1359 <-> 他们:端口#21。FTP 协议实际上比这复杂一点,但我们不会在这里深入探讨更精细的要点。CLOSE_WAIT是此连接在此时的 TCP 状态。最终连接将在两端完全关闭,并且 netstat 不会显示任何内容。

用于我端连接的"非特权"端口是临时的,与本地运行的服务器无关。连接终止时,内核将关闭它。这与"监听"服务器保持打开的端口完全不同,后者是永久性的,并且即使在远程连接终止后仍然"打开"

因此,使用上面的示例进行总结,我们有客户端(我)连接到服务器 (rpmfind.net),并且连接由两端的相应端口定义和控制。数据通过数据包传输和控制。服务器正在使用"特权"端口(即低于 1024 的端口),该端口保持打开状态以侦听连接。我的客户端应用程序在我端使用的"非特权"端口是临时的,仅在连接期间打开,并且仅响应连接另一端的服务器端口。一般来说,这种类型的端口不易受到攻击或闯入。服务器的端口容易受到攻击,因为它保持打开状态。FTP 服务器的管理员需要采取适当的预防措施来确保他的服务器是安全的。其他互联网连接,例如到 Web 服务器或邮件服务器的连接,其工作方式与上述示例类似,但服务器端口不同。SMTP 邮件服务器使用 25 端口,Web 服务器通常使用 80 端口。请参见端口部分,了解其他常用的端口和服务。

关于端口的另一点:只有在该端口上有东西监听时,端口才是可访问的。如果没有服务或守护程序在那里监听,准备处理传入的连接请求,则没有人可以强制打开端口。关闭的端口是完全安全的端口。

关于客户端和服务器之间区别的最后一点。上面的示例在监听器部分中没有 telnetftp 服务器 在上面的 netstat 示例中。换句话说,没有这样的服务器在本地运行。您不需要运行 telnetftp 服务器守护程序才能连接到别人的 telnetftp 服务器。这些仅用于向将连接到您的其他人提供这些服务。在大多数情况下,您并不真正想这样做。这绝不会影响使用 telnetftp 客户端软件的能力。

8.2. 常用端口

快速浏览一些常见的和常用的端口,以及通常相关的服务名称和风险因素。所有这些都存在一些风险。只是有些端口历史上比其他端口有更多的漏洞。这就是下面评估它们的方式,不一定解释为任何给定的服务是否安全。

1-19,各种协议,其中许多是过时的,并且现代系统上可能不需要任何协议。如果您不知道这些是什么,那么您绝对不需要它们。echo 服务(端口 7)不应与常见的 ping 程序混淆。关闭所有这些。

20 - FTP-DATA。 "主动" FTP 连接使用两个端口:21 是控制端口,20 是数据通过的端口。被动 FTP 根本不使用 20 端口。低风险,但请参见下文。

21 - FTP 服务器端口,也称为文件传输协议。一种在系统之间传输文件的常用协议。风险非常高,可能也是头号破解目标。

22 - SSH(安全外壳),有时也可能是 PCAnywhere。中低风险(是的,即使针对所谓的“安全”服务,也存在漏洞)。

23 - Telnet 服务器。仅供局域网使用。在非安全环境中使用 ssh 代替。中等风险。

25 - SMTP,简单邮件传输协议,或邮件服务器端口,用于发送外发邮件,以及在一处和另一处之间传输邮件。中等风险。过去存在很多漏洞,但最近有所改进。

37 - 时间服务。这是内置的 inetd 时间服务。低风险。仅供局域网使用。

53 - DNS,或域名服务器端口。域名服务器监听此端口,并响应将主机名解析为 IP 地址的查询。高风险。

67 (UDP) - BOOTP 或 DHCP 服务器端口。低风险。如果在局域网上使用 DHCP,则无需将其暴露给互联网。

68 (UDP) - BOOTP 或 DHCP 客户端端口。低风险。

69 - tftp,或简单文件传输协议。极其不安全。仅限局域网,如果真的、真的需要。

79 - Finger,用于提供有关系统和登录用户的信息。作为破解目标风险较低,但会泄露太多信息,不应运行。

80 - WWW 或 HTTP 标准 Web 服务器端口。互联网上最常用的服务。低风险。

98 - Linuxconf Web 访问管理端口。仅限局域网,如果真的需要的话。

110 - POP3,也称为邮局协议,邮件服务器端口。POP 邮件是用户从远程系统检索的邮件。低风险。

111 - sunrpc(Sun 远程过程调用)或 portmapper 端口。由 NFS(网络文件系统)、NIS(网络信息服务)和各种相关服务使用。听起来很危险,而且风险很高。仅限局域网使用。最喜欢的破解目标。

113 - identd 或 auth 服务器端口。一些旧式服务(如 SMTP 和 IRC)使用它,有时需要它来验证连接。在大多数情况下可能不需要。低风险,但可能会向攻击者提供太多关于您的系统的信息。

119 - nntp 或新闻服务器端口。低风险。

123 - 网络时间协议,用于与需要高精度的时间服务器同步。低风险,但可能不是大多数用户所必需的。 rdate 提供了一种更简单、更安全的更新系统时钟的方法。然后,inetd 内置的时间服务是同步局域网系统的另一种选择。

137-139 - NetBios (SMB) 服务。主要用于 Windows。在 Linux 上风险较低,但仅限局域网使用。137 是一个非常常见的端口尝试。来自 Redmond 的一个相当令人讨厌的协议,会产生大量“噪音”,其中大部分是无害的。

143 - IMAP,临时邮件访问协议。另一种邮件检索协议。中低风险。

161 - SNMP,简单网络管理协议。更常用于路由器和交换机,以监控统计数据和重要指标。我们大多数人不需要,而且风险较低。

177 - XDMCP,X 显示管理控制协议,用于远程连接到 X 服务器。低风险,但建议仅限局域网使用。

443 - HTTPS,一种广泛使用的安全 HTTP (WWW) 协议。低风险。

465 - SMTP over SSL,安全邮件服务器协议。低风险。

512 (TCP) - exec 在 netstat 中显示的方式。实际上正确的名称是 rexec,用于远程执行。听起来很危险,而且确实如此。高风险,如果使用的话,仅限局域网。

512 (UDP) - biff,一种邮件通知协议。低风险,仅限局域网。

513 - login,实际上是 rlogin,也称为远程登录。与我们每次登录时使用的标准 /bin/login 没有关系。听起来很危险,而且确实如此。高风险,如果真的需要,仅限局域网。

514 (TCP) - shell 是昵称,也是 netstat 显示的方式。实际上,rsh“远程 Shell”应用程序。像所有 “r” 命令一样,这是对早期更温和时代的怀念。非常不安全,因此风险很高,如果使用的话,仅限局域网。

514 (UDP) - syslog 守护程序端口,仅用于远程日志记录。普通用户不需要它。可能风险较低,但如果真的需要,绝对仅限局域网。

515 - lp 或打印服务器端口。高风险,当然仅限局域网。世界上另一端的人不希望将您的打印机用于其预期目的!

587 - MSA,或“submission”,邮件提交代理协议。一种新的邮件处理协议,受大多数 MTA(邮件服务器)支持。低风险。

631 - CUPS(打印守护程序)Web 管理端口。仅限局域网,低风险。

635 - mountd,NFS 的一部分。仅限局域网使用。

901 - SWAT,Samba Web 管理工具端口。仅限局域网。

993 - IMAP over SSL,安全 IMAP 邮件服务。非常低的风险。

995 - POP over SSL,安全 POP 邮件服务。非常低的风险。

1024 - 这是第一个“非特权”端口,内核会将其动态分配给请求它的任何应用程序。这几乎可以是任何东西。此端口之上的端口也是如此。

1080 - Socks 代理服务器。最喜欢的破解目标。

1243 - SubSeven 特洛伊木马。仅限 Windows 问题。

1433 - MS SQL 服务器端口。有时是攻击目标。在 Linux 上不适用。

2049 - nfsd,网络文件服务守护程序端口。高风险,建议仅限局域网使用。

3128 - Squid 代理服务器端口。低风险,但对于大多数人来说,应仅限局域网。

3306 - MySQL 服务器端口。低风险,但对于大多数人来说,应仅限局域网。

5432 - PostgreSQL 服务器端口。仅限局域网,风险相对较低。

5631 (TCP), 5632 (UDP) - PCAnywhere 端口。仅限 Windows。 PCAnywhere 可能非常“嘈杂”,并广播宽地址范围。

6000 - 用于远程连接的 X11 TCP 端口。中低风险,但同样,这应该仅限局域网。实际上,这可以包括端口 6000-6009,因为 X 可以支持多个显示器,并且每个显示器都有自己的端口。ssh 的 X11Forwarding 将开始使用 6010 端口。

6346 - gnutella。

6667 - ircd,互联网中继聊天守护程序。

6699 - napster。

7100-7101 - 一些字体服务器使用这些端口。低风险,但仅限局域网。

8000 和 8080 - 常见的 Web 缓存和代理服务器端口。仅限局域网。

10000 - webmin,一个基于 Web 的系统管理实用程序。目前风险较低。

27374 - SubSeven,一种常被探测的仅限 Windows 的特洛伊木马。此外,还有 1243。

31337 - Back Orifice,另一种常被探测的仅限 Windows 的特洛伊木马。

可以在 /etc/services 中找到更多服务和相应的端口号。此外,“官方”列表是http://www.iana.org/assignments/port-numbers

Robert Graham 对探测这些和其他端口可能意味着什么的精彩分析:http://www.linuxsecurity.com/resource_files/firewalls/firewall-seen.html。一个非常好的参考。

这里另一点是,这些是标准端口指定。没有任何法律规定任何服务必须在特定端口上运行。通常他们会这样做,但当然他们不必总是这样做。

只是提醒一下,当您在防火墙日志中看到这些类型的端口时,不要惊慌失措。如果您已按照上述步骤 1-3 操作并验证了防火墙是否有效,则可以相对安全。这些流量中的大部分也可能是“流弹”--互联网背景噪音、配置错误的客户端或路由器、嘈杂的 Windows 内容等。

8.3. Netstat 教程

8.3.1. 概述

netstat 是一个非常有用的实用程序,用于查看您网络状态的当前状态 - 哪些服务器正在侦听传入连接,它们侦听哪些接口,谁连接到我们,我们连接到谁等等。查看手册页,了解许多命令行选项。我们这里只使用相对较少的选项。

例如,让我们检查一下我们假设的主机 bigcat 上 TCP 和 UDP 的所有当前正在侦听的服务器和活动连接。在本示例中,bigcat 是一个家庭桌面安装,具有 DSL 互联网连接。 bigcat 有两个以太网卡:一个用于与 ISP 的外部连接,一个用于地址为 192.168.1.1 的小型局域网。

   
$ netstat -tua
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:printer               *:*                     LISTEN     
tcp        0      0 bigcat:8000             *:*                     LISTEN     
tcp        0      0 *:time                  *:*                     LISTEN     
tcp        0      0 *:x11                   *:*                     LISTEN
tcp        0      0 *:http                  *:*                     LISTEN     
tcp        0      0 bigcat:domain           *:*                     LISTEN     
tcp        0      0 bigcat:domain           *:*                     LISTEN     
tcp        0      0 *:ssh                   *:*                     LISTEN     
tcp        0      0 *:631                   *:*                     LISTEN     
tcp        0      0 *:smtp                  *:*                     LISTEN     
tcp        0      1 dsl-78-199-139.s:1174   64.152.100.93:nntp      SYN_SENT   
tcp        0      1 dsl-78-199-139.s:1175   64.152.100.93:nntp      SYN_SENT   
tcp        0      1 dsl-78-199-139.s:1173   64.152.100.93:nntp      SYN_SENT   
tcp        0      0 dsl-78-199-139.s:1172   207.153.203.114:http    ESTABLISHED
tcp        1      0 dsl-78-199-139.s:1199   www.xodiax.com:http     CLOSE_WAIT 
tcp        0      0 dsl-78-199-139.sd:http  63.236.92.144:34197     TIME_WAIT
tcp      400      0 bigcat:1152             bigcat:8000             CLOSE_WAIT 
tcp     6648      0 bigcat:1162             bigcat:8000             CLOSE_WAIT 
tcp      553      0 bigcat:1164             bigcat:8000             CLOSE_WAIT 
udp        0      0 *:32768                 *:*                                
udp        0      0 bigcat:domain           *:*                                
udp        0      0 bigcat:domain           *:*                                
udp        0      0 *:631                   *:*                               

 

此输出可能与您在自己的系统上获得的输出非常不同。请注意“本地地址”“外部地址”之间的区别,以及每个地址如何在冒号后包含相应的端口号(或可用时的服务名称)。 “本地地址”是连接的终点。第一组包含LISTEN在最右边的列中是在此系统上运行的服务。这些是在 bigcat 上在后台运行的服务,并且“侦听”传入连接。因此,它们打开了一个端口,这就是它们“侦听”的位置。这些连接可能来自本地系统(即 bigcat 本身)或远程系统。这是非常重要的信息!它下面的其他连接是从该系统到其他系统建立的连接。各个连接处于不同的状态,如最后一列中的关键字所示。最后没有关键字的那些是在响应 UDP 连接的服务器。 UDP 是与 TCP 完全不同的协议,但用于某些类型的低优先级网络流量。

现在,使用 “-n” 标志做同样的事情,以禁止转换为“名称”,以便我们可以实际看到端口号

$ netstat -taun
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address      State
tcp        0      0 0.0.0.0:515             0.0.0.0:*            LISTEN     
tcp        0      0 127.0.0.1:8000          0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:37              0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:6000            0.0.0.0:*            LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*            LISTEN     
tcp        0      0 192.168.1.1:53          0.0.0.0:*            LISTEN     
tcp        0      0 127.0.0.1:53            0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:631             0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:25              0.0.0.0:*            LISTEN     
tcp        0      1 169.254.179.139:1174    64.152.100.93:119    SYN_SENT   
tcp        0      1 169.254.179.139:1175    64.152.100.93:119    SYN_SENT   
tcp        0      1 169.254.179.139:1173    64.152.100.93:119    SYN_SENT   
tcp        0      0 169.254.179.139:1172    207.153.203.114:80   ESTABLISHED
tcp        1      0 169.254.179.139:1199    216.26.129.136:80    CLOSE_WAIT 
tcp        0      0 169.254.179.139:80      63.236.92.144:34197  TIME_WAIT 
tcp      400      0 127.0.0.1:1152          127.0.0.1:8000       CLOSE_WAIT 
tcp     6648      0 127.0.0.1:1162          127.0.0.1:8000       CLOSE_WAIT 
tcp      553      0 127.0.0.1:1164          127.0.0.1:8000       CLOSE_WAIT 
udp        0      0 0.0.0.0:32768           0.0.0.0:*                    
udp        0      0 192.168.1.1:53          0.0.0.0:*                      
udp        0      0 127.0.0.1:53            0.0.0.0:*                     
udp        0      0 0.0.0.0:631             0.0.0.0:*          
   
 

让我们详细看一下其中的前几行。在第一行上,

 tcp        0      0 0.0.0.0:515            0.0.0.0:*          LISTEN     

 

“本地地址”0.0.0.0,表示“所有”可用接口。本地端口是 515,或标准打印服务器端口,通常由 lpd 守护进程拥有。您可以在文件中找到常见服务名称和相应端口的列表/etc/services.

它监听所有接口这一事实非常重要。在本例中,这些接口将是 lo (localhost,本地主机)、eth0 和 eth1。打印机连接理论上可以通过这些接口中的任何一个建立。如果此系统上的用户建立 PPP 连接,则打印守护进程也会监听该接口 (ppp0)。"外部地址"也是0.0.0.0,意味着来自"任何地方"

这里还值得注意的是,即使此服务器告诉内核监听所有接口,netstat 的输出也不会反映是否存在可能正在过滤传入连接的防火墙。我们目前无法判断。显然,对于某些服务器,这是非常理想的。例如,您自己的 LAN 之外的任何人都没有任何理由连接到您的打印服务器端口。

第二行略有不同

 tcp        0      0 127.0.0.1:8000         0.0.0.0:*          LISTEN     

 

请注意这次的 "本地地址"是本地主机地址,为127.0.0.1。这非常重要,因为只有来自此机器本地的连接才会被接受。因此,只有 bigcat 可以连接到 bigcat 的 TCP 端口 8000。其安全影响应该是显而易见的。并非所有服务器都具有允许这种限制的配置选项,但对于那些确实具有该选项的服务器来说,这是一个非常有用的功能。在本例中,端口 8000 由 Web 代理 Junkbuster 拥有。

接下来的三个条目,我们又回到了监听所有可用接口的情况

 tcp        0      0 0.0.0.0:37             0.0.0.0:*           LISTEN     
 tcp        0      0 0.0.0.0:6000           0.0.0.0:*           LISTEN
 tcp        0      0 0.0.0.0:80             0.0.0.0:*           LISTEN     

 

查看/etc/services,我们可以看出端口 37 是一个 "time" 服务,即时间服务器。6000 是 X11,80 是 HTTP 服务器(如 Apache)的标准端口。这里没有什么特别之处,因为这些都是 Linux 上 readily available 的服务。

上面前两个服务绝对不是您希望任何人都可以连接的服务。这些应该使用防火墙保护,拒绝所有外部连接。同样,我们无法从该输出判断是否存在任何防火墙,更不用说它是否有效实现了。

端口 80 上的 Web 服务器本身并不是一个巨大的安全风险。HTTP 是一种通常对所有人开放的协议。例如,如果我们想托管自己的主页,Apache 肯定可以为我们做到这一点。也可以使用防火墙将其隔离,使其仅供我们的 LAN 客户端作为 Intranet 的一部分使用。显然,如果您没有充分的理由运行 Web 服务器,那么应该完全禁用它。

接下来的两行很有趣

 tcp        0      0 192.168.1.1:53         0.0.0.0:*           LISTEN     
 tcp        0      0 127.0.0.1:53           0.0.0.0:*           LISTEN     

 

再次注意,"本地地址"不是0.0.0.0。这很好!这次的端口是 53,或者是由名称服务器守护进程(如 named)使用的 DNS 端口。但是我们看到名称服务器守护进程仅监听 lo 接口(本地主机)和将 bigcat 连接到 LAN 的接口。因此,内核仅允许来自本地主机和 LAN 的连接。根本不会有任何端口 53 可供外部连接使用。这是一个很好的例子,说明单个应用程序有时如何安全地配置。在这种情况下,我们可能正在查看缓存 DNS 服务器,因为负责处理 DNS 查询的真实名称服务器必须将端口 53 对外开放。这是一个安全风险,需要特殊处理。

最后三个监听器条目

 tcp        0      0 0.0.0.0:22             0.0.0.0:*           LISTEN     
 tcp        0      0 0.0.0.0:631            0.0.0.0:*           LISTEN     
 tcp        0      0 0.0.0.0:25             0.0.0.0:*           LISTEN     

 

这些又回到了监听所有可用接口的情况。端口 22 是 sshd,即安全 Shell 服务器守护进程。这是一个好兆头!请注意,如果我们查看第一个示例中的输出,则端口 631 的服务没有服务名称。这可能表明这里正在发生一些不寻常的事情。(请参阅下一节以获取此谜题的答案。)最后,端口 25 是 SMTP 邮件守护进程的标准端口。大多数 Linux 安装可能都会运行 SMTP 守护进程,因此这并不一定不寻常。但这有必要吗?

下一组是已建立的连接。就我们的目的而言,最后一列指示的连接状态并不那么重要。这在手册页中有很好的解释。

 tcp        0      1 169.254.179.139:1174    64.152.100.93:119    SYN_SENT   
 tcp        0      1 169.254.179.139:1175    64.152.100.93:119    SYN_SENT    
 tcp        0      1 169.254.179.139:1173    64.152.100.93:119    SYN_SENT   
 tcp        0      0 169.254.179.139:1172    207.153.203.114:80   ESTABLISHED
 tcp        1      0 169.254.179.139:1199    216.26.129.136:80    CLOSE_WAIT 
 tcp        0      0 169.254.179.139:80      63.236.92.144:34197  TIME_WAIT 
 tcp      400      0 127.0.0.1:1152          127.0.0.1:8000       CLOSE_WAIT 
 tcp     6648      0 127.0.0.1:1162          127.0.0.1:8000       CLOSE_WAIT 
 tcp      553      0 127.0.0.1:1164          127.0.0.1:8000       CLOSE_WAIT 

 

这里总共有九个连接。前三个是我们的外部接口连接到远程主机的端口 119,这是标准 NNTP(新闻)端口。这里有三个连接到同一新闻服务器。显然,该应用程序是多线程的,因为它试图打开到新闻服务器的多个连接。接下来的两个条目是通过第五列中冒号后的端口 80 连接到远程 Web 服务器。对于我们大多数人来说,这可能是一个非常常见的条目。但是紧随其后的条目被颠倒了,端口 80 在第四列中,因此有人通过其外部 Internet 端接口连接到了 bigcat 的 Web 服务器。最后三个条目都是从本地主机到本地主机的连接。因此,我们在这里连接到我们自己。记住上面的端口 8000 是 bigcat 的 Web 代理,这是一个连接到本地运行的代理的 Web 浏览器。然后,代理将打开自己的外部连接,这可能就是第四行和第五行发生的情况。

由于我们为 netstat 提供了-t-u选项,因此我们获得了 TCP 和 UDP 监听服务器。最后几行是 UDP 服务器

 udp        0      0 0.0.0.0:32768          0.0.0.0:*                    
 udp        0      0 192.168.1.1:53         0.0.0.0:*                      
 udp        0      0 127.0.0.1:53           0.0.0.0:*                     
 udp        0      0 0.0.0.0:631            0.0.0.0:*          

 

最后三个条目的端口与上面的讨论中熟悉的端口相同。这些服务器正在监听 TCP 和 UDP 连接。在这种情况下是相同的服务器,只是使用了两种不同的协议。本地端口 32768 上的第一个端口是新的,并且在/etc/services中没有可用的服务名称。因此,乍一看,这应该令人怀疑并激起我们的好奇心。请参阅下一节以获取说明。

我们可以从这种假设情况中得出什么结论?在大多数情况下,这些看起来是 Linux 上非常正常的网络服务和连接。这里运行的服务器数量似乎没有过度,但这本身并不能说明什么,因为我们不知道是否真的需要所有这些服务器。我们知道 netstat 无法告诉我们这些服务器是否有效地受到防火墙保护,因此无法说明所有这些服务器有多安全。我们也不知道所有监听服务是否真的需要所有者。这因安装而异。例如,bigcat 是否甚至连接了打印机?据推测,它确实连接了打印机,否则这是一个完全不必要的风险。

8.3.2. 端口和进程所有者

从上面的章节中,我们了解了很多关于 bigcat 网络发生的事情。但是,假设我们看到一些我们不认识的东西,并且想知道是什么启动了该特定服务?或者我们要停止特定的服务器,但从上面的输出中看不出来?

使用-p选项应在最后一列中为我们提供进程的 PID 和启动该进程的程序名称。让我们再次查看 TCP 服务器(前三列被裁剪以节省空间)。我们需要以 root 身份运行此命令才能获得所有可用信息

# netstat -tap
Active Internet connections (servers and established)
  Local Address           Foreign Address      State       PID/Program name
  *:printer               *:*                  LISTEN       988/inetd
  bigcat:8000             *:*                  LISTEN       1064/junkbuster
  *:time                  *:*                  LISTEN       988/inetd
  *:x11                   *:*                  LISTEN       1462/X
  *:http                  *:*                  LISTEN       1078/httpd
  bigcat:domain           *:*                  LISTEN       956/named
  bigcat:domain           *:*                  LISTEN       956/named
  *:ssh                   *:*                  LISTEN       972/sshd
  *:631                   *:*                  LISTEN       1315/cupsd
  *:smtp                  *:*                  LISTEN       1051/master

 

其中一些我们已经知道了。但是现在我们看到端口 515 上的打印机守护进程是通过 inetd 启动的,PID 为 "988"inetd 是一种特殊情况。inetd 通常被称为 "超级服务器",因为它的主要作用是生成子服务。从 Red Hat 7.0 开始,xinetd 取代了 inetd。如果我们查看第一行,inetd 正在端口 515 上监听打印机服务。如果此端口有连接传入,则 inetd 将拦截它,然后将生成相应的守护进程,即本例中的打印守护进程。通常在/etc/inetd.conf中完成如何 inetd 处理此问题的配置。这应该告诉我们,如果我们想永久停止 inetd 控制的服务器,那么我们将不得不深入研究 inetd(或者可能是 xinetd)配置。此外,上面的时间服务也是通过 inetd 启动的。这也应该告诉我们,可以通过 tcpwrappers(在上面的步骤 3 中讨论)进一步保护这两个服务。这是使用 inetd 控制某些系统服务的好处之一。

我们不确定端口 631 上的服务,因为它没有标准服务名称,这意味着它可能有点不寻常或偏离了常规。现在我们看到它由 cupsd 拥有(Red Hat 不包含),它是 Linux 下可用的几个打印守护进程之一。这恰好是用于控制打印机服务的 Web 界面。cupsd 所做的事情确实与其他打印服务器有些不同。

上面的最后一个条目是 bigcat 上的 SMTP 邮件服务器。通常,这是 sendmail。但并非在本例中。该命令是 "master",这可能不会让您想起任何东西。有了程序名称,我们可以使用 locatefind 命令等工具在文件系统中进行搜索。找到它后,我们就可以确定它属于哪个包。但是现在有了可用的 PID,我们可以查看 ps 输出,看看是否有任何帮助

 $ /bin/ps ax |grep 1051 |grep -v grep
  1051 ?        S        0:24 /usr/libexec/postfix/master

 

我们在这里采用了捷径,将 psgrep 结合使用。看起来该文件属于 postfix,它确实是一个与 sendmail 相当的邮件服务器包(并且包含在 Powertools 中,而不是基本发行版中)。

使用--forest标志(-f简称)运行 ps 可以帮助确定哪些进程是父进程或子进程或另一个进程。一个编辑过的例子

 $ /bin/ps -axf
  956 ?        S      0:00 named -u named
  957 ?        S      0:00  \_ named -u named
  958 ?        S      0:46      \_ named -u named
  959 ?        S      0:47      \_ named -u named
  960 ?        S      0:00      \_ named -u named
  961 ?        S      0:11      \_ named -u named
 1051 ?        S      0:30 /usr/libexec/postfix/master
 1703 ?        S      0:00  \_ tlsmgr -l -t fifo -u -c
 1704 ?        S      0:00  \_ qmgr -l -t fifo -u -c
 1955 ?        S      0:00  \_ pickup -l -t fifo -c
 1863 ?        S      0:00  \_ trivial-rewrite -n rewrite -t unix -u -c
 2043 ?        S      0:00  \_ cleanup -t unix -u -c
 2049 ?        S      0:00  \_ local -t unix
 2062 ?        S      0:00  \_ smtpd -n smtp -t inet -u -c

 

这里有几点需要注意。我们现在有两个熟悉的守护进程:namedpostfix (smtpd)。两者都在生成子进程。对于 named,我们看到的是线程,它是它始终生成的各种子进程。Postfix 也在生成子进程,但不是作为 "线程"。每个子进程都有其特定的任务。值得注意的是,子进程依赖于父进程。因此,杀死父 PID 将反过来杀死所有子进程。

如果所有这些都没有带来任何启示,我们也可以尝试 locate

 $ locate /master
 /etc/postfix/master.cf
 /var/spool/postfix/pid/master.pid
 /usr/libexec/postfix/master
 /usr/share/vim/syntax/master.vim
 /usr/share/vim/vim60z/syntax/master.vim
 /usr/share/doc/postfix-20010202/html/master.8.html
 /usr/share/doc/postfix-20010202/master.cf
 /usr/share/man/man8/master.8.gz

 

find 可能是最灵活的文件查找实用程序,但不像 locate 那样使用数据库,因此速度要慢得多

 $ find / -name master         
 /usr/libexec/postfix/master

 

如果安装了 lsof,则它是另一个有用的命令,用于查找谁拥有进程或端口

 # lsof -i :631       
 COMMAND  PID  USER    FD   TYPE DEVICE SIZE NODE NAME
 cupsd   1315  root    0u   IPv4   3734       TCP *:631 (LISTEN)

 

这再次告诉我们 cupsd 打印守护进程是端口 631 的所有者。只是获得它的另一种方式。另一种获取方法是使用 fuser,应该已安装

 # fuser -v -n tcp 631

                      USER        PID  ACCESS  COMMAND
 631/tcp              root       1315  f....   cupsd

 

请参阅 fuserlsof 命令语法的手册页。

查找服务启动位置的另一个地方是在init.d目录中,实际的 init 脚本就位于该目录中。例如ls -l /etc/rc.d/init.d/,应该能给我们列出这些服务。通常脚本名称本身会暗示它启动了哪些服务,尽管它可能不一定与 "程序名称" 完全匹配,该程序名称由 netstat 提供。或者我们可以使用 grep 在文件中搜索并匹配搜索模式。我们需要找到 rpc.statd 在哪里启动,但我们没有看到以此名称命名的脚本?

 # grep rpc.statd /etc/init.d/*
 /etc/init.d/nfslock: [ -x /sbin/rpc.statd ] || exit 0
 /etc/init.d/nfslock:    daemon rpc.statd
 /etc/init.d/nfslock:    killproc rpc.statd
 /etc/init.d/nfslock:    status rpc.statd
 /etc/init.d/nfslock:    /sbin/pidof rpc.statd >/dev/null 2>&1; STATD="$?"

 

我们实际上并不需要所有这些信息,但至少我们现在清楚地看到了哪个脚本正在启动它。还要记住,并非所有服务都以这种方式启动。有些可能通过 inetdxinetd 启动。

使用/proc文件系统也保存了我们想知道的关于正在运行的进程的所有信息。我们可以查询它来了解有关每个进程的更多信息。您需要知道启动进程的命令的完整路径吗?

 # ls -l /proc/1315/exe
 lrwxrwxrwx  1 root  root   0 July 4 19:41 /proc/1315/exe -> /usr/sbin/cupsd

 

最后,我们在 UDP 监听服务中有一两个未解决的问题。记住我们有一个奇怪的端口号 32768,它也没有关联的服务名称。

 # netstat -aup
 Active Internet connections (servers and established)
  Local Address           Foreign Address         State       PID/Program name   
   *:32768                 *:*                                 956/named           
   bigcat:domain           *:*                                 956/named           
   bigcat:domain           *:*                                 956/named           
   *:631                   *:*                                 1315/cupsd          

 

现在,通过包含 "PID/程序名称" 选项与-p标志一起使用,我们看到这也属于 named,即域名服务器守护进程。BIND 的最新版本使用非特权端口进行某些类型的流量。在本例中,这是 BIND 9.x。所以这里也没有真正的警报。这里的非特权端口是 named 用来与其他域名服务器进行域名和地址查找的端口,不应该被防火墙阻止。

所以在这个假设的情况下,我们没有发现什么意外。

如果一切都失败了,并且您找不到开放端口的进程所有者,请怀疑它可能是某种 RPC(远程过程调用)服务。这些服务使用随机分配的端口,没有任何明显的逻辑或一致性,并且通常由 portmap 守护进程控制。在某些情况下,这些服务可能不会向 netstatlsof 显示进程所有者。尝试停止 portmap,然后看看这个神秘服务是否消失。或者你可以使用 rpcinfo -p localhost 来查看可能正在运行的 RPC 服务(portmap 必须运行才能使此命令生效)。

Warning

如果您怀疑您已被入侵,不要相信 netstatps 的输出。很有可能它们和其他系统组件已被篡改,以至于输出不可靠。

8.4. 攻击和威胁

在本节中,我们将快速了解一些常见的威胁和技术,并尝试将它们置于一定的角度来看待。

公司、政府机构和知名互联网网站必须关注比典型的家庭桌面用户更为多样和更具挑战性的威胁。有人可能想闯入别人的计算机有很多原因。可能只是为了好玩,或者出于任何恶意原因。他们可能只是想要一个攻击其他人的基地。这是一个非常常见的动机。

对我们大多数人来说,最常见的 "攻击" 来自已经受损的系统。互联网上遍布着被入侵的计算机,它们现在像僵尸一样盲目地执行主人的命令。它们被编程为扫描大量地址范围,探测每个单独的 IP 地址。寻找一个或多个开放端口,然后如果他们有机会,就探测已知的弱点。非常没有人情味。非常有条不紊。而且非常有效。我们都在这种机器人扫描的路径上。所有这些都是因为那些负责这些系统的人未能做你现在正在做的事情——采取措施保护他们的系统,并避免被 r00ted。

这些扫描不会查看连接时可能出现的登录横幅。更改您的/etc/issue.net来假装您正在运行一些晦涩的操作系统是没有用的。如果他们找到正在监听的东西,他们将尝试所有适用于该端口的漏洞利用,而不考虑您的系统可能给出的任何指示。如果它有效,他们就进去了——如果无效,他们将继续前进。

8.4.1. 端口扫描和探测

首先,让我们定义 "扫描""探测",因为这些术语经常出现。"探测" 意味着测试给定的端口是打开还是关闭,以及可能有哪些东西正在监听该端口。 "扫描" 意味着 "探测" 一个或多个系统上的多个端口。或者探测多个系统上的单个端口。因此,例如,您可能会 "扫描" 您自己系统上的所有端口。或者,一个黑客可能会 "扫描" 216.78.*.* 地址范围,以查看谁打开了 111 端口。

黑客可以使用扫描和探测信息来了解给定系统上正在运行哪些服务,然后他们可能知道要尝试哪些漏洞。他们甚至可能能够知道正在运行什么操作系统,甚至内核版本,从而获得更多信息。"蠕虫",另一方面,是自动化的并且盲目地扫描,通常只是寻找开放端口,然后寻找易受攻击的受害者。他们不像黑客那样试图 "学习" 任何东西。

"扫描""探测" 之间的区别通常很模糊。两者都可以以好的方式或坏的方式使用,这取决于谁在做以及为什么。例如,您可能会要求朋友扫描您,以查看您的防火墙的工作效果如何。这是扫描工具(如 nmap)的合法使用。但是,如果您不认识的人这样做怎么办?他们的意图是什么?如果是您的 ISP,他们可能试图执行其服务条款协议。或者,也许只是有人在玩,看看谁 "在那里"。但更可能的是,某人或某事的意图不那么好。

全范围端口扫描(意味着探测同一台机器上的许多端口)对于家庭网络来说似乎不是一个常见的威胁。但是,扫描众多系统上的单个端口肯定是非常非常常见的。

8.4.3. 蠕虫和僵尸网络

"蠕虫" 是一种自我复制的漏洞利用程序。它感染一个系统,然后尝试通过相同的漏洞来传播自己。各种 "蠕虫" 不断地穿梭于整个 Internet 地址空间中,并在传播过程中传播自己。

但是在僵尸网络后面,有一个控制器。有人启动了蠕虫,并且他们将在成功入侵后得到通知。然后由他们决定如何使用该系统。

其中许多是 Linux 系统,它们正在寻找其他 Linux 系统,通过多种漏洞进行 "感染"。但是大多数操作系统都面临这种威胁。一旦发现易受攻击的系统,实际的进入和接管是快速的,并且事后可能难以检测到。入侵者(无论是人还是 "蠕虫")要做的第一件事就是试图掩盖他们的踪迹。下载并安装一个 "rootkit"。有线调制解调器和 DSL 的日益普及加剧了这种趋势。全天候 Internet 连接的数量正在迅速增长,这为这种漏洞利用提供了肥沃的土壤,因为通常这些漏洞利用的安全性不如大型站点。

虽然这听起来可能令人不安,但一些简单的预防措施可以有效地阻止这种类型的攻击。有这么多容易上当的受害者,为什么还要浪费精力入侵您的系统?没有真正的理由去尝试。只需扫描、查看、尝试,如果不成功就继续前进。总有更多的 IP 可以扫描。如果您的防火墙有效地阻止了此类攻击,那么它对您没有任何威胁。对此感到欣慰,不要过度反应。

值得注意的是,这些蠕虫无法 "强行" 进入。他们需要一个开放且可访问的端口以及一个已知的漏洞。如果您还记得上面开头部分中的 "Iptables 每周日志摘要",那么其中许多可能都是这种扫描的结果。如果您按照本 HOWTO 中的步骤操作,那么您应该在这里相对安全。这一种很容易防御。

8.5. 链接

下面列出了一些参考资料,供进一步阅读。未列出的是你的发行版的网站、安全页面或ftp下载站点。你必须自己找到这些。然后你应该将它们添加到书签!

8.6. 编辑文本文件

作者:Bill Staehle

一切皆文件。

文件有很多类型,但在这里我将它们粗略地分为两大类



 文本 文件 就是 文本 文件。
 二进制 文件 则 不是。

    

二进制文件供机器读取,文本文件可以轻松编辑,通常供人读取。但是文本文件可以(并且经常)被机器读取。例如配置文件和脚本。

在*nix系统中有很多不同的文本编辑器。 一些编辑器在每个系统上都有,例如“/bin/ed”和“/bin/vi”。 由于许可问题,“vi”几乎总是诸如“vim”之类的克隆版本。“vi”和“ed”的问题在于它们对用户非常不友好。另一个常见的编辑器是“emacs”,默认情况下不总是安装。它具有更多特性和功能,但也不容易学习。

至于“用户友好”的编辑器,“mcedit”和“pico”是入门的不错选择。 对于那些刚接触*nix的人来说,这些通常更容易。

首先要学习的是如何退出编辑会话,如何将更改保存到文件,以及如何避免破坏不应被破坏(换行)的长行。

“vi”编辑器

“vi”是Unix世界中最常见的文本编辑器之一,几乎在任何*nix系统上都能找到。 实际上,由于许可问题,Linux系统上的“/bin/vi”始终是一个“克隆”,例如“elvis”、“nvi”或“vim”(还有其他)。 这些克隆可以像原始的“vi”一样工作,但通常具有使其使用起来不那么困难的附加功能。

那么,如果它如此糟糕,为什么要学习它呢? 有两个原因。 首先,如前所述,几乎可以保证已安装它,并且其他(更用户友好)的编辑器可能默认情况下未安装。 其次,许多“命令”在其他应用程序中也适用(例如,分页器“less”,也用于查看man手册页)。 在“less”中,意外按下“v”键会在大多数安装中启动“vi”。

“vi”有两种模式。 第一种是“命令模式”,按键被解释为命令。 另一种模式是“插入”模式,几乎所有的按键都被解释为要插入的文本。

==> 从“vi”紧急退出 1. 按<esc>键最多三次,直到计算机发出哔哔声或屏幕闪烁。 2. 按键 :q! <Enter>

即:冒号、字母Q,然后是感叹号,后跟回车键。

“vi”命令如下。 所有这些都在“命令”模式下


a    在 光标 之后 进入 插入 模式。
A    在 当前 行 的 末尾 进入 插入 模式。
i    在 光标 之前 进入 插入 模式。
o    打开 当前 行 下方 的 新 行 进入 插入 模式。
O    打开 当前 行 上方 的 新 行 进入 插入 模式。
h    将 光标 向 左 移动 一个 字符。
l    将 光标 向 右 移动 一个 字符。
j    将 光标 向下 移动 一行。
k    将 光标 向上 移动 一行。
/mumble  将 光标 向前 移动 到 文本 中 'mumble' 的 下一个 匹配项
         。
?mumble  将 光标 向后 移动 到 文本 中 'mumble' 的 下一个 匹配项
         。
n    重复 上次 搜索 (? 或 / 不带 'mumble' 搜索 同样 有效)
     。
u    撤消 上次 更改

^B   向 后 滚动 一个 窗口。
^F   向 前 滚动 一个 窗口。
^U   向上 滚动 半个 窗口。
^D   向下 滚动 半个 窗口。

:w   写入 文件。
:wq  写入 文件 并 退出。
:q   退出。
:q!  退出 不 保存。

<esc>   离开 插入 模式。
  
    

注意:四个“箭头”键几乎总是在“命令”或“插入”模式下工作。

“ed”编辑器。

“ed”编辑器是一个行编辑器。 除了它几乎可以保证在任何*nix计算机上存在之外,它没有任何社交价值,尽管某些应用程序可能需要它。 从1975年开始,人们提供了_大量_的东西来替代这个“东西”。

==> 从“ed”紧急退出

1. 在一行上单独键入一个句点,然后按<Enter>。这使您进入命令模式,或者如果您处于命令模式,则会打印一行文本。 2. 键入q并按<Enter>。 如果文件没有更改,此操作将退出ed。 如果您然后看到“?” 这意味着文件已更改,“ed”询问您是否要保存更改。 再次按q和<Enter>,以确认您要退出。

“pico”编辑器。

“pico”是华盛顿大学(美国州)的Pine邮件/新闻软件包的一部分。 它是一个非常友好的编辑器,但有一个小小的缺点。 当它超过(通常)74个字符时,它会静默地插入一个换行符并换行。 虽然这在创建邮件、新闻文章和文本注释时很好,但在编辑系统文件时通常是致命的。 解决这个问题的方法很简单。 使用-w选项调用该程序,如下所示

pico -w file_2_edit

Pico非常用户友好,无需进一步说明。 它_应该_很明显(查看屏幕底部以获取命令)。 有一个广泛的帮助功能。 Pico几乎适用于所有发行版,尽管它_可能_默认未安装。

==> 从“pico”紧急退出

按住<Ctrl>键,然后按字母x。 如果未对文件进行任何更改,这将退出pico。 如果已进行更改,它将询问您是否要保存更改。 按n将退出。

“mcedit”编辑器。

“mcedit”是Midnight Commander shell程序的一部分,它是类似Unix系统的全功能可视化shell。 可以直接从命令行访问它(mcedit file_2_edit),或者作为“mc”的一部分访问(使用箭头键突出显示要编辑的文件,然后按F4键)。

mcedit可能是最直观的编辑器,并带有广泛的帮助。 “命令”通过F*键访问。 Midnight Commander几乎适用于所有发行版,尽管它_可能_默认未安装。

==> 从“mcedit”紧急退出

按F10键。 如果未对文件进行任何更改,这将退出mcedit。 如果已进行更改,它将询问您是否要取消此操作。 按n将退出。

8.7. nmap

让我们看几个nmap扫描的快速示例。 这里的目的是展示如何使用nmap来验证我们的防火墙和系统完整性。 nmap还有其他用途,我们不需要深入研究。 除非您获得所有者的许可,并且您知道这不违反任何人的服务条款,否则请勿在您自己的系统以外的系统上使用nmap。 这种事情将会被大多数人视为敌对行为。

如前所述,nmap是一个复杂的端口扫描工具。 它试图查看主机是否“存在”,以及可能打开哪些端口。 如果没有,这些端口可能处于什么状态。 nmap具有复杂的命令行,可以执行多种类型的“扫描”。 有关所有详细信息,请参见man手册页。

首先提出几点警告。 如果使用portsentry,请关闭它。 它将删除到扫描来源的路由。 您可能还想关闭任何日志记录,或者至少要注意,如果执行多次扫描,您可能会获得大量日志。

一个简单的、默认的“localhost”扫描

 # nmap localhost

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 Interesting ports on bigcat (127.0.0.1):
 (The 1507 ports scanned but not shown below are in state: closed)

 Port       State       Service
 22/tcp     open        ssh                     
 25/tcp     open        smtp                    
 37/tcp     open        time                    
 53/tcp     open        domain                  
 80/tcp     open        http                    
 3000/tcp   open        ppp                     

 Nmap run completed -- 1 IP address (1 host up) scanned in 2 seconds

 

如果您已经阅读了本文档的大部分内容,那么现在您应该熟悉这些服务了。 这些与我们在其他示例中看到的一些相同的端口。 关于此扫描的一些注意事项:它只做了1500多个“感兴趣的”端口——而不是所有端口。 如果需要更多,可以对此进行不同的配置(请参见man手册页)。 它也只做了TCP端口。 再次强调,可配置。 它只拾取“监听”服务,不同于显示所有打开端口(监听或其他端口)的netstat。 请注意,此处最后一个“打开”的端口3000被标识为“PPP”。 错误! 这只是nmap基于以下内容做出的有根据的猜测/etc/services用于此端口号。 实际上,在这种情况下它是ntop(网络流量监视器)。 对服务名称持保留态度。 nmap不可能真正知道该端口上有什么。 将端口号与服务名称匹配有时可能存在风险。 许多端口确实具有标准端口,但没有什么可以说明它们必须使用常用的关联端口号。

请注意,在我们所有的netstat示例中,我们都有两类打开的端口:监听服务器,以及我们启动到其他远程主机的已建立的连接(例如,某处的Web服务器)。 nmap仅看到第一组——监听服务器! 连接我们到远程服务器的其他端口不可见,因此不受攻击。 这些端口对于该单个连接是“私有的”,并且将在连接终止时关闭。

因此,我们在这里有打开和关闭的端口。 足够简单,并且可以很好地了解bigcat上运行的内容——但不一定反映我们对外界的样子,因为这是从localhost完成的,并且不会反映任何防火墙或其他访问控制机制。

让我们做一个更深入的扫描。 让我们检查所有端口——TCP和UDP。

 # nmap -sT -sU -p 1-65535 localhost

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 Interesting ports on bigcat (127.0.0.1):
 (The 131050 ports scanned but not shown below are in state: closed)

 Port       State       Service
 22/tcp     open        ssh                     
 25/tcp     open        smtp                    
 37/tcp     open        time                    
 53/tcp     open        domain                  
 53/udp     open        domain                  
 80/tcp     open        http                    
 3000/tcp   open        ppp                     
 8000/tcp   open        unknown                 
 32768/udp  open        unknown                 

 Nmap run completed -- 1 IP address (1 host up) scanned in 385 seconds

 

这不仅仅是“有趣的”端口,而是所有端口。我们在过程中也发现了一些新的端口。我们之前用 netstat 见过这些端口,所以我们知道它们是什么。 它们是 8000/tcp 端口上的 Junkbuster Web 代理和 32768/udp 端口上的 named。 这种扫描需要花费更长的时间,但它是查看所有端口的唯一方法。

现在我们对 bigcat 上打开了哪些端口有了一个相当好的了解。 由于我们是从 localhost 扫描 localhost,所以一切都应该是可见的。 但是,我们仍然不知道外部世界如何看待我们。 现在我将 ssh 到同一 LAN 上的另一台主机,然后重试。

 # nmap bigcat

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 Interesting ports on bigcat (192.168.1.1):
 (The 1520 ports scanned but not shown below are in state: closed)

 Port       State       Service
 22/tcp     open        ssh
 3000/tcp   open        ppp

 Nmap run completed -- 1 IP address (1 host up) scanned in 1 second

 

我承认在这里篡改了 iptables 规则以说明问题。 只有两个可见的端口通过此扫描。 其他一切都是“关闭的”nmap 如此说。 再一次

 # nmap bigcat

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 Note: Host seems down. If it is really up, but blocking our ping probes, try -P0
 
 Nmap run completed -- 1 IP address (0 hosts up) scanned in 30 seconds

 

哎呀,这次我顺便阻止了 ICMP(ping)。 再来一次

 # nmap -P0 bigcat

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 All 1523 scanned ports on bigcat (192.168.1.1) are: filtered
 
 Nmap run completed -- 1 IP address (1 host up) scanned in 1643 seconds

 

就是这样。 注意这花费了多长时间。 注意端口现在是 “filtered(已过滤)” 而不是 “closed(已关闭)”nmap 怎么知道的? 好吧,首先,“closed(已关闭)” 意味着 bigcat 发回了一个数据包,说“此处没有运行任何程序”,即端口已关闭。 在最后一个例子中,iptables 规则被更改为不允许 ICMP(ping),并将所有传入数据包 “DROP(丢弃)”。 换句话说,没有任何响应。 这是一个细微的差别,因为即使没有给出任何响应,nmap 似乎仍然知道那里有一台主机。 这里的一个教训是,如果你想减慢扫描器的速度,就 “DROP(丢弃)”(或 “DENY(拒绝)”)这些数据包。 这会强制远程端在每个端口探测上 TCP 超时。 无论如何,如果你的扫描看起来像这样,那么这可能已经是最好的结果,并且你的防火墙正在执行其工作。

关于 UDP 的简短说明:如果这些端口是 “filtered(已过滤)”nmap 无法准确地确定这些端口的状态。 你可能会得到一个误报的 “open(已打开)” 情况。 这与 UDP 是一种无连接协议有关。 如果 nmap 没有收到任何回复(例如,由于 “DROP(丢弃)”),它会假设数据包已到达目标,因此该端口将被报告为 “open(已打开)”。 这对于 nmap 来说是“正常的”

我们可以在 LAN 设置中玩转防火墙规则,以尝试模拟外部世界如何看待我们,如果我们聪明并且知道自己在做什么,并且没有脑雾,我们可能会有一个相当好的画面。 但如果可能,最好还是设法从外部进行尝试。 再次,请确保你没有违反任何 ISP 的行为准则。 你在同一个 ISP 上有朋友吗?

8.8. Sysctl 选项

“sysctl” 选项是可以配置的内核参数,通过/proc文件系统。 这些可以在运行时动态调整。 通常,如果这些选项设置为 “0”,则它们是关闭的;如果设置为 “1”,则它们是开启的。

其中一些具有安全隐患,因此我们才在这里 ;-) 我们将只列出我们认为相关的那些。 随意将这些剪切并粘贴到防火墙脚本或其他在启动期间运行的文件中(例如/etc/rc.local)。 Red Hat 提供了 sysctl 命令来动态调整这些值(请参阅手册页)。 或者,它们可以永久地设置在/etc/sysctl.conf中使用你选择的文本编辑器。 sysctl 在 init 期间执行,并使用这些值。 你可以在/usr/src/linux/Documentation/sysctl/README和内核文档目录中的其他文件中阅读这些含义。

传统方法

#!/bin/sh
# 
# Configure kernel sysctl run-time options. 
#
###################################################################

# Anti-spoofing blocks
for i in /proc/sys/net/ipv4/conf/*/rp_filter; 
do
 echo 1 > $i
done

# Ensure source routing is OFF
for i in /proc/sys/net/ipv4/conf/*/accept_source_route;
 do
  echo 0 > $i
 done

# Ensure TCP SYN cookies protection is enabled
[ -e /proc/sys/net/ipv4/tcp_syncookies ] &&\
 echo 1 > /proc/sys/net/ipv4/tcp_syncookies 

# Ensure ICMP redirects are disabled
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; 
 do
  echo 0 > $i
 done

# Ensure oddball addresses are logged
[ -e /proc/sys/net/ipv4/conf/all/log_martians ] &&\
 echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

[ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ] &&\
 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

[ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] &&\
 echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

## Optional from here on down, depending on your situation. ############

# Ensure ip-forwarding is enabled if
# we want to do forwarding or masquerading.
[ -e /proc/sys/net/ipv4/ip_forward ] &&\
 echo 1 > /proc/sys/net/ipv4/ip_forward

# On if your IP is dynamic (or you don't know).
[ -e /proc/sys/net/ipv4/ip_dynaddr ] &&\
 echo 1 > /proc/sys/net/ipv4/ip_dynaddr        

# eof

 

使用以下方法可以获得相同的效果/etc/sysctl.conf代替

# 
# Add to existing sysctl.conf
#

# Anti-spoofing blocks
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

# Ensure source routing is OFF
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0

# Ensure TCP SYN cookies protection is enabled
net.ipv4.tcp_syncookies = 1

# Ensure ICMP redirects are disabled
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_redirects = 0

# Ensure oddball addresses are logged
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1


net.ipv4.icmp_echo_ignore_broadcasts = 1

net.ipv4.icmp_ignore_bogus_error_responses = 1

## Optional from here on down, depending on your situation. ############

# Ensure ip-forwarding is enabled if
# we want to do forwarding or masquerading.
net.ipv4.ip_forward = 1

# On if your IP is dynamic (or you don't know).
net.ipv4.ip_dynaddr = 1

# end of example

 

8.9. 安全替代方案

本节将简要介绍可能不安全方法的安全替代方案。 这将是客户端和服务器的混合体。

8.10. Ipchains 和 Iptables Redux

本节提供了对 ipchainsiptables 可以执行的一些操作的更高级的介绍。 这些基本上与上面第 3 步中的脚本相同,只是添加了一些更高级的配置选项。 这些将提供 “masquerading(伪装)”“port forwarding(端口转发)”,允许访问一些用户可定义的服务以及其他一些东西。 阅读注释以获取解释。

8.10.1. ipchains II

#!/bin/sh
#
# ipchains.sh
#
# An example of a simple ipchains configuration. This script 
# can enable 'masquerading' and will open user definable ports.
#
###################################################################
# Begin variable declarations and user configuration options ######
#
# Set the location of ipchains (default).
IPCHAINS=/sbin/ipchains

# Local Interfaces
#
# This is the WAN interface, that is our link to the outside world.
# For pppd and pppoe users.
# WAN_IFACE="ppp0"
WAN_IFACE="eth0"
#
# Local Area Network (LAN) interface.
#LAN_IFACE="eth0"
LAN_IFACE="eth1"

# Our private LAN address(es), for masquerading.
LAN_NET="192.168.1.0/24"

# For static IP, set it here! 
#WAN_IP="1.2.3.4"

# Set a list of public server port numbers here...not too many!
# These will be open to the world, so use caution. The example is
# sshd, and HTTP (www). Any services included here should be the
# latest version available from your vendor. Comment out to disable
# all PUBLIC services.
#PUBLIC_PORTS="22 80 443"
PUBLIC_PORTS="22"

# If we want to do port forwarding, this is the host 
# that will be forwarded to.
#FORWARD_HOST="192.168.1.3"

# A list of ports that are to be forwarded. 
#FORWARD_PORTS="25  80"

# If you get your public IP address via DHCP, set this.
DHCP_SERVER=66.21.184.66

# If you need identd for a mail server, set this.
MAIL_SERVER=

# A list of unwelcome hosts or nets. These will be denied access 
# to everything, even our 'PUBLIC' services. Provide your own list.
#BLACKLIST="11.22.33.44 55.66.77.88"

# A list of "trusted" hosts and/or nets. These will have access to 
# ALL protocols, and ALL open ports. Be selective here.
#TRUSTED="1.2.3.4/8  5.6.7.8"

## end user configuration options #################################
###################################################################

# The high ports used mostly for connections we initiate and return
# traffic.
LOCAL_PORTS=`cat /proc/sys/net/ipv4/ip_local_port_range |cut -f1`:\
`cat /proc/sys/net/ipv4/ip_local_port_range |cut -f2`

# Any and all addresses from anywhere.
ANYWHERE="0/0"

# Start building chains and rules #################################
#
# Let's start clean and flush all chains to an empty state.
$IPCHAINS -F  

# Set the default policies of the built-in chains. If no match for any 
# of the rules below, these will be the defaults that ipchains uses.
$IPCHAINS -P forward DENY
$IPCHAINS -P output ACCEPT
$IPCHAINS -P input DENY 

# Accept localhost/loopback traffic.
$IPCHAINS -A input -i lo -j ACCEPT

# Get our dynamic IP now from the Inet interface. WAN_IP will be our
# IP address we are protecting from the outside world. Put this
# here, so default policy gets set, even if interface is not up
# yet.
[ -z "$WAN_IP" ] &&\
  WAN_IP=`ifconfig $WAN_IFACE |grep inet |cut -d : -f 2 |cut -d \  -f 1`

# Bail out with error message if no IP available! Default policy is 
# already set, so all is not lost here.
[ -z "$WAN_IP" ] && echo "$WAN_IFACE not configured, aborting." && exit 1

WAN_MASK=`ifconfig $WAN_IFACE | grep Mask | cut -d : -f 4`
WAN_NET="$WAN_IP/$WAN_MASK"

## Reserved IPs:
#
# We should never see these private addresses coming in from outside 
# to our external interface.
$IPCHAINS -A input -l -i $WAN_IFACE -s 10.0.0.0/8     -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 172.16.0.0/12  -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 192.168.0.0/16 -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 127.0.0.0/8    -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 169.254.0.0/16 -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 224.0.0.0/4    -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 240.0.0.0/5    -j DENY
# Bogus routing
$IPCHAINS -A input -l -s 255.255.255.255 -d $ANYWHERE -j DENY

## LAN access and masquerading
#
# Allow connections from our own LAN's private IP addresses via the LAN
# interface and set up forwarding for masqueraders if we have a LAN_NET
# defined above. 
if [ -n "$LAN_NET" ]; then 
 echo 1 > /proc/sys/net/ipv4/ip_forward
 $IPCHAINS -A input  -i $LAN_IFACE  -j ACCEPT
 $IPCHAINS -A forward -s $LAN_NET -d $LAN_NET -j ACCEPT
 $IPCHAINS -A forward  -s $LAN_NET -d ! $LAN_NET -j MASQ
fi

## Blacklist hosts/nets
#
# Get the blacklisted hosts/nets out of the way, before we start opening 
# up any services. These will have no access to us at all, and will be
# logged.
for i in $BLACKLIST; do
 $IPCHAINS -A input -l -s $i -j DENY
done

## Trusted hosts/nets
#
# This is our trusted host list. These have access to everything.
for i in $TRUSTED; do
 $IPCHAINS -A input -s $i -j ACCEPT
done

# Port Forwarding
#
# Which ports get forwarded to which host. This is one to one 
# port mapping (ie 80 -> 80) in this case.
# NOTE: ipmasqadm is a separate package from ipchains and needs 
# to be installed also. Check first!
[ -n "$FORWARD_HOST" ] && ipmasqadm portfw -f &&\
 for i in $FORWARD_PORTS; do
   ipmasqadm portfw -a -P tcp -L $WAN_IP $i -R $FORWARD_HOST $i
 done

## Open, but Restricted Access ports/services
#
# Allow DHCP server (their port 67) to client (to our port 68) UDP traffic
# from outside source.
[ -n "$DHCP_SERVER" ] &&\
 $IPCHAINS -A input -p udp -s $DHCP_SERVER 67 -d $ANYWHERE 68 -j ACCEPT 

# Allow 'identd' (to our TCP port 113) from mail server only.
[ -n "$MAIL_SERVER" ] &&\
 $IPCHAINS -A input -p tcp -s $MAIL_SERVER  -d $WAN_IP 113 -j ACCEPT 

# Open up PUBLIC server ports here (available to the world):
for i in $PUBLIC_PORTS; do
 $IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP $i -j ACCEPT 
done

# So I can check my home POP3 mailbox from work. Also, so I can ssh 
# in to home system. Only allow connections from my workplace's
# various IPs. Everything else is blocked.
$IPCHAINS -A input -p tcp -s 255.10.9.8/29 -d $WAN_IP 110 -j ACCEPT 

# Uncomment to allow ftp data back (active ftp). Not required for 'passive'
# ftp connections.
#$IPCHAINS -A input -p tcp -s $ANYWHERE 20 -d $WAN_IP $LOCAL_PORTS -y -j ACCEPT

# Accept non-SYN TCP, and UDP connections to LOCAL_PORTS. These are
# the high, unprivileged ports (1024 to 4999 by default). This will
# allow return connection traffic for connections that we initiate
# to outside sources. TCP connections are opened with 'SYN' packets.
# We have already opened those services that need to accept SYNs
# for, so other SYNs are excluded here for everything else.
$IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS ! -y -j ACCEPT 

# We can't be so selective with UDP since that protocol does not know 
# about SYNs.
$IPCHAINS -A input -p udp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS -j ACCEPT 

# Allow access to the masquerading ports conditionally. Masquerading
# uses it's own port range -- on 2.2 kernels ONLY! 2.4 kernels, do not 
# use these ports, so comment out!
[ -n "$LAN_NET" ] &&\
 $IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP 61000: ! -y -j ACCEPT &&\
 $IPCHAINS -A input -p udp -s $ANYWHERE -d $WAN_IP 61000: -j ACCEPT

## ICMP (ping)
#
# ICMP rules, allow the bare essential types of ICMP only. Ping
# request is blocked, ie we won't respond to someone else's pings,
# but can still ping out. 
$IPCHAINS -A input  -p icmp  --icmp-type echo-reply \
   -s $ANYWHERE -i $WAN_IFACE -j ACCEPT
$IPCHAINS -A input  -p icmp  --icmp-type destination-unreachable \
   -s $ANYWHERE -i $WAN_IFACE -j ACCEPT
$IPCHAINS -A input  -p icmp  --icmp-type time-exceeded \
   -s $ANYWHERE -i $WAN_IFACE -j ACCEPT

#######################################################################
# Set the catchall, default rule to DENY, and log it all. All other
# traffic not allowed by the rules above, winds up here, where it is
# blocked and logged. This is the default policy for this chain
# anyway, so we are just adding the logging ability here with '-l'.
# Outgoing traffic is allowed as the default policy for the 'output'
# chain. There are no restrictions on that.

$IPCHAINS -A input -l -j DENY

echo "Ipchains firewall is up `date`."

##-- eof ipchains.sh

 

8.10.2. iptables II

#!/bin/sh
#
# iptables.sh
#
# An example of a simple iptables configuration. This script 
# can enable 'masquerading' and will open user definable ports.
#
###################################################################
# Begin variable declarations and user configuration options ######
#
# Set the location of iptables (default).
IPTABLES=/sbin/iptables

# Local Interfaces
# This is the WAN interface that is our link to the outside world.
# For pppd and pppoe users.
# WAN_IFACE="ppp0"
WAN_IFACE="eth0"
#
# Local Area Network (LAN) interface.
#LAN_IFACE="eth0"
LAN_IFACE="eth1"

# Our private LAN address(es), for masquerading.
LAN_NET="192.168.1.0/24"

# For static IP, set it here! 
#WAN_IP="1.2.3.4"

# Set a list of public server port numbers here...not too many!
# These will be open to the world, so use caution. The example is
# sshd, and HTTP (www). Any services included here should be the
# latest version available from your vendor. Comment out to disable
# all Public services. Do not put any ports to be forwarded here,
# this only direct access.
#PUBLIC_PORTS="22 80 443"
PUBLIC_PORTS="22"

# If we want to do port forwarding, this is the host 
# that will be forwarded to.
#FORWARD_HOST="192.168.1.3"

# A list of ports that are to be forwarded. 
#FORWARD_PORTS="25  80"

# If you get your public IP address via DHCP, set this.
DHCP_SERVER=66.21.184.66

# If you need identd for a mail server, set this.
MAIL_SERVER=

# A list of unwelcome hosts or nets. These will be denied access 
# to everything, even our 'Public' services. Provide your own list.
#BLACKLIST="11.22.33.44 55.66.77.88"

# A list of "trusted" hosts and/or nets. These will have access to 
# ALL protocols, and ALL open ports. Be selective here.
#TRUSTED="1.2.3.4/8  5.6.7.8"

## end user configuration options #################################
###################################################################

# Any and all addresses from anywhere.
ANYWHERE="0/0"

# These modules may need to be loaded:
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

# Start building chains and rules #################################
#
# Let's start clean and flush all chains to an empty state.
$IPTABLES -F
$IPTABLES -X


# Set the default policies of the built-in chains. If no match for any 
# of the rules below, these will be the defaults that IPTABLES uses.
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P INPUT DROP 

# Accept localhost/loopback traffic.
$IPTABLES -A INPUT -i lo -j ACCEPT

# Get our dynamic IP now from the Inet interface. WAN_IP will be the
# address we are protecting from outside addresses.
[ -z "$WAN_IP" ] &&\
  WAN_IP=`ifconfig $WAN_IFACE |grep inet |cut -d : -f 2 |cut -d \  -f 1`

# Bail out with error message if no IP available! Default policy is 
# already set, so all is not lost here.
[ -z "$WAN_IP" ] && echo "$WAN_IFACE not configured, aborting." && exit 1

WAN_MASK=`ifconfig $WAN_IFACE |grep Mask |cut -d : -f 4`
WAN_NET="$WAN_IP/$WAN_MASK"

## Reserved IPs:
#
# We should never see these private addresses coming in from outside 
# to our external interface.
$IPTABLES -A INPUT -i $WAN_IFACE -s 10.0.0.0/8      -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 172.16.0.0/12   -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 192.168.0.0/16  -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 127.0.0.0/8     -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 169.254.0.0/16  -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 224.0.0.0/4     -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 240.0.0.0/5     -j DROP
# Bogus routing
$IPTABLES -A INPUT -s 255.255.255.255 -d $ANYWHERE -j DROP

# Unclean
$IPTABLES -A INPUT -i $WAN_IFACE -m unclean -m limit \
  	--limit 15/minute -j LOG --log-prefix "Unclean: "
$IPTABLES -A INPUT -i $WAN_IFACE -m unclean -j DROP

## LAN access and masquerading
#
# Allow connections from our own LAN's private IP addresses via the LAN
# interface and set up forwarding for masqueraders if we have a LAN_NET
# defined above. 
if [ -n "$LAN_NET" ]; then 
 echo 1 > /proc/sys/net/ipv4/ip_forward
 $IPTABLES -A INPUT -i $LAN_IFACE  -j ACCEPT
# $IPTABLES -A INPUT -i $LAN_IFACE -s $LAN_NET -d $LAN_NET  -j ACCEPT  
 $IPTABLES -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IFACE -j MASQUERADE
fi

## Blacklist
#
# Get the blacklisted hosts/nets out of the way, before we start opening 
# up any services. These will have no access to us at all, and will 
# be logged.
for i in $BLACKLIST; do
 $IPTABLES -A INPUT -s $i -m limit --limit 5/minute \
   -j LOG --log-prefix "Blacklisted: "
 $IPTABLES -A INPUT -s $i -j DROP
done

## Trusted hosts/nets
#
# This is our trusted host list. These have access to everything.
for i in $TRUSTED; do
 $IPTABLES -A INPUT -s $i -j ACCEPT
done

# Port Forwarding
#
# Which ports get forwarded to which host. This is one to one 
# port mapping (ie 80 -> 80) in this case.
[ -n "$FORWARD_HOST" ] &&\
 for i in $FORWARD_PORTS; do
   $IPTABLES -A FORWARD -p tcp -s $ANYWHERE -d $FORWARD_HOST \
     --dport $i -j ACCEPT
   $IPTABLES -t nat -A PREROUTING -p tcp -d $WAN_IP --dport $i \
     -j DNAT --to $FORWARD_HOST:$i
 done

## Open, but Restricted Access ports
#
# Allow DHCP server (their port 67) to client (to our port 68) UDP
# traffic from outside source.
[ -n "$DHCP_SERVER" ] &&\
 $IPTABLES -A INPUT -p udp -s $DHCP_SERVER --sport 67 \
   -d $ANYWHERE --dport 68 -j ACCEPT 

# Allow 'identd' (to our TCP port 113) from mail server only.
[ -n "$MAIL_SERVER" ] &&\
 $IPTABLES -A INPUT -p tcp -s $MAIL_SERVER  -d $WAN_IP --dport 113 -j ACCEPT 

# Open up Public server ports here (available to the world):
for i in $PUBLIC_PORTS; do
 $IPTABLES -A INPUT -p tcp -s $ANYWHERE -d $WAN_IP --dport $i -j ACCEPT 
done

# So I can check my home POP3 mailbox from work. Also, so I can ssh 
# in to home system. Only allow connections from my workplace's
# various IPs. Everything else is blocked.
$IPTABLES -A INPUT -p tcp -s 255.10.9.8/29 -d $WAN_IP --dport 110 -j ACCEPT 

## ICMP (ping)
#
# ICMP rules, allow the bare essential types of ICMP only. Ping
# request is blocked, ie we won't respond to someone else's pings,
# but can still ping out.
$IPTABLES -A INPUT  -p icmp  --icmp-type echo-reply \
   -s $ANYWHERE -d $WAN_IP -j ACCEPT
$IPTABLES -A INPUT  -p icmp  --icmp-type destination-unreachable \
   -s $ANYWHERE -d $WAN_IP -j ACCEPT
$IPTABLES -A INPUT  -p icmp  --icmp-type time-exceeded \
   -s $ANYWHERE -d $WAN_IP -j ACCEPT

# Identd Reject
#
# Special rule to reject (with rst) any identd/auth/port 113
# connections. This will speed up some services that ask for this,
# but don't require it. Be careful, some servers may require this
# one (IRC for instance).
#$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

###################################################################
# Build a custom chain here, and set the default to DROP. All
# other traffic not allowed by the rules above, ultimately will
# wind up here, where it is blocked and logged, unless it passes
# our stateful rules for ESTABLISHED and RELATED connections. Let
# connection tracking do most of the worrying! We add the logging
# ability here with the '-j LOG' target. Outgoing traffic is
# allowed as that is the default policy for the 'output' chain.
# There are no restrictions placed on that in this script.

# New chain...
$IPTABLES -N DEFAULT
# Use the 'state' module to allow only certain connections based 
# on their 'state'.
$IPTABLES -A DEFAULT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A DEFAULT -m state --state NEW -i ! $WAN_IFACE -j ACCEPT
# Enable logging for anything that gets this far.
$IPTABLES -A DEFAULT -j LOG -m limit --limit 30/minute --log-prefix "Dropping: "
# Now drop it, if it has gotten here.
$IPTABLES -A DEFAULT -j DROP

# This is the 'bottom line' so to speak. Everything winds up
# here, where we bounce it to our custom built 'DEFAULT' chain
# that we defined just above. This is for both the FORWARD and 
# INPUT chains. 

$IPTABLES -A FORWARD -j DEFAULT
$IPTABLES -A INPUT   -j DEFAULT

echo "Iptables firewall is up `date`."

##-- eof iptables.sh
 
 

8.10.3. 总结

快速回顾一些亮点...

我们添加了一些基于主机的访问控制规则:“blacklisted(黑名单)”“trusted(受信任)”。 然后,我们展示了几种类型的基于服务和端口的访问规则。 例如,我们允许对 bigcat 的 POP3 服务器进行非常严格的访问,以便我们只能从我们的工作场所连接。 我们为 ISP 的 DHCP 服务器允许了一个非常狭窄的规则。 此规则仅允许一个外部 IP 地址上的一个端口连接到我们的一个端口,并且仅通过 UDP 协议。 这是一个非常具体的规则! 我们这样做是因为没有理由允许任何其他流量流向这些端口或来自这些地址。 请记住,我们的目标是为我们的特定情况提供所需的最小流量。

因此,我们做出了上述几个例外情况,并且 bigcat 上运行的所有其他服务都应该被有效地完全阻止来自外部连接。 这些服务仍然在 bigcat 上愉快地运行,但现在安全可靠地位于我们的数据包过滤防火墙之后。 你可能还有其他服务也属于此类别。

在上面的例子中,我们也有一个小型家庭网络。 我们没有采取任何措施来阻止该流量。 因此,LAN 可以访问 bigcat 上运行的所有服务。 并且它被进一步 “masqueraded(伪装)”,以便它可以通过操纵 “forward(转发)” 链来访问互联网(不同的 HOWTO)。 并且 LAN 仍然受到我们防火墙的保护,因为它位于防火墙之后。 我们也没有对离开 bigcat 的流量施加任何限制性规则。 在某些情况下,这可能是一个好主意。

当然,这只是一个假设的例子。 你的个人情况肯定不同,并且需要对上述规则进行一些更改,可能还需要进行一些补充。 例如,如果你的 ISP 不使用 DHCP(大多数都不使用),那么该规则就没有意义。PPP 的工作方式不同,不需要这样的规则。

请不要将像我们在本示例中那样运行任何服务器解释为一定是“安全” 的事情。 除非 a) 我们真的需要这样做,并且 b) 我们正在运行当前的、安全的版本,并且 c) 我们能够及时了解可能影响这些服务的安全相关问题,否则我们不应该这样做。 警惕和谨慎也是我们在这里的责任。