iptables layer7 squid:实现高性能软件防火墙

本文发布时间: 2019-Mar-21
在这篇博客中,小编要跟读者来聊聊linux下的基于封包过滤的软件iptables的使用,作为一款软件防火墙,其功能是相当强大的,如果配合squid和L7来使用那便是极好的了。1.iptables的封包过滤机制iptables是利用封包过滤机制来完成对用户数据的控制的,所以它会分析封包的包头数据,根据表头数据与定义的『规则』来决定该封包是否可以进入主机或者是被丢弃。意思就是说:『根据封包的分析资料"比对"你预先定义的规则内容,若封包数据与规则内容相同则进行动作,否则就继续下一条规则的比对!』重点在那个『比对与分析顺序』上。举个简单的例子,假设小编预先定义n条防火墙规则好了,那么当Internet来了一个封包想要进入我的主机,那么防火墙是如何分析这个封包的呢?小编以下的图示来说明好了:图1-1当一个网络封包要进入到主机之前,会先经由NetFilter进行检查,那就是iptables的规则了。检查通过则接受(ACCEPT)进入本机取得资源,如果检查不通过,则可能予以丢弃(DROP)!上图中主要的目的在告知读者:『规则是有顺序的』!例如当网络封包进入Rule1的比对时,如果比对结果符合Rule1,此时这个网络封包就会进行Action1的动作,而不会理会后续的Rule2,Rule3....等规则的分析了。而如果这个封包并不符合Rule1的比对,那就会进入Rule2的比对了!如此一个一个规则去进行比对就是了。那如果所有的规则都不符合怎办?此时就会透过预设动作(封包政策,Policy)来决定这个封包的去向。所以啦,当你的规则顺序排列错误时,就会产生很严重的错误了。2.iptables的表格(table)与链(chain)事实上,那个图1-1所列出的规则仅是iptables众多表格当中的一个链(chain)而已。什么是链呢?这得由iptables的名称说起。为什么称为ip"tables"呢?因为这个防火墙软件里面有多个表格(table),每个表格都定义出自己的默认策略与规则,且每个表格的用途都不相同。我们可以使用底下这张图来稍微了解一下:图2-1刚刚图1-1的规则内容仅只是图2-1内的某个chain而已!而预设的情况下,Linux的iptables至少就有三个表格,包括管理本机进出的filter、管理后端主机(防火墙内部的其他计算机)的nat、管理特殊旗标使用的mangle(较少使用)。我们还可以自定义额外的链呢!真是很神奇吧!每个表格与其中链的用途分别是这样的:1.filter(过滤器):主要跟进入Linux本机的封包有关,这个是预设的table啦!INPUT:主要与想要进入我们Linux本机的封包有关;OUTPUT:主要与我们Linux本机所要送出的封包有关;FORWARD:这个咚咚与Linux本机比较没有关系,它可以『转递封包』到后端的计算机中,与下列nattable相关性较高。2.nat(地址转换):是NetworkAddressTranslation的缩写,这个表格主要在进行来源与目的之IP或port的转换,与Linux本机较无关,主要与Linux主机后的局域网络内计算机较有相关。PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)OUTPUT:与发送出去的封包有关3.mangle(破坏者):这个表格主要是与特殊的封包的路由旗标有关,早期仅有PREROUTING及OUTPUT链,不过从kernel2.4.18之后加入了INPUT及FORWARD链。由于这个表格与特殊旗标相关性较高,所以像咱们这种单纯的环境当中,较少使用mangle这个表格。当然各个表格和链的使用是相关联的,如图2-2所示:图2-2上面的图示很复杂喔!不过基本上你依旧可以看出来,我们的iptables可以控制三种封包的流向:1.封包进入Linux主机使用资源(路径A):在路由判断后确定是向Linux主机要求数据的封包,主要就会透过filter的INPUT链来进行管理;2.封包经由Linux主机的转递,没有使用主机资源,而是向后端主机流动(路径B):在路由判断之前进行封包包头的修订作业后,发现到封包主要是要透过防火墙而去后端,此时封包就会透过路径B来传输。也就是说,该封包的目标并非我们的Linux本机。主要经过的链是filter的FORWARD以及nat的POSTROUTING,PREROUTING;3.封包由Linux本机发送出去(路径C):例如响应客户端的要求,或者是Linux本机主动送出的封包,都是透过路径C来传输。先是通过路由判断,决定了输出的路径后,再通过filter的OUTPUT链来传送的!当然,最终还是会经过nat的POSTROUTING链。由于mangle这个表格很少被使用,如果将图2-2的mangle拿掉的话,那就容易看的多了:图2-3事实上目前企业用防火墙来管理内部主机的部分也相当的多,那么你就必须要再针对filter的FORWARD这条链,还有nat的PREROUTING,POSTROUTING以及OUTPUT进行额外的规则订定才行。nat表格的使用需要很清晰的路由概念才能够设定的好。3.iptables的基本语法#iptables[-ttables][-L][-nv]--line-number选项与参数:-t:后面接table,例如nat或filter,若省略此项目,则使用默认的filter-L:列出目前的table的规则-n:不进行IP与HOSTNAME的反查,显示讯息的速度会快很多!-v:列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等--line-number:列出行号一个小例子:#iptables-L-nChainINPUT(policyACCEPT)<==针对INPUT链,且预设政策为可接受targetprotoptsourcedestination<==说明栏ChainFORWARD(policyACCEPT)<==针对FORWARD链,且预设政策为可接受targetprotoptsourcedestinationChainOUTPUT(policyACCEPT)<==针对OUTPUT链,且预设政策为可接受targetprotoptsourcedestination在上面的输出结果中,每一个Chain就是前面提到的每个链啦,Chain那一行里面括号的policy就是预设的政策,那下面的target,prot代表什么呢??1.target:代表进行的动作,ACCEPT是放行,而REJECT则是拒绝,此外,尚有DROP(丢弃)的项目!当然target的值有多种,在后面的案例中小编会用到;?2.prot:代表使用的封包协议,主要有tcp,udp及icmp三种封包格式;?3.opt:额外的选项说明?4.source:代表此规则是针对哪个『来源IP』进行限制??5.destination:代表此规则是针对哪个『目标IP』进行限制?4.NAT服务器的设定咋忽然间跳到这来了,O(∩_∩)O~,这个linux上NAT服务器的搭建主要就用到了iptables的使用,通过nat服务器的搭建,基本上就可以帮助读者去很好的使用iptables啦,对于后续的复杂应用也不用愁啦。1.NAT的全名是NetworkAddressTranslation,字面上的意思是『网络地址的转换』。由字面上的意思我们来想一想,TCP/IP的网络封包不是有IP地址吗?那IP地址不是有来源与目的吗?我们的iptables指令就能够修改IP封包的表头数据,呀呀!连目标或来源的IP地址都可以修改呢!甚至连TCP封包表头的portnumber也能修改!真是有趣!2.要会使用NAT,那就要了解什么是SNAT?DNAT?如果这两个东东会使用的话,基本上NAT的应用算是掌握啦,SNAT主要是应付内部LAN连接到Internet的使用方式,如果要实现SNAT主要会用到POSTROUTING链,至于DNAT则主要用在内部主机想要架设可以让Internet存取的服务器啦,如果要实现主要涉及到PREROUTING链3.一个简单的nat案例:拓扑图:实现目标:1.内网用户能够访问外网资源2.外网用户能够访问到内网发布的www服务器简单实现:1.要实现内网访问外网,那就是SNAT啦#iptables-tnat-APOSTROUTING-s192.168.111.0/24-oeth1-jSNAT--to-source192.168.102.230在192.168.111.0/24网段的客户端访问百度试试服务器端查看一下nat的匹配结果#iptables-tnat-L-nv--line-number当然上面的那一条规则也可以这么来写#iptables-tnat-APOSTROUTING-s192.168.111.0/24-oeth1-jMASQUERADE2.要实现外网访问内网资源那就是DNAT啦#iptables-tnat-APREROUTING-ptcp--dport80-ieth1-jDNAT--to-destination192.168.113.80外网用户访问http://192.168.102.230试试查看防火墙匹配规则#iptables-tnat-L-nv--line-number这样的nat实现似乎没啥难度啊,请记住,这只是非常非常简单的案例,那么来个复杂点的吧。5.综合案例1.案例配置公司有三个部门工程部门192.168.111.10-20软件部门192.168.111.21-30经理办192.168.111.31-40上班时间(08:00--20:00)工程部门上班时间只允许访问ftp,不允许使用qq,迅雷下载,不允许访问www,下班后无限制;软件部门允许访问www并且每个用户连接数最多3个不允许看图片,但是不允许访问sina,不允许使用迅雷,不允许使用QQ不允许使用pplive,下班后无限制经理办公室无限制dmz区域www服务器进行发布2.案例拓扑先分析一下需求,你会发现这些功能单纯的iptables根本没法实现啊,因为包过滤机制只是适用于传输层啦,那禁用QQ,禁用迅雷的,又是不能看图片啥的,都是应用层干的事,咋办呢,想想啊,还有一个神奇的东东,代理服务器啊,squid,想起来没啊,当然对与禁用QQ、迅雷那一类的东东还是可以用iptables来实现的,只不过是得做做手脚,把你的iptables改造一下,打上补丁啦,当然iptables是和内核紧密相关的啦,为了能支持打了补丁的iptables,咱得使用新内核打上补丁重新编译啦,咱先得把根基打牢才能建大楼啦,为了完成这个案例,可是花了小编不少时间,内核编译累死人啦。至于那个补丁是啥东东,居然会那么的强大啊,估计补丁的名称读者听过啦layer7,打完之后就可以实现应用层的过滤啦,至于l7的介绍小编就不细讲了,读者如果想搞懂原理的话可以自己去搜索一下相关资料,这里小编直讲应用。3.重新编译内核1、合并kernel+layer7补丁#tarjxvflinux-2.6.25.19.tar.gz2-C/usr/src/#tarzxvfnetfilter-layer7-v2.20.tar.gz-C/usr/src/#cd/usr/src/linux-2.6.25.19/#patch-p1</usr/src/netfilter-layer7-v2.22/kernel-2.6.25-layer7-2.22.patch2、配置新内核#cp/boot/config-2.6.18-8.el5.config//偷个懒,沿用旧的内核配置#makemenuconfig配置内核时,在“Networking--->NetworkingOptions--->NetworkPacketfilteringframework(Netfilter)”处主要注意两个地方:1)--->CodeNetfilterConfiguration//将“Netfilterconnectiontrackingsuport(NEW)”选择编译为模块(M),需选取此项才能看到layer7支持的配置。//将layer7、string、state、time、IPsec、iprange、connlimit……等编译成模块,根据需要看着办。2)--->IP:NetfilterConfiguration//将“IPv4connectiontrackingsupport(requireforNAT)”编译成模块。//将“FullNAT”下的“MASQUERADEtargetsupport”和“REDIRECTtargetsupport”编译成模块。3、编译及安装模块、新内核#make&&makemodules_install&&makeinstall//编译安装成后后,重启选择使用新的内核(2.6.25.19)引导系统4.重新编译iptables1、卸载现有iptables,但是其启动脚本可以留下来,作为后续新iptables使用#cp/etc/init.d/iptables/etc/init.d/iptables.bak#rpm-eiptablesiptstat--nodeps2、合并iptables+layer7补丁#tarjxvfiptables-1.4.3.tar.bz2-C/usr/src/#cd/usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/#cplibxt_layer7.clibxt_layer7.man/usr/src/iptables-1.4.3/extensions/3、编译安装#cd/usr/src/iptables-1.4.3/#./configure--prefix=/--with-ksource=/usr/src/linux-2.6.25.19#make&&makeinstall#cp/etc/init.d/iptables.bak/etc/init.d/iptables#chkconfig–addiptables#chkconfigiptableson4、安装l7-protocols模式包#tarzxvfl7-protocols-2009-05-10.tar.gz-C/etc/#mv/etc/l7-protocols-2009-05-10/etc/l7-protocols好了,准备工作算是完成了,下面开始来实现吧5.案例实现因为小编是使用终端连接防火墙的,如果对filter表的INPUT和OUPUT链做了操作后,有可能终端就断了,所以小编在这里做一下设置啦,小编的IP是192.168.111.2,所以要这样设置#iptables-tfilter-AINPUT-s192.168.111.2-ptcp--dport22-jACCEPT#iptables-tfilter-AOUTPUT-d192.168.111.2-ptcp--sport22-jACCEPT#iptables-tfilter-PINPUTDROP//将默认策略修改为丢弃#iptables-tfilter-POUTPUTDROP//将默认策略修改为丢弃先进行全员NAT吧,之后的策略再详细添加#iptables-tfilter-PFORWARDDROP//将默认策略修改为丢弃#iptables-tnat-APOSTROUTING-s192.168.111.0/24-oeth1-jMASQUERADE//SNAT1.工程部门上班时间只允许访问ftp,不允许使用qq、迅雷下载,不允许访问www,下班后无限制;#iptables-AFORWARD-d192.168.113.21-ptcp--dport21-miprange--src-range192.168.111.10-192.168.111.20-mtime--timestart08:00--timestop20:00--weekdaysMon,Tue,Wed,Thu,Fri,Sat,Sun-jACCEPT#iptables-AFORWARD-mstate--stateRELATED,ESTABLISHED-jACCEPT#iptables-tfilter-AFORWARD-miprange--src-range192.168.111.10-192.168.111.20-mtime--timestart08:00--timestop20:00--weekdaysMon,Tue,Wed,Thu,Fri,Sat,Sun-mlayer7--l7protoqq-jDROP#iptables-tfilter-AFORWARD-miprange--src-range192.168.111.10-192.168.111.20-mtime--timestart08:00--timestop20:00--weekdaysMon,Tue,Wed,Thu,Fri,Sat,Sun-mlayer7--l7protoxunlei-jDROP#iptables-AFORWARD-s192.168.111.0/24-oeth1-mtime--timestart20:01:00--timestop07:59:00-jACCEPT2.软件部门允许访问www但是每个用户连接数最多3个不允许看图片,但是不允许访问sina,不允许使用迅雷,不允许使用QQ不允许使用pplive,下班后无限制这里可以结合squid来实现#iptables-tnat-APREROUTING-miprange--src-range192.168.111.21-192.168.111.30-ptcp--dport80-jREDIRECT--to-port3128#iptables-tfilter-AINPUT-mstate--stateNEW,ESTABLISHED-jACCEPT#iptables-tfilter-AOUTPUT-ptcp--dport80-jACCEPT#iptables-tfilter-AOUTPUT-mstate--stateNEW,ESTABLISHED-jACCEPT#iptables-tfilter-AFORWARD-miprange--src-range192.168.111.21-192.168.111.40-pudp--dport53-oeth1-jACCEPT#iptables-tfilter-AOUTPUT-pudp--dport53-jACCEPT#iptables-tfilter-AFORWARD-miprange--src-range192.168.111.21-192.168.111.30-mtime--timestart08:00--timestop20:00--weekdaysMon,Tue,Wed,Thu,Fri,Sat,Sun-mlayer7--l7protoqq-jDROP#iptables-tfilter-AFORWARD-miprange--src-range192.168.111.21-192.168.111.30-mtime--timestart08:00--timestop20:00--weekdaysMon,Tue,Wed,Thu,Fri,Sat,Sun-mlayer7--l7protoxunlei-jDROP#iptables-tfilter-AFORWARD-miprange--src-range192.168.111.21-192.168.111.30-mtime--timestart08:00--timestop20:00--weekdaysMon,Tue,Wed,Thu,Fri,Sat,Sun-mlayer7--l7protopplive-jDROP3.经理办公室无限制#iptables-AFORWARD-miprange--src-range192.168.111.31-192.168.111.40-jACCEPT4.Dmz区域www服务器进行发布#iptables-tnat-APREROUTING-d192.168.102.230-ptcp--dport80-ieth1-jDNAT--to-destination192.168.113.80#iptables-AFORWARD-d192.168.113.80-ptcp--dport80-jACCEPT6.集中测试1.工程部门测试工作时间#date2013年05月18日星期六11:29:51CST访问ftp试试服务器端匹配结果#iptables-L-nv--line-number客户端访问外网试试服务器端匹配数据客户端访问QQ服务器端日志情况#tail-f/var/log/messages至于迅雷的封杀,小编这里的迅雷版本太高,l7停止维护已经很久了,所以没办法做到,估计对老版的迅雷有效吧,如果小编以后找到解决方案会及时附上的非工作时间#date2013年05月18日星期六20:30:00CST客户端来测试2.软件部门测试软件部门客户端主机IP工作时间#date2013年05月18日星期六12:20:00CST客户端测试访问百度正常,注意这里百度的logo是个gif格式的,所以会显示出来无法访问新浪打开网站图片不会加载,QQ无法访问非工作时间#date2013年05月18日星期六20:41:00CST客户端测试,访问新浪,站点有图片3.经理部门不管是上班还是下班,都没有任何限制4.外部访问内部发布的服务器好啦,所有小编想讲的东东都结束啦,读者要是感觉很实用的话就自己动手做一做哈,温馨提示,一定要搞懂2-3的图啦,精髓在那里,(*^__^*)嘻嘻……,其他都是浮云啦


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2020-Jul-13 01:11am
栏目列表