下一页 上一页 目录

8. IP 过滤设置 (IPCHAINS)

Linux ipchains 是 Linux IPv4 防火墙代码的重写版本,也是 ipfwadm 的重写版本,而 ipfwadm 我相信又是 BSD 的 ipfw 的重写版本。在 Linux 内核版本 2.1.102 及更高版本中,管理 IP 数据包过滤器是必需的。

较旧的代码无法处理分片,具有 32 位计数器(至少在 Intel 上是这样),不允许指定除 TCP、UDP 或 ICMP 以外的协议,无法原子性地进行大型更改,无法指定反向规则,存在一些怪癖,并且难以管理(容易导致用户错误)。作者是这么说的。

我不打算深入探讨如何控制 IPChains 防火墙,因为在 http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html 上有一个非常棒的 HOWTO 介绍了它。我只是在这里重复一遍。这里是基础知识。

你通过名称来操作链。你从三个内置链 input、output 和 forward 开始,这些链你无法删除。你可以创建自己的链。然后可以从这些规则集中添加和删除规则。

对整个链进行操作的操作有:

  1. 创建新链 (-N)。
  2. 删除空链 (-X)。
  3. 更改内置链的策略。(-P)。
  4. 列出链中的规则 (-L)。
  5. 清空链中的规则 (-F)。
  6. 将链中所有规则的数据包和字节计数器归零 (-Z)。

有几种方法可以操作链内的规则

  1. 将新规则附加到链末尾 (-A)。
  2. 在链中的某个位置插入新规则 (-I)。
  3. 替换链中某个位置的规则 (-R)。
  4. 删除链中某个位置的规则 (-D)。
  5. 删除链中第一个匹配的规则 (-D)。

有一些用于地址伪装的操作,它们在 ipchains 中是因为没有更好的地方放置它们

  1. 列出当前伪装的连接 (-M -L)。
  2. 设置地址伪装超时值 (-M -S)。

在更改防火墙规则时,会涉及到一些时间问题。如果不小心,在更改过程中可能会让数据包通过。一个简单的方法是执行以下操作

     # ipchains -I input 1 -j DENY
     # ipchains -I output 1 -j DENY
     # ipchains -I forward 1 -j DENY

... 进行更改 ...

     # ipchains -D input 1
     # ipchains -D output 1
     # ipchains -D forward 1
     # 

这会在更改期间丢弃所有数据包。

这是上面防火墙规则在 IPChains 中的副本。

#!/bin/sh
#
# rc.firewall
#
## Flush everything, start from scratch
  /sbin/ipchains -F input
  /sbin/ipchains -F output
  /sbin/ipchains -F forward

## Redirect for HTTP Transparent Proxy
  #$IPCHAINS  -A input -p tcp -s 192.1.2.0/24 -d 0.0.0.0/0 80 -j REDIRECT 8080

## Create your own chain
  /sbin/ipchains -N my-chain
  # Allow email to got to the server
  /sbin/ipchains -A my-chain -s 0.0.0.0/0 smtp -d 192.1.2.10 1024:-j ACCEPT
  # Allow email connections to outside email servers
  /sbin/ipchains -A my-chain -s 192.1.2.10 -d 0.0.0.0/0 smtp -j ACCEPT  
  # Allow Web connections to your Web Server
  /sbin/ipchains -A my-chain -s 0.0.0.0/0 www -d 192.1.2.11 1024: -j ACCEPT
  # Allow Web connections to outside Web Server
  /sbin/ipchains -A my-chain -s 192.1.2.0/24 1024: -d 0.0.0.0/0 www -j ACCEPT
  # Allow DNS traffic
  /sbin/ipchains -A my-chain -p UDP -s 0.0.0.0/0 dns -d 192.1.2.0/24 -j ACCEPT

## If you are using masquerading
  # don't masq internal-internal traffic
  /sbin/ipchains -A forward -s 192.1.2.0/24 -d 192.1.2.0/24 -j ACCEPT
  # don't masq external interface direct
  /sbin/ipchains -A forward -s 24.94.1.0/24 -d 0.0.0.0/0 -j ACCEPT
  # masquerade all internal IP's going outside
  /sbin/ipchains -A forward -s 192.1.2.0/24 -d 0.0.0.0/0 -j MASQ

## Deny everything else
  /sbin/ipchains -P my-chain input DENY

不要止步于此。这不是一个出色的防火墙,而且我确信你还会提供其他服务。再次强调,请阅读 IPCHAINS-HOWTO。


下一页 上一页 目录