摘要:
网络的安全性是一个不可忽视的问题,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.