1. iptables
用于实现Linux下访问控制的功能,它分为硬件或软件防火墙两种,无论哪种,防火墙都是工作的地方一定是在网络的边缘,我们的工作就是需要去定义到底防火墙是如何工作,这就是防火墙的策略以及规则,以达到让它对出入网络的IP,数据进行检测.
iptables/netfilter:软件实现的主机或网络防火墙
主机防火墙:服务范围为当前主机;
网络防火墙:服务范围为局域网;
iptables/netfilterIP数据包过滤系统实际上有netfilter和iptables两个组件构成,
netfilter组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集.
iptables组件是一种工具,也称为用户空间,它使插入,修改和除去信息包过滤表中的规则变得容易.
iptables包含4个表,5个链,其中表是按照对数据包的操作区分的,链是按照不同的Hook(钩子)点来区分的,实际上似乎netfilter的两个维度.
4个表:filter,nat,mangle,raw,默认的表是filter(没有指定表的时候就是filter表).表的处理优先级为:rawàmangleànatàfilter.
filter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射等)
mangle:拆解数据包,做出修改,并重新封装起来
raw:优先级最高.设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能.
5个链:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTING:发送到网卡接口之前.
iptables中表和链的对应关系:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PRETOUTING,INPUT,OUTPUT,POSTROUTING
filter:INPUT,FORWOAR,OUTPUT
最常用的链:input(进入),output(出去),forward(转发),而PREROUTING和POSTROUTING用于网络地址转换(NAT)
报文流向:
到本机某进程的报文:PREROUTINGàINPUT
当一个数据包进入网卡时,首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去,如果数据包是进入本机的,则数据包会到达INPUT链.到达后,任何进都会收到它.
由本机转发的报文:PREROUTINGàFORWARDàPOSTROUTING
由上文的第一步开始后,内核根据数据包目的IP判断需要转送出去后,且内核允许转发,数据包会送到FORWARD链,然后在到达POSTROUTINGOUT链输出.
由本机某进程发出的:OUTPUTàPOSTROUTING
规则的组成部分:
规则就是运维管理人员定制的条件,规则一般定义为如果数据包头符合条件,就处理处理数据包,规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址,目的地址,传输协议(如TCP,UDP,SMCP等)当数据包于规则匹配是,iptables就根据所定义的方法来处理数据包,如放行,(ACCEPT),拒绝(REJECT),丢弃(DROP)等,配置防火墙的主要工作就是添加,修改和删除这些规则.
注意:处理数据包时,如果不想处理数据包时,定义方法最好为丢弃(DROP),如果处理方法为拒绝(REJECT)的话对方根据此来判断此主机是存在,那么就会想法设法***.
2. iptables命令
规则的编写格式:
iptables [-t table]COMMAND chain [-m matchname [per-match-options]] [-j targetname[per-target-options]]
-t:表名
默认为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,插入,在指定的为位置(省略位置时表示链首)插入一条规则;
-I 3:表示插入为第3条
-D:delete:删除,删除指定的规则
-D 3:表示删除为第3条
-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是全部替换;
-R 3:表示替换第3条规则
查看:
-L:list,列出表中链上的规则;
-n:numeric,以数值格式显示;
-v:verbose,显示详细格式信息;
-vv,-vvv:表示更加详细的格式信息
-x:exactly:计数器的精确结果;
--line-numbers:显示链中的规则编号;
计数器:
重置规则计数器:
-Z:zero,归0操作;
Chain
(1) 内建链;
(2) 自定义链;
匹配条件:
多重条件:逻辑关系为与;
基本匹配条件:
[!] –s,--sourceaddress[/mask][,…:] :检查报文中的源IP地址是否符合此处指定的地址或范围;可以写多重条件用”,”隔开
[!] –d, --destinationaddress[/mask][,…] :检查报文中的目标IP地址是否符合此处指定的地址;
[!] –p,--protocol {TCP|UDP|ICMP}:检查报文中的协议是否符合此处指定的协议
[!] -i, --in-interface name:数据报文的流入接口;INPUT,FORWARDand PREROUTING
[!] –o, --out-interfacename:数据报文的流出接口;FORWARD,OUTPUT and POSTROUTING
扩展匹配条件
隐式扩展::不用-m选项指出matchname即可使用此match的专用选项进行匹配
-p tcp:隐含了-mtcp;
[!]--urce=port,--sport port[:port] :匹配报文中传输层的源端口;
[!]--stination-port,--dport port[:port]: 匹配报文中传输蹭的目标端口;
[!]--tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔;
comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0;
--tcp-flags SYN,ACK,FIN,RST SYN
[!] --syn:
相当于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隐含了-mudp:
[!]--source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!]--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
-p icmp:隐含了-micmp:
[!]--icmp-type {type[/code]|typename}
8:echo-request
0:echo-reply
显示扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;
获取帮助:
Centos 7: maniptables-extensions
Centos 6:man iptables
Multiport扩展
以离散或连续的方式定义多端口匹配条件;
[!] –source-ports,--sportspotr[,port|,port:port]… :指定多个源端口
[!]—destination-ports,dportsport[,port|,port:port]…:指定多个目标端口
[!]—ports port[,port|,port:port]...:指定多个端口;
Iprange扩展
以连续的ip地址范围指明连续的多地址匹配条件;
[!]--src-range from[-to]:源IP地址;
!]--dst-range from[-to]:目标IP地址;
string扩展
对报文中的应用层数据做字符串匹配检测;
[!]--string pattern:要检测字符串模式;
[!]--hex-string pattern:要检测的字符串模式,16进制编码;
--algo{bm|kmp}
Time扩展
根据报文到达的时间与指定的时间范围进行匹配度检测;
--datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
--timestarthh:mm[:ss]
-timestop hh:mm[:ss]
[!]--monthdays day[,day...]
[!]--weekdays day[,day...]
~]# iptables -I INPUT-d 172.16.100.67 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT
connlimit扩展
根据每客户端IP做并发连接数匹配;
--connlimit-upton:连接数数量小于等于n,此时应该允许;
--connlimit-aboven:连接数数量大于n,此时应该拒绝;
~]# iptables -A INPUT-d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
limit扩展
基于收发报文的速率进行匹配;
--limitrate[/second|/minute|/hour|/day]:平均速率
--limit-burstnumber:峰值速率
state扩展
状态检测;连接追踪机制(conntrack);
INVALID:无法识别的状态;
ESTABLISHED:已建立的连接;
NEW:新连接;
RELATED:相关联的连接;
UNTRACKED:未追踪的连接;
nf_conntrack内核模块;
踪到的连接:/proc/net/nf_conntrack文件中;
能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
此值可自行定义,建议必要时调整到足够大;
不同的协议的连接追踪的时长:
/proc/sys/net/netfilter/
[!]--state STATE
处理动作(目标)
j targetname [per-target-options]
rgetname:
ACCEPT:接受
ROP:丢弃;
EJECT:拒绝;
3. 保存和重载规则:
ptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore< /PATH/FROM/SOME_RULE_FILE
CentOS 6:
保存规则:
service iptablessave
自动保存规则至/etc/sysconfig/iptables文件中;
重载规则:
server iptables restore
从/etc/sysconfig/iptables文件中重载规则;
4. 规则优化:
(1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;
(2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;
(3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;
(4) 设置默认策略;
(a) 最后一条规则设定;
(b) 默认策略设定;