8. 附录

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

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

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

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

即使我们并非一直连接到真正的网络,我们仍然可以说是 “联网” 的。以我们友好的本地 X 服务器为例。我们可能倾向于认为这只是提供了一个 GUI 界面,这在某种程度上是正确的。它通过 “服务” 于客户端应用程序来实现这一点,因此它确实是一个服务器。但是 X Windows 也能够为网络上的远程客户端提供服务——甚至是像互联网这样的大型网络。尽管我们可能真的不想这样做 ;-)

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

在 TCP/IP(传输控制协议/互联网协议)网络(例如我们讨论的 Linux 和互联网)中,每台连接的计算机都有一个唯一的 “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 下载之后。请注意,虽然我连接到他们在端口 21 上的 FTP 服务器,但我 FTP 客户端使用的端口号是 1359。这是一个随机分配的 “非特权” 端口,用于我的双向 “对话” 的一端。数据在两个方向上移动:我:端口#1359 <-> 他们:端口#21。FTP 协议实际上比这更复杂一些,但我们在这里不会深入研究更精细的点。

CLOSE_WAIT是此时连接的 TCP 状态。最终,连接将在两端完全关闭,netstat 将不会显示任何相关信息。

用于我连接端的 “非特权” 端口是临时的,与本地运行的服务器无关。当连接终止时,它将由内核关闭。这与 “监听” 服务器保持打开的端口非常不同,后者是永久性的,即使在远程连接终止后也保持 “打开” 状态。

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

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

关于客户端和服务器之间区别的最后一点。上面的示例在LISTENER部分的 netstat 示例中没有 telnetftp 服务器。换句话说,没有这样的服务器在本地运行。您不需要运行 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 或 “提交”,邮件提交代理协议。大多数 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 输出也没有反映是否可能存在防火墙来过滤传入连接。此时我们无法判断。显然,对于某些服务器来说,这是非常可取的。例如,您自己的局域网之外的任何人都没有任何理由连接到您的打印服务器端口。

第二行有点不同

 tcp        0      0 127.0.0.1:8000         0.0.0.0:*          LISTEN     

 

请注意,这次 “本地地址” 是 localhost 的地址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 是 “时间” 服务,这是一个时间服务器。6000 是 X11,80 是 HTTP 服务器(如 Apache)的标准端口。这里没有什么真正不寻常的,因为这些都是 Linux 上所有 readily available 的服务。

以上前两个绝对不是您希望任何人都能连接的服务类型。这些服务应该被防火墙隔离,以便拒绝所有外部连接。同样,我们无法从该输出中判断是否已部署任何防火墙,更不用说其有效实施程度了。

端口 80 上的 Web 服务器本身并不是一个巨大的安全风险。HTTP 是一种通常对所有访问者开放的协议。例如,如果我们想托管自己的主页,Apache 当然可以为我们做到这一点。也可以将其防火墙隔离,使其仅供我们的局域网客户端作为 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 接口(localhost)以及将 bigcat 连接到局域网的接口。因此,内核仅允许来自 localhost 和局域网的连接。根本不会有端口 53 可用于外部连接。这是一个很好的例子,说明有时可以安全地配置单个应用程序。在这种情况下,我们可能正在查看缓存 DNS 服务器,因为负责处理 DNS 查询的真正名称服务器必须将端口 53 对世界开放。这是一个安全风险,需要特殊处理。

最后三个LISTENER条目

 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,安全外壳服务器守护程序。这是一个好兆头!请注意,如果我们查看第一个示例中的输出,端口 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(新闻)端口。这里有三个连接到同一新闻服务器。显然,该应用程序是多线程的,因为它正在尝试打开与新闻服务器的多个连接。接下来的两个条目是与远程 Web 服务器的连接,如第五列中冒号后的端口 80 所示。对于我们大多数人来说,这可能是一个非常常见的条目。但是紧随其后的那个是相反的,并且在第四列中有端口 80,因此这是某人通过其外部、面向互联网的接口连接到 bigcat 的 Web 服务器。最后三个条目都是从 localhost 到 localhost 的连接。因此,我们在这里连接到自己。回想起上面端口 8000 是 bigcat 的 Web 代理,这是一个连接到本地运行的代理的 Web 浏览器。然后,代理将打开自己的外部连接,这可能就是第 4 行和第 5 行正在发生的事情。

由于我们给 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 上的打印机守护程序是通过 PID 为 “988”inetd 启动的。inetd 是一种特殊情况。inetd 通常被称为 “超级服务器”,因为它的主要作用是生成子服务。如果我们查看第一行,inetd 正在端口 515 上监听打印机服务。如果此端口有连接进来,inetd 会拦截它,然后将生成适当的守护程序,即本例中的打印守护程序。inetd 如何处理此问题的配置通常在/etc/inetd.conf中完成。这应该告诉我们,如果我们想永久停止 inetd 控制的服务器,那么我们将不得不深入研究 inetd(或可能是 xinetd)配置。上面的时间服务也是通过 inetd 启动的。这也应该告诉我们,这两种服务都可以通过 tcpwrappers 进一步保护(在上面的步骤 3 中讨论过)。这是使用 inetd 控制某些系统服务的好处之一。

我们不确定上面端口 631 上的服务,因为它没有标准的服务名称,这意味着它可能是有些不寻常或非常规的东西。现在我们看到它由 cupsd 拥有,cupsd 是 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 媲美的邮件服务器软件包。

使用--forest标志(-fps

 $ /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 /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

 

如果所有这些都没有提供任何线索,我们也可以尝试 locate

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

 

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

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

 

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

 # fuser -v -n tcp 631

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

 

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

有关 fuserlsof 命令语法的更多信息,请参阅手册页。init.d目录,实际的init脚本存放的地方(对于SysVinit系统)。例如:ls -l /etc/init.d/,应该会列出这些脚本。通常脚本名称本身会暗示它启动哪些服务,尽管它可能不一定完全匹配 "Program Name" (程序名称),如 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          

 

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

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

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

Warning

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

8.4. 攻击和威胁

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

与典型的家庭桌面用户相比,企业界、政府机构和高调的互联网站点必须关注更多样化和更具挑战性的威胁。有人可能想要入侵别人的计算机有很多原因。可能只是为了好玩,或者出于各种恶意原因。他们可能只是想要一个基地来攻击其他人。这是一个非常常见的动机。

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

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

8.4.1. 端口扫描和探测

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

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

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

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

8.4.3. 蠕虫和僵尸网络

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

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

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

虽然这听起来可能不祥,但一些简单的预防措施可以有效地阻止此类攻击。有这么多容易攻击的受害者,为什么要浪费大量精力入侵您的系统?真的没有动力去非常努力地尝试。只需扫描、查看、尝试,如果不成功就继续前进。总是有更多的 IP 地址可以扫描。如果您的防火墙有效地阻止了这类事情,那么这对您根本没有威胁。对此感到安慰,不要过度反应。

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

8.5. 链接

下面列出了一些供进一步阅读的参考文献。未列出的是您的发行版的站点、安全页面或 ftp 下载站点。您将不得不自己找到这些。然后您应该将它们加入书签!

8.6. 编辑文本文件

比尔·斯塔勒 著

世界皆文件。

文件有很多类型,但我在这里要扩展一下,将它们分为两个非常广泛的类别



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

    

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

在 *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')。在大多数安装中,在 'less' 中意外按下 'v' 键会启动 'vi'。

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

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

也就是说:冒号,字母 Q,然后是感叹号,后跟 Enter 键。

'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

 

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

关于 UDP 的简要说明:如果 UDP 端口被"过滤"nmap 无法准确确定这些端口的状态。您可能会得到误报的"打开"状态。这与 UDP 是一种无连接协议有关。如果 nmap 没有得到答案(例如,由于 "DROP"),它会假设数据包已到达目标,因此该端口将被报告为"打开"。这对于 nmap 来说是"正常的"

我们可以在 LAN 设置中摆弄防火墙规则,以尝试模拟外部世界如何看待我们,如果我们很聪明,并且知道我们在做什么,并且没有脑雾,我们可能会有一个相当好的画面。但如果可能,最好还是尝试从外部找到一种方法来做到这一点。再次强调,请确保您没有违反任何 ISP 的行为准则。您有在同一 ISP 的朋友吗?

8.8. Sysctl 选项

"sysctl" 选项是内核参数,可以通过以下方式配置/proc文件系统。这些可以在运行时动态调整。通常,如果设置为 "0",这些选项将关闭,如果设置为 "1",则打开。

其中一些具有安全隐患,因此这就是我们在这里的原因 ;-) 我们将只列出我们认为相关的那些。随意将这些剪切并粘贴到防火墙脚本或在启动期间运行的其他文件中(例如/etc/rc.local)。或者您的发行版可能有自己的调整方式。您可以在以下位置阅读这些内容的含义/usr/src/linux/Documentation/sysctl/README以及内核 Documentation 目录中的其他文件。

#!/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

 

8.9. 安全替代方案

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

8.10. Ipchains 和 Iptables Redux

本节更深入地介绍了 ipchainsiptables 可以做的一些事情。这些基本上与上面步骤 3 中的脚本相同,只是添加了一些更高级的配置选项。这些将提供"伪装""端口转发",允许访问一些用户可定义的服务以及其他一些功能。请阅读注释以获取解释。

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. 总结

快速回顾一下一些亮点...

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

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

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

当然,这只是一个假设的例子。您的个人情况肯定有所不同,并且需要对上述规则进行一些更改,甚至可能需要添加一些规则。例如,如果您的 ISP 不使用 DHCP(大多数 ISP 都不使用),那么该规则将毫无意义。PPP 的工作方式不同,因此不需要此类规则。

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