当前位置:Linux教程 - Linux文化 - TCPD 与使用 IPFWADM 来设定防火墙

TCPD 与使用 IPFWADM 来设定防火墙


内容摘要: 本文扼要地介绍, 在系统里设定 inetd 服务, 以增进系统安全的方法, 我们把焦点放在 IPFWADM 这个系统管理工具, 以及 inetd 服务的设定上面。


----------------------------------------------------------------

首先, 我们必须厘清什麽是 inetd。 简单地说, inetd 是一个伺服程式, 用以控制主机连上网路时, 所提供的各项服务。 您有可能会遇到一部电脑, 其预设状况并未设定好 inetd 来控制所有的服务, 因此, 第一件事, 便是找出 /etc/inetd.conf 档案, 并检查有哪些现存的服务由它控制 ( 也就是没有 "#" 符号开头的那几行内容 )。 给您的第一个忠告就是, 除非真的需要这项服务, 不然千万别启动它, 那些从未使用的伺服程式里, 可能藏有臭虫, 避免有人利用此类漏洞入侵的最好方法, 就是不要用它。 假设读者手边有一份 inet.conf 档案的内容, 接下来我就解译一下里头的意义。

举例来说, 下面这一行:


ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a

第一个字是所提供的服务名称 ( 本例中指的是 "ftp", 我们可以另外在 /etc/services 档案里, 查出它所连结的是哪一个埠号 )。

第二个栏位是所开启的 socket 类型,它可以是: stream ( 如本例即是 )、 dgram、 raw、 rdm、 或 seqpacket。

接下来的栏位是所使用的通讯协定, 您必须先在 /etc/protocols 档案中宣告, 在前例中, 我们假定您已经在此档里宣告了 TCP 通讯协定。

在通讯协定之後, 接著是 wait/nowait 的栏位。 除了 datagram (dgram) 类型之外的 socket, 其他都应该是 nowait, 至於 datagram 类型的 socket, 如果伺服程式支援多执行绪, 那麽我们应该设定 nowait, 如果伺服程式仅支援单一执行绪, 那麽请设定为 wait。 原因是多执行绪系统, 当其收到连线要求时, 它会启动一个新的 process, 然後再把原本的 socket 释放掉, 让 inetd 可以继续 listen 其他的连线要求, 因此要使用 nowait。 在单一执行绪系统的场合, 则需要设定为 wait, 因为伺服程式会一直守著同一个 socket, 而不能另外产生 process 以供连结。 除此之外, 还有一些格式上的变化, 我们可以写成 nowait.50 -- 代表短时间内, 最多可以启动 50 个伺服程式 ( 从另一个角度来看, 或者可以说, 是接受这麽多个连线要求 )。 其预设值是 40 个。

第五个栏位, 指明了伺服程式, 是以哪位使用者的名称来执行, 在这个例子中, ftp 是以 root 这个使用者名称来执行。

第六个以及接下来的栏位, 便是执行的程式与其所接的参数了。 在我们的例子当中, 伺服程式 tcpd 被启动, 後头接了伺服程式 in.ftpd 与 -l -a 为参数。 接下来, 我们就要来谈谈最有趣的部份, TCPD 的设定问题。

嗯, tcpd 是个用来过滤连线要求的伺服程式, 它会根据哪个伺服程式即将被启动, 来决定做哪些事, 以向提出这些连线要求的 IP 位址, 做出回应的动作。 而究竟会怎麽做决定, 则视 /etc/hosts.allow 与 /etc/hosts.deny 这两个档案如何设定。

原则上, /etc/hosts.deny 档案是用来指定拒绝向哪些主机提供服务, 而 /etc/hosts.allow 档案则是用来指定允许向哪些 机提供服务。

这两个档案的设定格式如下:


DAEMON: IP[: OPTION1 [: OPTION2 ]]

上述的 DAEMON, 可以是想要启动的伺服程式名称, 如前例中所示的 in.ftpd, 或者是 ALL 这个字, 它代表著所有的伺服程式。

IP 可以是某个特定的 IP, 或是某个 URL, 或是某一范围的 IP ( 或 URL ), 或者是等一下会解释到的万用字。

为了能够指定某一范围的 IP 位址, 例如说, 我们可以这样写: `123.32, 这个表示方式, 代表了 123.32.XXX.XXX 的所有 IP, 同样地, 像 `.ml.org 可以用来指定某一范围的 URL, 它代表所有 ml.org 底下的子网路。

以 IP/MASK 之格式来指定某一范围的 IP, 则是更为传统的方法, 举例来说, 从 127.0.0.0 到 127.0.255.255, 此一范围的 IP 可被指定为 127.0.0.0/255.255.0.0

前面提到的万用字有:


ALL 代表档案里, 所有可能的数值都是允许的LOCAL 会符合到所有名称里没有 ^?^?的主机UNKNOWN 代表所有名称或 IP 位址为未知的主机KNOWN 代表所有名称及 IP 位址均为已知的主机PARANOID 代表所有名称与 IP 位址并不一致的主机

前面提到的选项有:

allow 不管 hosts.allow 与 hosts.deny 档案里的设定为何, 符合此一设定条件者, 都接受其连线要求。 这个选项设定, 应该置於该行的最後面。
deny 类似上面的选项设定, 不过, 它是用来指定拒绝连线的条件。
spawn 当收到连线要求时, 会启动一个命令壳的指令, 譬如说, 可以在每次有人想要从外面, 连进我的机器时, 执行一个哔声通知。
twist 这个和 spawn 选项类似, 不过, 当命令壳指令执行完毕後, 连线状态便会中断。 此一选项, 同样必须置於设定行的最後面。

上述的最後两个选项, 还可以配合适当的扩充字元给 tcpd 使用, 这些扩充字元有:

%a 客户端主机的位址
%c 客户端的资讯 ( 可能是像 user@machine, 或是其他由客户端所得的资讯 )
%d
%h 在可以取得的情况下, 这会代表客户端的名称或 IP 位址
%n 客户端的名称
%p 伺服程式的 PID
%s 伺服端的资讯 ( 例如 daemon@machine 或只有 daemon 之资讯, 视情况而定 )
%u 客户端使用者的名称
%% 这是表示 % 这个字元

配合这些扩充字元与选页, 您已经可以做很多事了, 例如, 我知道有人设定成, 一旦有人想要经由 telnet 连进他的主机, 便自动送出一个 teardrop 攻击 :)

附注: teardrop 是一种 Dos ( Denial of Service, 会造成系统重新开机, 或重新起始化的攻击方式 )。 它是因为 TCP 封包重组时的臭虫而起, 多数的作业系统都有这个问题 ( 或者说, 以往的作业系统是如此, 因为许多的核心程式已经针对此问题, 加以修正了 ), 在 InterNet 上的资料, 是透过 TCP/IP 通讯协定来传送 ( 此一通讯定, 在其他类型的网路上也可以看到, 譬如像 intranet 就是 ), 实际上, 它是两种通讯协定: TCP 负责将资料, 加以分割成一段段的封包, 然後再把它传给 IP 通讯协定, 由它送往目的地; 一旦资料送达目的主机後, TCP 通讯协定会检查, 是否所有封包都完整, 然後再将它们重组成原本的资料。 然而, 上述 ( 以及许多根据此一原理 ) 的攻击方式, 利用多数的作业系统, 在重组封包之前, 不会检查封包过小的问题, 因此, 这样的机器在重组封包後, 就会发生错乱的状况。 显然地, 对此在下并不确定怎样才是完整的解释, 因此欢迎大家提出各式批评与指教。 好的, 经过上述的简短解释後, 让我们继续...

例:


#hosts.allow

ALL: 127.0.0.1 # 允许 localhost 进入做所有事

in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruder.wav & )
# 让所有人都可以透过 ftp 进入,
# 但会启动一个声音档 ( 因此它可以警告我 )

in.telnetd: ALL: twist ( teardrop %h %h )
# 所有人想要透过 telnet 的话,
# 送回一个 teardrop 的攻击

#fin

#hosts.deny

ALL: `.bsa.org # 禁止来自 bsa.org 网域的所有连线

in.fingerd: ALL # 禁止所有的 fingerd 服务 :)

#fin

关於 tcpd, 我想说的就是这些了, 因为所学有限, 可能讲得不够好。 在下的建议是, 试著去实验一些设定项目, 并且熟读线上手册 ( tcpd, host_acess(5) 的 manual pages ), 相信读者可以学得比我所教的还要多。

接下来, 让我们进入

I

PFWADM

具程式的部分。


首先, 不可或缺的是, 要把核心程式中, 有关 IP Firewalling 的支援加入 ( Networking -> Network firewalls + IP: firewalling )。 接下来, 重新编译及系统重新开机後, 我们就准备好可以使用这个工具了。

IPFWADM 可以让我们管理某些程式 ( 这些应用程式, 并不限於我在本文中所介绍的 ), 其 TCP、 UDP、 ICMP 封包的进出状况。 简单地说, 管理员可以规定哪些封包才允许进入, 可以指定的条件包括: 来自於某个 IP、 或某段 IP 范围的主机, 哪一个特定的埠号, 哪一种特定的通讯协定, 或是上述各种条件的组合... 同样地, 对於准备送往主机外的封包, 我们也可以具有相同程度的管理控制。

ipfwadm 有几种主要的参数:

-A 指定记录 (accounting) 之处理方式
-I 指定准备进入主机内的封包 (incoming packets) 之处理方式
-O 指定准备送往主机外的封包 (outgoing packets) 之处理方式
-F 指定封包转送 (forwarding) 之处理方式
-M 用来进行 IP masquareding 的管理
本文中, 我只打算介绍 -I 与 -O 参数, 它们两者都具有相同的语法。

这些参数的选项有:

-a 在表单後面加进一个或多个处理方式
-i 在表单前面加入一个或多个处理方式
-d 从表单里面删除一个或多个处理方式
-l 显示表单上面的处理方式
-f 删除表单上面所有的处理方式
-p 指定哪些封包一定被 acceppted (a)、 denied (d) 或 rejected (r)
-c 检查某个封包准备进入时, 其应用哪些处理方式
-h 辅助说明
重要的参数有:

-P 指定某个表单上, 处理方式所作用到的通讯协定。 这里的通讯协定, 可以是 TCP、 UDP、 ICMP 或 all ( 表示所有的通讯协定 )
-S 指定封包的来源位址。 其格式为: ADDRESS[/MASK] [PORT] 举例来说, 像这样 123.32.34.0/255.255.255.250 25 便代表从 123.32.34.0 到 123.32.34.5 的 IP 范围
-D 指定封包的目的位址, 其格式与 -S 相同

原则上, 这些都是最基本的参数, 因此, 想要让所有从我的电脑发出的封包, 能够到达我自己的电脑, 可以这样设定处理方式:

i

pfwadm -I -i a -S 127.0.0.1


还想要挡掉来自於 123.34.22.XXX 的封包, 可以这样设定:

i

pfwadm -I -a d -S 123.34.22.0/255.255.255.0


接下来, 如果除了 111.222.123.221 这个 IP 之外, 我想要挡掉所有其他对於 netbios 埠号的连线要求, 可以这样设定:

i

pfwadm -I -a a -P tcp -S 111.222.123.221 139
ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139

好吧, 我想这就是文章的全部了, 写得有点不好, 所学不精罗 O:)


摘自:Linux文摘