|
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. |
||