用Linux实现路由器和包过滤防火墙

路由器和防火墙

路由器是一种广泛运用在IP网段之间的设备,市场上有许多现成的产品。在应用中,我 们经常将路由器跨接在广域网和局域网之间,大多数的路由器产品也就是基于这种需要来设计的。但是随着用户IP网络的扩展,我们需要一种能够在多个以太网络 之间进行寻址的路由器,传统的路由器产品中偶尔有几款双以太网络 接口的,但是这样的产品价格尤其昂贵,而且要是支持快速以太网络应用的话价格将是天文数字;第三层交换机可以实现这样的功能,但是第三层交换机也不是便宜的家伙。

路由器工作的时候,根据它的某个端口收到的数据包的目的IP地址,查询路由器自己的 路由表,然后决定将数据包转发到相应的端口。路由器的路由表有几种:一种是根据路由器自己的每个端口IP地址和子网掩码计算出来的路由,这种路由叫做“固 定路由”;第二种是有系统管理员种设置的到某个子网需要通过某个下一级路由器的路由,这种叫“静态路由”;还有就是在网络环境中让每个路由器都把自己的路 由信息广播出去,让路由器之间进行互相学习,这样学到的路由就叫做“动态路由”。路由器还会把目的地址不在自己路由表中的数据包固定转发给一个预先设定 IP地址,这样的路由设置又叫“默认路由”。在路由匹配的过程中,一般有这样的优先级:固定路由>静态路由>动态路由>默认路由。

路由器只会查看IP数据包的目的地址,也就是说原则上它是“照单全收”,而且全 部转发,除非真的发不出去了。如果让路由器在转发数据包的时候,加一项检查,检查数据包的来源和数据包要求的应用层服务类型,根据预先设计的规则来判定这 个数据包是应该转发还是作别的处理,这样这个路由器就不再是一个单纯意义上的路由器,而是一种类型的防火墙——包过滤防火墙。

包过滤防火墙可以检查数据包的来源、源端口、目的地址、目的端口,使用的传输层 协议类型等项目,根据检查的项目的内容来匹配一个规则表,当符合规则表中的定义的时候,就执行规则表事先定义的操作。一般来说,规则表可以定义这样的操 作:ACCEPT(通过)、NAT(MASQ地址转换)、DENY(丢弃)、REJECT(拒绝,同时回送‘不可用’消息给源端)。

当然目前市场上也能买到支持包过滤防火墙的现成产品,但是价格问题还是我们不得不考虑的重要因素。尤其大多数产品都有许多许可证、性能等方面的限制。

Linux操作系统应运IP网络而生,除了Linux价格上的优势之外,更吸引人的 是它内建的强大的网络功能,除了做各种Internet上的应用服务之外,Linux还提供了完整的路由器功能和防火墙功能。而它所带来的系统造价和功能 的比例是相当诱人的,为什么不一试呢?

Linux系统的准备

相对于现成的路由器产品,我们把这样的路由器称为“软路由器”,当然这样做出来的路 由器性能绝对不会比“硬件路由器”的性能差,我们只要明白比如很多“25××”系列的路由器才只是采用25M主频的摩托罗拉68030CPU(性能相当于 Intel 80386)我们就知道了。

用来做“软件路由器”的Linux系统主机硬件配置要求并不是太高,用作三五个 局域网之间的路由选择,数百台计算机的话,选用奔腾133以上的主机就足够了,当然现在的市场上赛杨2或者奔腾4或者其他的CPU也不是很贵;配置64M 内存,有条件的话可以配置到128M也无所谓;硬盘就不要太大了,否则也是浪费.

关键在于网络适配器的配置,Linux系统支持大多数市场上能见到的以太网络适配器,PCI卡的安装比较简单,只要内核支持,在开机的时候有多少卡都会被系统正确的识别出来。下面是我在实际使用过的能够正常工作的网卡:

★Intel EtherExpress Pro PCI100M

★RealTek 8029/8139 PCI 10M/100M

★D-link 系列 (使用Tulip 2114X驱动) PCI 10M

★ACCTON EN1207 (使用Tulip 2114X驱动) PCI 100M

★3COM全系列 (PCI/ISA 10M/100M)

★AMD PC-NET 32 PCI 10M

★大部分NE2000兼容网卡,Topstar、Dlink、ACCTON、SN2000等等

★HardLink PCMCIA 笔记本专用网卡 10M

当然Linux能支持的网卡远远不止这些。

将网卡驱动加挂到Linux中有几种方法,最常用的是用modprobe系统工具加挂一个内核模块,比如加载一个NE2000兼容网卡的驱动可以这样:

  #modprobe ne io=0x300

其实大多数的PCI网卡并不需要指定IO地址范围,就像加载一个ACCTON的EN1207c网卡可以这样:

  #modprobe tulip

将网卡驱动编译到Linux内核中是一种最高效的做法,在编译Linux内核的时候,使用

  #make menuconfig

代替很多老资料上提到的“#make config”,这样就会得到一个菜单,在菜单中“Network Device”选项下选定指定的网络适配器的驱动程序,编译完成以后就会得到一个完整的支持相应网卡的Linux内核。

对于很多系统只能识别一个的网卡,将第二个以后的网卡参数写在 /etc/lilo.conf中是最佳做法,这里有一个系统中安装呢4块网卡,一个是PCI的RealTek 8139,另外3个是NE2000,这样的话系统就识别8139网卡以后就不会自动识别后面的三个ISA卡,我们需要在/etc/lilo.conf中加 上这样一句:

 append=-ether=3,0x240,eth1 ether=11,0x300,eth2 ether=4,0x260,eth3-

在编译内核的过程中,我们可以在Network option中选择“optimize as router not host”,这样系统就会按照路由器而不是主机的方式进行优化,同时,还可以根据具体的需要选择上“ Fast switching”和“ Forwarding between high speed interfaces”以及“ advanced router”。如果我们还计划在这个机器上实现包过滤防火墙,那么选择上“ firewalling”和“ IP: masquerading”以及与“IP MASQ”相关的选择项。

注意查看开机的系统提示或者使用dmesg命令可以看到系统是不是正常识别并且启动相应的网卡的驱动程序,在上面例子中提到的具有一个Realtek8139网卡,三个NE2000网卡的机器上我们能够看到这样的情况:

  rtl8139.c:v1.07 5/6/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/r
            tl8139.html
            eth0: RealTek RTL8139 Fast Ethernet at 0x6000, IRQ 9, 00:e0:4c:dd:5f:85.
            ne.c:v1.10 9/23/94 Donald Becker ([email protected])
            NE*000 ethercard probe at 0x240: 00 40 05 1f 60 9a
            eth1: NE2000 found at 0x240, using IRQ 3.
            NE*000 ethercard probe at 0x300: 00 40 05 22 08 65
            eth2: NE2000 found at 0x300, using IRQ 11.
            NE*000 ethercard probe at 0x260: 00 40 05 23 59 0f
            eth3: NE2000 found at 0x260, using IRQ 4.

然后是配置每个网络端口的IP地址,当然我们可以使用操作系统的一些对话框来配置第一个网卡的参数,但是一个有经验的网络管理员一般是不这样做的,因为这样不能配置其他的网卡,我们必须学会用这个命令来配置第一块网卡:

#ifconfig eth0 10.3.3.3 netmask 255.255.255.0 broadcast 10.3.3.255

第二块网卡的名字就是eth1,其他依次是eth2,eth3等等。由于计算机体系结构的限 制,在一个普通PC主板上只有一个PCI控制器,而一个PCI控制器最多只能同时支持4个PCI设备,当然某些专用服务器上可能有支持两个以上的PCI控 制器。ISA网卡的安装受到系统中断号的限制,单CPU的系统中只有16个可用的IRQ号,扣除硬盘、内存、键盘、显示卡等硬件已经所剩无几,所以一般也 是安装4个卡,当然,双CPU的系统可以有256个中断号可用,这样就宽裕了许多。另外,我们还需要打开Linux系统的IP转发开关,这一点非常容易, 执行这一条指令:

echo 1 > /proc/sys/net/ipv4/ip_forward

当然这些配置命令最好是放到/etc/rc.d/rc.local中,这样就不用每次开机以后重新配置了。

Linux实现路由器

正确配置IP地址等参数以后,系统就自动计算出了每个端口所接的子网的固定路由,在这样的一个例子中我们可以看到:

我们可以用命令“route -n”或者“netstat -r -n”来查看系统目前的路由表,在右边图二所示的例子中,我们可以得到这样的路由表:

  # route -n 
  Kernel IP routing table 
  Destination Gateway Genmask Flags Metric Ref Use Iface 
  10.3.2.4 0.0.0.0 255.255.255.252 U 0 0 0 eth0 
  10.3.2.128 0.0.0.0 255.255.255.128 U 0 0 0 eth3 
  10.3.253.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 
  172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1

其中Destination项表示目的网络,其大小可以通过子网掩码(Genmask)计算 出来,Flags项表示这个网段是否直接连接的,“U”就是直接可用的意思,Metric是级跳,Ref是优先级参考,Use Interface是连接的端口,Gateway栏目在需要其他路由器转发的时候指明下一级路由器的地址。

使用命令route同时还可以建立或者删除一个静态路由,使用这样的格式:

#route add -net 目标子网地址 netmask 目标子网掩码 gw 下一级路由器的地址

同理,使用:

#route del -net 目标子网地址 netmask 目标子网掩码 gw 下一级路由器的地址

可以设置静态路由,使用:

#route add default gw 网关地址

或者:

# route add -net 0.0.0.0 netmask 0.0.0.0 gw 网关地址

我们把路由设置命令加到/etc/rc.d/rc.local中,以便其能够在下次启动的时候自动的运行所有路由设置命令。 如下是上面例子中提到的4个网络出口的Linux路由器中的静态路由设置命令,这就是在/etc/rc.d/rc.local文件中的片断:

route add -net 202.102.247.0 netmask 255.255.255.192 gw 172.16.80.82 
  route add -net 10.56.0.0 netmask 255.255.0.0 gw 172.16.80.10 
  route add -net 192.168.100.0 netmask 255.255.255.0 gw 172.16.80.86 
  route add -net 192.168.101.0 netmask 255.255.255.0 gw 172.16.80.88 
  route add -net 10.68.0.0 netmask 255.255.0.0 gw 10.3.2.129 
  route add -net 172.28.0.0 netmask 255.255.0.0 gw 172.16.80.82 
  route add default gw 10.3.2.5 (这一条加的是默认路由)

由这些命令创建的静态路由加上原来由IP地址计算出来的固定路由以后,路由表就变成了这样:

  # route -n 
  Kernel IP routing table 
  Destination Gateway Genmask Flags Metric Ref Use Iface 
  10.3.2.4 0.0.0.0 255.255.255.252 U 0 0 0 eth0 
  202.102.247.0 172.16.80.82 255.255.255.192 UG 0 0 0 eth1 
  10.3.2.128 0.0.0.0 255.255.255.128 U 0 0 0 eth3 
  192.168.100.0 172.16.80.86 255.255.255.0 UG 0 0 0 eth1 
  192.168.101.0 172.16.80.88 255.255.255.0 UG 0 0 0 eth1 
  10.3.253.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 
  10.68.0.0 10.3.2.129 255.255.0.0 UG 0 0 0 eth3 
  172.28.0.0 172.16.80.82 255.255.0.0 UG 0 0 0 eth1 
  172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1 
  10.56.0.0 172.16.80.10 255.255.0.0 UG 0 0 0 eth1 
  0.0.0.0 10.3.2.5 0.0.0.0 UG 0 0 0 eth0

做防火墙的系统准备

包过滤防火墙比起路由器来说就是在转发数据包的时候多了一个规则表的检测,按照规则表的定义决定数据包的命运。可以说,路由器其实就是一个允许所有数据包正常通过的“防火墙”。

防火墙还有一个很重要的功能就是保护一个内部的子网,以及将内部的私有地址转换成外 部的IP地址,这个功能不但可以对内部网络起到保护作用,还可以节省IP地址资源,或者用来使一个本来不能被某设备识别的某网段IP能够实现对它的访问。 这样的技术叫做NAT(网络地址翻译),实现的方式很多,直接在路由层次上实现是效率最高的。CISCO的PIX就是这样技术的商用产品的代表。 Linux的IP-MASQ(IP伪装)就是这样技术在Linux上的一个实现。

当一个主机发起一个对其他主机的TCP/IP访问, 它必须在数据包的报头中指明对方的IP地址,以及对方提供连接的TCP/UDP端口,同时它会打开一个临时的端口准备接受返回的数据,然后把它自己的IP 地址以及这个临时端口写到IP数据报的报头中。当一个数据包被NAT处理的时候,它的源地址将被替换成防火墙的出端口上的IP(有些防火墙产品使用地址 池),同时NAT防火墙上也会在出端口上开放一个临时端口,将这个端口号替换数据包中的源端口号。当回应数据到来的时候,由于外部的主机只能看到NAT防 火墙的IP和端口号,它发出的数据的目的地址和端口将是防火墙上的,而数据回来到防火墙以后,防火墙就把原来的内部主机的地址和端口号替换回来,将数据包 转到内部网络上传送。

而在NAT防火墙上,还需要建立一个此次地址转换的对应关系表。以便知道随后到来的源、回应数据包应该被怎样的替换回来。

由于包过滤防火墙的所有操作都是根据规则表来的,所以规则表就显得格外的重要。我们 使用一个叫ipchains的工具来维护系统规则表,ipchains把规则表叫做防火链。当一个数据包进入Linux机器时,要通过进入链 (input)的检查,当一个Linux机器准备发送一个数据包时,这个包又要通过输出链(output)的检查,当作为路由器使用的时候,还要点所有中 转的数据包增加一道中转链(forward)的检查,每个链都可以配置自己的规则表。所以,其实一个通过Linux防火墙的数据包需要经过input、 forward、output三个规则的检查,当这个Linux作为普通路由器使用的时候,三个链的规则都是ACCEPT(允许通过)。

这是一个需要中转的数据包通过ipchains的过程:

在规则表中,数据包总是先和第一条规则进行匹配,如果不匹配在比较下一条规则,一旦某条规则适应了,就不再比较,直接按此规则执行,所以排列在前面的规则总是优先与排列在后面的规则。

用ipchains建立规则表

使用命令:

  ipchains -P 链名 动作

可以改变一个链的默认规则,其中可以使用的链名有“input”、“forward”、和 “output”。可以使用的动作有“ACCEPT”、“DENY”、“REJECT”。一般来说,默认规则是当一个数据包不能匹配所有的规则的时候的最 后动作,当然这是优先级最低的一条规则了。系统默认的三个链的规则都是允许。也就是“ACCEPT”。一般来说,我们做防火墙的话,主要是控制通过防火墙 的数据包,所以我们一般在中转链上设置规则,而把进入链和外出链设置为“ACCEPT”。通常我们需要把所有不匹配规则的数据包禁止,所以我们可以用这样 的命令把中转链的默认规则改成“丢弃”:

  #ipchains -P forward DENY

增加一条规则使用这样的语法:

ipchains -A 链名 -s 源网络/掩码 -d 目的网络/掩码 -p 传输层协议 端口 -j 动作

源网络和目的网络地址用子网的网络地址来表示,掩码可以使用点分十进制,也可以使用一个表示 “1”的个数的数字来代替,比如说“255.255.255.0”可以表示为“24”,用“0.0.0.0/0”可以表示所有的地址,用“IP地址 /32”表示一个主机。这个地方的动作可以是“ACCEPT”、“DENY”、“REJECT”,在中转链中要是使用IP伪装的话,动作可以写成 “MASQ”。如果不检查传输层协议(tcp/udp/icmp)的话,就不能再检查端口号,这时可以这样写:

 ipchains -A 链名 -s 源网络/掩码 -d 目的网络/掩码 -j 动作

这样的设置将对所有的符合源地址和目的地址的数据包生效。比如说我们现在要设置允许子网10.3.2.0/255.255.255.128和子网202.102.247.0/255.255.255.192的互相访问,可以这样设置:

#ipchains -A forward -s 10.3.2.0/25 -d 202.102.247.0/26 -j ACCEPT

但是在实际的使用中这样设置并不会让两个子网通起来,因为网络传输是双向的,只有一个方向通了还不能算是通,由于forward的默认规则已经是DENY,返回的数据包将会因为匹配不了规则而被丢弃,所以我们需要再设置一条反向的许可规则:

#ipchains -A forward -s 202.102.247.0/26 -d 10.3.2.0/25 -j ACCEPT

其实我们可以使用-b的选项来一次设置双向的两条规则:这样的命令等价于刚才的两条命令:

#ipchains -A forward -b -s 10.3.2.0/25 -d 202.102.247.0/26 -j ACCEPT

只有一种情况例外,由于IP伪装回来的数据包不经过中转链,所以不需要再中转链中只需要为IP伪装设置一个单向的规则,比如说把所有从10.3.2.0/25来访问172.16.0.0/16的数据包都做一个伪装,那么就可以这样设置:

  #ipchains -A forward -s 10.3.2.0/25 -d 172.16.0.0/16 -j MASQ

而这样的设置并不需要反向的规则。 这是一个禁止10.3.2.0/25的网络的计算机访问202.102.247.50的telnet端口(TCP23)的设置:

#ipchains -A forward -s 10.3.2.0/25 -d 202.102.247.50/32 -p tcp 23 -j DENY

当然,在进入链或者在外出链上做的规则对于中转数据一样有效,这样的设置可以禁止10.3.2.0/25网段上的IP地址访问OICQ(UDP8000端口):

 #ipchains -A input -s 10.3.2.0/25 -d 0.0.0.0/0 -p udp 8000 -j DENY

在进入链上的规则要优先于中转链上的规则,而外出链上的规则优先级是最低的。删除规则有两种做法,一个是先数出改规则在表中的位置,然后用命令:

  #ipchains -D 链名 序号

来删除它,比如说删除中转链的第5条规则可以这样写:

  #ipchains -D forward 5

还有一种办法就是把建立规则中的“-A”直接改成“-D”来删除由这条“-A”的命令创建的规则:

 #ipchains -D input -s 10.3.2.0/25 -d 0.0.0.0/0 -p udp 8000 -j DENY

这样的话这个子网的计算机又可以访问OICQ了。而用命令ipchains -F可以清除系统全部的规则表,但是不会改变链的默认规则。

用命令ipchains -L -n可以查看系统目前的规则表:这是前面所说的4个网卡的防火墙实际的规则表,当然,看起来它是比较复杂的:

  d# ipchains -L -n 
  Chain input (policy ACCEPT): 
  target prot opt source destination ports 
  DENY all ------ 202.102.247.0/25 10.3.2.4 n/a 
  DENY all ------ 172.16.0.0/16 10.3.2.4 n/a 
  DENY all ------ 172.16.0.0/16 10.3.253.3 n/a 
  DENY all ------ 202.102.247.0/25 10.3.253.3 n/a 
  Chain forward (policy DENY): 
  target prot opt source destination ports 
  MASQ all ------ 202.102.247.0/25 10.3.253.1 n/a 
  ACCEPT all ------ 10.3.2.0/24 10.3.253.0/24 n/a 
  ACCEPT all ------ 10.3.253.0/24 10.3.2.0/24 n/a 
  ACCEPT all ------ 10.3.2.0/24 202.102.247.0/25 n/a 
  ACCEPT all ------ 202.102.247.0/25 10.3.2.0/24 n/a 
  ACCEPT all ------ 10.3.2.0/24 172.16.0.0/16 n/a 
  ACCEPT all ------ 172.16.0.0/16 10.3.2.0/24 n/a 
  ACCEPT all ------ 10.3.253.0/24 172.16.0.0/16 n/a 
  ACCEPT all ------ 172.16.0.0/16 10.3.253.0/24 n/a 
  ACCEPT all ------ 10.3.253.0/24 202.102.247.0/25 n/a 
  ACCEPT all ------ 202.102.247.0/25 10.3.253.0/24 n/a 
  ACCEPT all ------ 10.3.253.0/24 10.56.0.0/16 n/a 
  ACCEPT all ------ 10.56.0.0/16 10.3.253.0/24 n/a 
  ACCEPT all ------ 172.16.0.0/16 202.102.247.0/25 n/a 
    ACCEPT all ------ 202.102.247.0/25 172.16.0.0/16 n/a 
  ACCEPT all ------ 10.56.32.0/25 202.102.247.0/25 n/a 
  ACCEPT all ------ 202.102.247.0/25 10.56.32.0/25 n/a 
  ACCEPT all ------ 202.102.247.0/25 10.68.0.0/16 n/a 
  ACCEPT all ------ 10.68.0.0/16 202.102.247.0/25 n/a 
  ACCEPT all ------ 172.16.0.0/16 10.68.0.0/16 n/a 
  ACCEPT all ------ 10.68.0.0/16 172.16.0.0/16 n/a 
  ACCEPT all ------ 10.3.253.0/24 10.68.0.0/16 n/a 
  ACCEPT all ------ 10.68.0.0/16 10.3.253.0/24 n/a 
  MASQ all ------ 202.102.247.0/25 10.3.253.1 n/a 
  MASQ all ------ 172.16.0.0/16 10.3.253.1 n/a 
  MASQ all ------ 192.168.0.0/16 10.3.253.1 n/a 
  MASQ all ------ 10.56.32.0/24 10.3.253.1 n/a 
  MASQ all ------ 202.102.247.0/25 202.102.247.128/25 n/a 
  MASQ all ------ 172.16.0.0/16 202.102.247.128/25 n/a 
  MASQ all ------ 192.168.0.0/16 202.102.247.128/25 n/a 
  MASQ all ------ 10.56.32.0/24 202.102.247.128/25 n/a 
  MASQ all ------ 172.16.0.0/16 0.0.0.0/0 n/a 
  MASQ all ------ 10.56.32.0/25 0.0.0.0/0 n/a 
  MASQ all ------ 192.168.0.0/16 0.0.0.0/0 n/a 
  ACCEPT all ------ 10.3.253.0/24 0.0.0.0/0 n/a 
  ACCEPT all ------ 0.0.0.0/0 10.3.253.0/24 n/a 
  Chain output (policy ACCEPT):

其中,我把对于某些主机的访问限制设置在了进入链中,这样优先级高一些。同样我们可以把建立 规则的命令写入/etc/rc.d/rc.local中,但是一旦我们把一个防火墙系统调试成功以后,我们还需要把已经建立的规则记下来,重新写到 rc.local中,这样的操作是很容易出错的。其实我们可以用命令ipchains-save 把规则表保存到一个文件,就像这样:

  #ipchains-save >/root/ipchains 
  把现在正在运行的规则表保存到了/root/ipchains文件当中去了,然后把恢复规则表的命令: 
  /sbin/ipchains-restore < /root/ipchains 
  写到/etc/rc.d/rc.local中。 
  用ipchains-save保存的文件有这样的格式: 
  :input ACCEPT 
  :forward DENY 
  utput ACCEPT 
  -A forward -s 172.28.0.0/255.255.0.0 -d 202.102.247.0/255.255.255.128 -j ACCEPT 
  -A forward -s 172.28.0.0/255.255.0.0 -d 0.0.0.0/0.0.0.0 -j MASQ

要在规则表的中间插入一条规则的时候,我们可以很方便的编辑它,然后用“ipchains -F”清除运行中的规则表,再用“ipchains-restore < 文件名”来恢复规则。

设置防火墙中不应该被过滤的信息

我们设置防火墙的时候,总是要想办法过滤我们所不能识别的东西,但有些信息对于网络的运行来说是必须的,一般正常情况下不能被过滤,否则将影响网络的正常运行,而这一点又是初学的系统管理员经常忽略的内容。

ICMP,很多系统管理员过滤ping,主要使因为可以用ping把一些网络线路带 宽比较窄的地方堵塞,为了贪图省事,就把整个ICMP过滤了。但是其实 ICMP 包还被用来为其它协议(TCP, UDP)指示错误。 如: “destination-unreachable” 等等。这些信息被过滤的话意味这你将不会收到 “Host unreachable”或者“No route to host” 等报错信息, 所有的连接将等待一个永不会来的回复。将会使客户机花费很长的一段时间等候TCP/IP协议的超时。 这样做虽然不好, 但还不致命。

 一个更糟的问题是 ICMP 包在“MTU (最大传输单元)测试”中担任角色。 为良好的完成 TCP 连接,主机会使用“ MTU测试”去算出不被分解成片段就可以到达目的地的最大包。 “MTU测试”是这样工作的: 发送带有“Don\‘t Fragment(不分解成片段)位”的包, 如果收到 “Fragmentation needed but DF set(包需要分解成片段)”包,那么就发送较小的包;如果禁止了ICMP信息,本地主机将不会减小 MTU, 测试就将永远进行或没有意义。如果网络上存在MTU不一致的网段,这样将会极大的影响网络性能。

正确过滤ping的做法是过滤ICMP的0号和8号端口:

  #ipchains -A input -s 0.0.0.0/0 -d 0.0.0.0/0 -p icmp 0 -j DENY 
  #ipchains -A input -s 0.0.0.0/0 -d 0.0.0.0/0 -p icmp 8 -j DENY

TCP的53端口,我们知道,一般来说DNS系统翻译使用的UDP的53端口,但是DNS协议在UDP不能正常响应的时候会自动该用TCP协议来进行连接,如果在一个全部过滤TCP所有协议的网络上工作,会导致所有UDP协议也得不到正确的域名解析。

有些时候,FTP协议会使用21之外其他的端口来传送一些辅助的信息,所以在处理FTP协议的时候,我们需要更多的了解FTP的实现机制。

应用实例

设置一个办公子网能够访问信息服务子网,但是访问外部需要地址翻译:

办公子网:192.168.0.0-->192.168.0.255

信息子网:202.102.247.0-->202.102.247.63

其中信息子网和Internet互联,出口网关地址是202.102.247.33

首先需要在防火墙上设置出口路由:

  route add default gw 202.102.247.33

防火链的设置如下:

  ipchains -P forwar DENY 
  ipchains -A forward -b -s 192.168.0.0/24 -d 202.102.247.0/26 -j ACCEPT 
  ipchains -A forward -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQ

在湖南省xxx高等专科学校的校园网络上,我们一共有9个子网,5个互联出口,中间就使用了Linux+ipchians的防火墙来进行互联和访问控制,使用了4台这样的主机,有些机器上的路由表和规则表已经配置得比较复杂。但系统的投资很小,实际使用的效果也很好。


你可能感兴趣的:(Linux嵌入式系统相关)