防火墙概述:
在互联网上我们的主机随时都有被攻击的可能,因此我们需要用到防火墙机制来保护我们互联网上的主机,在我们主机上面,防火墙主要是通过一些规则来限制一些不安全因素的网络信息传输,准确的说,防火墙就是制定一些有顺序的规则,来管理所负责的范围内的主机数据封包的一种机制,通过防火墙我们能够分析和过滤进出主机或者网络的封包数据,从而将一些不安全因素的包隔离开。
iptables与netfilter:
Linux上的防火墙是由iptables/netfilter组成,iptables是基于netfilter基本架构实现的一个可扩展的数据报高级管理系统或核外配置工具(简单来说就是规则编写工具),netfilter位于内核中tcp/ip协议栈上的一个framework(框架),由五个hook function(钩子函数)组成。netfilter起到过滤封包,转换与映射IP地址和端口,拆分和修改封包内容,追踪封包等功能。
iptables是用户层的工具,它提供命令行接口,能够向netfilter中添加规则策略,从而实现报文过滤,修改等功能。Linux系统中并不止有iptables 有防火墙规则,其他的工具如firewall(firewall隔离工具,工作于主机或网络的边缘,对经由的报文根据预先定义的规则(识别条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件)也能实现类似的功能。
iptables从字面意义上讲是由ip和tables组成,因为防火墙里面有许多个table(表),每个表格里面都定义许多的规则,并且每个表格的用途不同,iptables按用途和功能对其分类成四个表,这四个表又由五个链组成,这五个链对应上面五个钩子函数。
iptables(表):
filter:过滤,防火墙(默认表是filter);
nat:network address translation网络地址转换;用于修改报文的源地址或目标地址,甚至是端口;
mangle:拆解报文,作出修改,并重新封装起来(使用情况很少);
raw:关闭nat表上启用的连接追踪机制;
表的优先级顺序(由高到低):raw --> mangle --> nat --> filter
chain(链):
INPUT:进入;通过路由表判断后目的地是本机,然后进入本机内部资源;
OUTPUT:放出;由本机产生的数据向外部转发;
FORWARD:通过路由表判断后目的地不是本机,然后通过路由转发到其他地方;
PREROUTING:流入的数据包进入路由表之前;
POSTROUTING:传出的数据包到达网卡出口前;
报文流向:
到本机某进程的报文:PREROUTING-->INPUT
由本机转发的报文:PREROUTING-->FORWARD-->POSTROUTING
由本机某进程发出的:OUTPUT-->POSTROUTING
四个表中每个表对应的链分别为:
filter:INPUT,FOTWARD,OUTPUT
nat:PREROUTING,INPUT,OUTPUT,POSTRUTING
mangle:PREROUTING,INPUT,FORWARD,POSTROUTING
raw:PREROUTING,OUTPUT
在添加规则的时候需要考量几点:
- 报文的流经路径,判断添加规则至哪个链上;
- 确定要实现的功能,判断添加规则至哪个表上;
- 要指定的匹配条件,以用于匹配目标报文;
要特别注意的是链上的规则在匹配过程中是有次序的,即为检查次序,因此在制定时要遵循以下法则:
- 同类规则,匹配范围小的在上面;
- 不同类规则,匹配报文几率较大的放上面;
- 应该设置默认策略;
对于iptables上面也说了,它是一个规则的管理工具,通过iptables可以自动实现规则的语法检查,另外iptables制订的规则和链中还有计数器来记录规则或链匹配到的报文的个数,以及匹配到的所有报文大小之和。
iptables生成规则后送往netfilter中,规则通过内核接口直接送至到内核,因此,会立即生效,但是不会永久有效,如果希望永久有效,需要保存至配置文件中,此文件在开机时自动加载或由用户手动加载。
iptables命令的使用格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...](匹配条件) [target](目标处理动作)
match = -m matchname(指明加载哪个扩展模块) [per-match-options](模块专用选项)
arget = -j targetname(指明动作名称) [per-target-options](动作名称选项)
规则的编写格式:
iptables [-t table] COMMAND CHAIN CRITERIA -j TARGET
-t table:filter,nat,mangle,raw
COMMAND:
链:
-P:policy,策略,定义默认策略;一般有两种选择,ACCEPT和DROP;
-N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效:[-j chain_name];
-X:drop,删除用户自定义的空链;非空自定义链和内置链无法删除;
-F:flush,清空指定的链,清空规则;
-E:重命名自定义的引用计数为0的链;
-Z:zero,将规则的计数器置0;
规则的管理:
-A:append,追加,在指定链的尾部追加一条规则;
-I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;可以加号码,插入2,原来的2就变成3;
-D:delete,删除,删除指定的规则;删除指明rulenum即可;
-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换;
查看:
-L:list,列出表中的链上的规则;以下选项跟-L使用
-n:numeric,以数值格式显示;
-v:verbose,显示详细格式信息;
-vv,-vvv 详细级别,vv二级详细,vvv三级详细
-x:exactly,计数器的精确结果;
--line-numbers:显示链中的规则编号;
#iptables -vnL --line-numbers 看看有几条
计数器:
规则,以及默认策略有专用的计数器;
记录被当前规则或默认策略所匹配到的:
(1)报文个数(一个包就是一个报文);
(2)报文字节总数(所有匹配到的报文之和);
CHAIN(链):
(1)内建链;
(2)自定义链;
CRITERIA(匹配条件):
基本匹配条件:以下!表示取反,除了XXX之外的
[!] -s,--source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!] -d,--destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
[!] -p,--protocol protocol:检查报文中的协议,即ip首部中的protocol所标识的协议:tcp、udp或icmp三者之一;
protocol:{tcp|udp|icmp}
[!] -i,--in-interface name:数据报文的流入接口;INPUT,FORWARD adn PREROUTING
[!] -o,--out-interface name:数据报文的流出接口;FORWARD,OUTPUT adn PREROUTING
扩展匹配条件:
隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;
-p tcp:隐含了-m tcp;针对tcp协议
[!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
[!] --tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔
comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0;
[!] --syn:用于匹配tcp会话三次握手的第一次;
相当于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隐含了-m udp:针对udp协议
[!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
-p icmp:隐含了-m icmp:针对icmp协议
[!] --icmp-type {type[/code]|typename}
8:echo-requesr
0:echo-reply
显式扩展:必须使用-m选项指明使用的扩展机制,有的match可能存在专用的选项;
获取帮助:
CentOS 7:man iptables-extensions
CentOS 6:man iptables
-m 模块名称:
每个模块会引入新的匹配机制;
可以通过rpm -ql iptables来获得哪些模块可用,模块是以.so结尾的;
1、multiport扩展
以离散或连续的方式定义多端口匹配条件(dsport,sport只能指定一个端口,这个扩展可指定多个);
[!] --soutce-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]..:指定多个目标端口;
[!] --ports port[,port|,port:port]...:指定多个端口;
2、iprange扩展
指定连续的ip地址范围,在匹配非整个网络地址时使用;
[!] --src-range from[-to]:源IP地址;
[!] --dst-range from[-to]:目标IP地址;
3、string扩展
检查报文中出现的字符串,与给定的字符串做匹配;
[!] --string pattern:要检测字符串模式:
[!] --hex-string pattern:要检测的字符串模式,16进制编码;
--algo {bm|kmp}
4、time扩展
根据报文到达的时间与指定的时间范围进行匹配检测;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datastop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
--timestart hh:mm[:ss]:
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
根据时间和星期来匹配
5、connlimit扩展
根据每客户端IP做并发连接数匹配;
--connlimit-upto n:连接数数量小于等于n,此时应该允许;
--connlimit-above n:连接数数量大于n,此时应该拒绝;
6、limit扩展
基于收发报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day]:平均速率(每秒钟几个报文,每分钟,每小时,每天)
--limit-burs number:峰值速率
7、state扩展
状态检测:连接追踪机制(conntrack);
INVALID:无法识别的状态;
ESTABLISHED:已建立的连接;
NEW:新连接;
RELATED:相关联的连接;
UNTRACKED:未追踪的连接;
专用选项:[!] --state STATE
如何开放被动模式的ftp服务:
(1)装载追踪ftp协议的模块
#modprobe nf_conntrack_ftp
(2)放行命令连接
#iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -j ACCEPT
#iptables -A INPUT -d 172.16.100.67 -p tcp --dport21 -m state --state NEW -j ACCEPT
(3)放行数据连接
#iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT
TARGET(目标动作):
-j targetname [per-target-options]
targetname:
ACCEPT:接受;
DROP:丢弃;
REJECT:拒绝;
以上连接追踪功能内核会在内存中开辟一段专用的空间用于存储连接的状态等,由于此段内存空间是有限的,因此就必须对连接追踪功能进行一些调整限制:
状态nf_conntrack内核模块;#modprobe nf_conntrack
追踪到的连接:/proc/net/nf_conntrack文件中;
能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max 此值可自行定义,建议必要时调整到足够大;
不同的协议的连接追踪的时长:/proc/sys/net/netfilter/
规则优化;
(1)可安全放行所有入站及出站,且状态为ESTABLISHED的连接;
(2)服务于同一类功能的规则,匹配条件严格的放前面,宽松的放后面;
(3)服务于不同类功能的规则,匹配报文可能性较大放前面,较小放后面;
(4)设置默认策略;(a)最后一条规则设定;(b)默认策略设定;
保存和重载规则:
CentOS 6:
保存规则:
- iptables-save > /PATH/TO/SOMEFILE
- service iptables save;自动保存规则至/etc/sysconfig/iptables文件中;
重载规则:
- iptables-restore < /PATH/TO/SOMEFILE
- server iptables restore;从/etc/sysconfig/iptables文件中重载规则;
CentOS 7:引入了新的iptables前端管理服务工具firewalld
firewalld通过前端管理工具:firewalld-cmd和firewalld-config,其功能更强大更完善,因此规则会更复杂,所以我们需要在centos7上先关掉和禁用firewall服务,方法如下:
#systemctl stop firewalld.service
#systemctl disable firewalld.service
linux系统防火墙iptables命令规则及配置的示例:https://blog.whsir.com/post-167.html