防火墙,其实说白了将,就是用于实现linux下访问控制的功能的,它分为两种方式,硬件防火墙和软件防火墙。不过无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义防火墙如何工作的,这就是防火墙的策略,规则,以达到让它对出入网络的IP,数据进行检测。
目前市面上比较常见的有3,4层的防火墙,叫做网络层的防火墙,还有7层的防火墙1,其实是代理层的防火墙。
对于TCP/IP的7层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址什么的,都将对于你所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是者却带来了效率更低。所以市面通常的防火墙方案,都是两者结合的。也即是说防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。
iptables的工作机制
四表五链:
四表:
1.filter:过滤,防火墙;
2.nat:network address
3.translation;用于修改报文的源地址或目标地址,甚至是端口;
4.mangle:拆解报文,做出修改,并重新封装起来;
raw:关闭nat表上启用的连接追踪机制;
conntrack:追踪连接机制
数据包匹配流程的优先级次序(由高而低):
raw –> mangle –> nat –> filter
五链:
PREROOUTING:路由前
INPUT: 数据包流入入口
FORWARD: 转发管卡
OUTPUT: 数据包流出出口
POSTROUTING;: 路由后
#这是Netfilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链
#iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。
功能<–>钩子:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTRUTING
filter:INPUT,FORWARD,OUTPUT
报文流向:
到本机某进程的报文:PREROUTING –> INPUT
由本转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本某进程发出的:OUTPUT –> POSTROUTING
规则的写法:
添加规则之时需要考量的问题:
(1) 报文的流经路径,判断添加规则至哪个链上;
(2) 确定要实现的功能,判断添加规则至哪个表上;
(3) 要指定的匹配条件,以用于匹配目标报文;
#同类规则 访问量大的,放前面 //仅供参考
#不同规则 访问量多的放前面
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查
iptables的通用格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]
-t table:
默认为filter;其它可用的有raw, mangle, nat;
COMMAND:
链:
-P:policy,策略,定义默认策略; 一般有两种选择,ACCEPT和DROP;
-N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效;[-j chain_name];
-X:drop,删除自定义的引用计数为0的空链;
-F:flush,清空指定的链;
-E:重命名自定义的引用计数和为0的链;
规则:
-A:append,追加,在指定链的尾部追加一条规则;
-I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;
-D:delelte,删除,删除指定的规则;
-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换;
查看:
-L:list,列出表中的链上的规则;
-n:numeric,以数值格式显示;
-v:verbose,显示详细格式信息;
-vv, -vvv
-x:exactly,计数器的精确结果;
–line-numbers:显示链中的规则编号;
处理动作(目标)
-j targetname [per-target-options]
targetname:
ACCEPT:接受;
DROP:丢弃;
REJECT:拒绝;
计数器:
规则,以及默认策略有专用的计数器;
记录被当前规则所匹配到的:
(1) 报文个数;
(2) 字节总数;
重置规则计数器:
-Z:zero,置0;
chain:
(1) 内建链;
(2) 自定义链;
扩展模块介绍:
tcp:定义协议的模块
–sport:定义源端口,可以定义连续的端口,如22:80
–dport:目标端口,性能同–sport
–tcp-flags:tcp标记位
–tcp-flags SYN,ACK,FIN,RST, SYN:这个表示匹配SYN,ACK,FIN,RST中以SYN为1,ACK,FIN,RST为0,其余的忽略
–syn:是–tcp-flags的一个扩展,就是匹配三次握手的第一次
connlimit:允许的最大连接数
[!] –connlimit-above NUMBER:最大允许连接的个数,可取反
iprange:定义一个ip范围,可用作源IP与目标IP的范围
[!] –src-range:源地址范围
[!] –dst-range:目标地址范围
limit:这个模块用于定义连接频率与首次连接最大连接个数(令牌筒)
–limit RATE:定义其连接速率
–limit-burst NUM:定义首次连接次个数
state:这个模块是根拒据状态来判定数据包
[!] –state STATE:对状态流量进行操作
STATE:
ESTABLISHED:已连接
NEW:新建立连接
RELATED:关联的连接,追踪连接
INVALID:不能识别的
UNTRACKED:未追踪的连接
string:这个模块是对内容中的字符串进行匹配
–algo {bm|kmp}:匹配字符串的算法
[!] –string STRING:所要匹配的字符串
time:时间匹配数据包
–datestart:开始日期时间
–datestop:结束日期时间
–timestart:开始时间
–timestop:结束时间
[!] –monthdays:一个有的那一日
[!] weekdays:一周的那一天
multiport:定义多个不连续的端口的模块
[!] –sport:源端口21,22,80:200
[!] –dport:目标端口
部分扩展动作介绍:
DNAT:目标地址转换
–to-destination:转到那一个地址,可以跟端口,也可以跟多个连续的端口
SNAT:源地址转换
–to-source:转到那一个地址,可以跟一个商品,也可以跟多个端口
LOG:是一个开启日志的动作
–log-level NUM:开启日志的日志级别
–log-prefix:日志的前缀
MASQUERADE:IP为动态IP,连接猫的时候可以用户这个动作
–to-ports:转化的商品有那些,如80-100
REDIRECT:端口重定向
–to-ports 9090:将指定商品生定向为9090
保存和重载规则:
iptables-save > /PATH/TO/SOME_RULE_FILE (/etc/sysconfig/iptables)
iptables-restore < /PATH/FROM/SOME_RULE_FILE
规则优化:
(1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;
(2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;
(3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;
(4) 设置默认策略;
(a) 最后一条规则设定;
(b) 默认策略设定;
实例演练:
1.假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
小扩展:对于127.0.0.1比较特殊,我们需要明确定义它
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
iptables -A INPUT -p tcp –dport 21 -s172.16.0.0/16 -m time –weekdays 1,2,3,4,5 –timestart 8:30 –timestop 18:00 -mconnlimit –connlimit-above 5 -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
iptables -A INPUT -m iprange –src-range172.16.1.1 -172.16.1.100 -m limit –limit 2/m –limit-burst 2 -j ACCEPT
iptables -A OUTPUT -p tcp –dport 22 -mstate –state ESTABLISHED -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
iptables -A INPUT -p tcp -m –tcp-flag ALL ALL -j DROP
原创文章,作者:All well,如若转载,请注明出处:http://www.178linux.com/74599