this is a extra element for clear the floated element
RedHat7.1下Ipchains的经典应用
  • 09/30
  • 2007
iptables | Linux 2955 次查看
  摘要:

  网络的安全性是一个不可忽视的问题,Linux从早期版本的ipfwadm到2.2的ipch

  ains和2.4的netfilter,提供了配置简单而强大的防火墙工具。本文以一个小企业网

  络网络为例子,讲述了RedHat7.1下使用ipchains的几个实用配置,其中包括内外网

  的IP隐藏(Masquerading)和口转发(Port forwarding);另外给出有效和安全的

  rule配置规范。

  一、基本知识和假设

  1.选择防火墙策略

  防火墙一般只有两个策略:

  A.除了明确允许,否则拒绝

  B.除了明确拒绝,否则允许

  第一种更能保证网络的安全性,这也是我们实验采用的策略。

  2.网络结构设计

  我们的实验网络由一个防火墙和两个局域网组成,防火墙放在内部网和Internet

  (专线上网)的中间。 FireWall所在的机器配置两个TpLink8139a/10m网卡,

  只有外部网卡上使用合法IP202.116.0.1,其他均为 保留IP。第一个内部网(LAN1)

  192.168.1.*局域网连接到网关192.168.1.1,第二个内部网(LAN2)192.168.2.*

  局域网连接到网关192.168.2.1。企业的要求是内部网的机器能访问Internet,

  并且对外提供www服务。

  网络结构图如下:

  INTERNET

  |

  -----------------[202.116.0.1]--------------------------

  | | |

  |

  FireWall |

  | | |

  ---------[192.168.1.1]-----------[192.168.2.1]-----------

  |

  |

  +-------------+

  +-------------+

  [92.168.1.2] [192.168.1.3] [192.168.2.2] [192.168.2.3](www)

  系统要求:

  系统版本:RadHat7.1

  Ipchains版本:1.3.10(已内置)

  二、前期准备

  1.安装网卡

  实验网络需要3个网卡,按照如下顺序配置:

  A.添加配置外部网卡eth0:

  #netconfig

  IPADDR=202.116.0.1

  NETMASK=255.255.255.0

  DefalutGW=202.116.0.254

  B.添加配置LAN1网卡eth1:

  编辑 /etc/sysconfig/network-scripts/ifcfg-eth1

  IPADDR=192.168.0.1

  NETMASK=255.255.255.0

  ONBOOT=yes

  C.添加配置LAN2网卡eth2:类似B.

  提示:如果没有找到ifcfg-eth1/2文件,可以copyifcfg-eht0进行修改.

  不要直接使用ifconfig,否则重启后的重新配置.

  2. 配置路由

  由于上面的配置只有一个默认网关,还没有完成全部必要的路由,所以还要

  手工配置。

  编辑 /etc/rc.d/rc.local

  在最后一个"fi"前添加如下命令,使得每次启动系统都能自动配置路由:

  echo "Setting routes......"

  /sbin/route add -net 127.0.0.0

  /sbin/route add -net 202.116.0.1 netmask 255.255.255.0 eth0

  /sbin/route add -net 192.168.1.0 netmask 255.255.255.0 eth1

  /sbin/route add -net 192.168.2.0 netmask 255.255.255.0 eth2

  /sbin/route add -host 202.116.0.1 eth0

  /sbin/route add -host 192.168.1.1 eth1

  /sbin/route add -host 192.168.2.1 eth2

  /sbin/route add default gw 202.116.0.254

  提示:为了能保存配置,不使直接用route.

  配置eth1,eth2致关重要,否则本地数据报不可能别转发.

  3.加入Ipchains

  虽然7.1内置了ipchains,为了保证能正确启动,最好完成下面步骤:

  A.添加模组

  #linuxconf

  选择[Control]->[Control files and systems]->[Configure Linuxconf modules],

  点选[firewall]模组。

  #reboot (重新开机)

  B.启用转发功能

  #linuxconf

  选择[Networking]->[clinet tasks]->[Routing and gateways]->[Set Defaults],

  点选 [X] Enable routing

  C.启用规则链

  选择[Config]->[Networking]->[Firewalling]->[Firewalling],

  启用选择下面三项

  Inputing rules (*) are active

  Outputing rules (*) are active

  Forwarding ules (*) are active

  D.启动ipchains

  # setup

  进入 System,services 选项里,选取ipchains,

  确保系统会自动启动防火墙.

  提示:B可以用下面方法代替

  #/etc/sysconfig/network中添加FORWARD_IPV4=yes

  或者:

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

  三、初始化和规则规范

  1.虽然可以通过shell执行ipchains配置规则,但为了不小心通过命令行添加和

  删除规则,造成防火墙不全安全,也为了能保存已有规则,建议把所有规则

  放在一个可执行的shell脚本中,通过修改脚本管理规则,并且通过执行shell

  脚本添加规则。

  #touch /etc/rc.d/rc.myfirewall

  #chmod u+x /etc/rc.d/rc.myfirewall

  通过vi管理规则

  #./rc.myfirewall导入规则

  脚本的格式:

  /sbin/ipchains 规则

  2.定义全局变量

  EXTERNAL_INTERFACE="202.116.0.1"

  LAN1_INTERFACE="192.116.1.1"

  LAN2_INTERFACE="192.116.2.1"

  LOOPBACK_INTERFACE="lo"

  3.由于我们采用了"除了明确允许,否则拒绝"的策略,我们的防火墙的初始化部分

  如下:

  #Set the policy

  /sbin/ipchains -P input DENY

  /sbin/ipchains -P output DENY

  /sbin/ipchains -P forward DENY

  #Flush the chains

  /sbin/ipchains -F input

  /sbin/ipchains -F output

  /sbin/ipchains -F forward

  #other Firewall rules

  4.为了安全可以启动必要的日记记录;

  并通过添加用户自定义链优化规则。

  四、实验设计和测试

  下面按照上面的要求,设计了实验的案例。请注意,实验过程基本上是顺序进

  行,因为后一个案例可能依赖于前一个的完成。

  1.本地环路访问

  原理:由于我们的默认为拒绝所有包,环路接口的数据包也被拒绝,为了能使用

  系统日记、X Windows和其他本地UNIX域及基于socket的服务,

  必须允许这些数据报通过。

  规则:

  ipchains -A input -i $LOOKBACK_INTERFACE -j ACCEPT

  ipchains -A output -i $LOOKBACK_INTERFACE -j ACCEPT

  测试:

  ping 202.116.0.1 [ok]

  ping 127.0.0.1 [ok]

  2.允许内部机器访问Internet

  原理:由于内部网使用的不是合法IP,所以无法直接访问Internet,数据包会

  被eth0被丢弃。我们使用用到Ip隐藏或Ip欺骗技术,实现单个IP的共享,

  即NAT(Net Address Transporting)。其原理是:LAN的数据

  报从内部网关上的输出队列转到外部网卡的输入队列前,数据报的源地址

  被替换为外部网卡IP即202.116.0.1,再传到Internet上。

  规则:

  #只允许Internet对外部卡的访问:

  ipchains -A output -i eth0 -s EXTERNAL_INTERFACE all -d 0/0 all -j ACCEPT

  ipchains -A input -i eth0 -s 0/0 all -d EXTERNAL_INTERFACE all -j ACCEPT

  #外部卡上的IP隐藏:

  ipchains -A forward -i eth0 -s $LAN1_INTERFACE/24 -j MASQ

  ipchains -A forward -i eth0 -s $LAN2_INTERFACE/24 -j MASQ

  #允许LAN1访问所有外部IP:

  ipchians -A output -i eth1 -s 0/0 all -d 0/0 all -j ACCEPT

  ipchians -A input -i eth1 -s 0/0 all -d 0/0 all -j ACCEPT

  #允许LAN2访问所有外部IP:

  ipchians -A output -i eth2 -s 0/0 all -d 0/0 all -j ACCEPT

  ipchians -A input -i eth2 -s 0/0 all -d 0/0 all -j ACCEPT

  测试:

  【192.168.1.2】:ping InternetIP [ok]

  【192.168.2.2】:ping InternetIP [ok]

  3.内部多个LAN的相互访问

  原理:要求LAN1,LAN2能不需要Ip隐藏地互相访问,只要网关支持转发就可

  以。

  规则:

  #允许从内部网1到内部网2访问:

  ipchains -A output -i eth1 -s $LAN1_INTERFACE/24 -d $LAN2_INTERFACE/24 -j ACCEPT

  ipchains -A input -i eth1 -s $LAN2_INTERFACE/24 -d $LAN1_INTERFACE/24 -j ACCEPT

  ipchains -A forward -i eth1 -s $LAN1_INTERFACE/24 -d $LAN2_INTERFACE/24 -j ACCEPT

  #允许从内部网2到内部网1访问:

  ipchains -A output -i eth2 -s $LAN1_INTERFACE/24 -d $LAN2_INTERFACE/24 -j ACCEPT

  ipchains -A input -i eth2 -s $LAN2_INTERFACE/24 -d $LAN1_INTERFACE/24 -j ACCEPT

  ipchains -A forward -i eth2 -s $LAN1_INTERFACE/24 -d $LAN2_INTERFACE/24 -j ACCEPT

  测试:

  【192.168.1.2上】:ping 192.168.2.3 [ok]

  【192.168.2.2上】:ping 192.168.1.3 [ok]

  4.允许Internet对内部服务www的访问

  原理:外部机器无法访问到内部服务,可以使用代理;另种方法就是利用端

  口转发了。端口转发是在IP层内核一级重写数据包,所以应用级代理

  更加稳定可靠,速度更快。而且可以在防火墙外部地址上使用IP别名

  处理更多的端口转发请求(如若有多台WWW服务器).

  在访问过程中分为(见下图),外部机器对内部机器的服务请求及外部机

  器对请求的相应, 所以同时用到前面的Masquareding和

  Port Forwarding。

  LAN 数据报 |---MASQ---| Internet数据报

  (www相应)[srcIP:192.168.0.1]-->| Firewall |--> [srcIP:202.116.0.1]

  (www请求)[dIP:192.168.0.1:80]<-|-Port FW--|<-[srcIP:202.116.0.1:80]

  Linux7.1已经有一个端口转发模块ip_masq_portfw,但是配置和管

  理却是通过第三方程序ipmasqadm,可以在下面FTP上找到 ipmasqadm

  RPM包。

  ftp://ftp.redhat.com/pub/contrib/libc6/i386/

  ipmasqadm-0.4.6.i386.rpm

  规则:

  由于有了前面“允许内部机器访问Internet”的配置,我们所要做的就是启

  动外部接口的端口转发规则:

  /usr/sbin/ipmasqadm

  portfw

  -a

  -P

  tcp

  /

  - L EXTENAL_INTERFACE

  80 -R

  192.168.1.2

  80

  五、后记

  ipchains配置比较简单,安全性也比较强,但是随着netfilter的出现,尤其是

  由于netfilter 允许建立状态防火墙,能够过滤TCP标志任意组合报文,还能够过滤

  MAC地址,所以比ipchains具有的优势。所以会有越来越多的管理员转而使用

  Netfilter.