防火墙: IT领域的防火墙:一整套安全隔离工具; 1. 软件防火墙: 应用软件处理逻辑而运行通用硬件实现的防火墙; iptables/netfilter 包过滤防火墙; 2. 硬件防火墙: 在硬件级别能实现一部分防火墙功能,而另外一部分功能依然要基于软件实现; 防火墙的介绍:所谓防火墙,指的是工做于主机或网络的边缘,对于经由防火墙的数据报文根据预先定义的匹配规则(识别条件)进行检测,对于可以被规则匹配到的报文要采起某些预先定义好的处理机制予以处理,而对于没有被规则匹配的报文要设置默认访问控制处理机制的一套组件; 主机防火墙:其安全服务范围仅限于当前某台主机; 网络防火墙:其安全服务范围为当前局域网;
Linux系统中的防火墙的实现:
iptables/netfilter
既能够实现主机防火墙,又能够实现网络防火墙;缓存
netfilter:位于Linux系统内核中的防火墙的框架,Framework,防火墙功能实现的主体; iptables:专门为netfilter编写数据报文的匹配规则的用户空间中的应用程序工具; netfilter的逻辑结构: hook function: hook_input() hook_output() hook_forward() hook_prerouting() hook_postrouting() chain: INPUT OUTPUT FORWARD PREROUTING POSTROUTING table: filter:过滤器,包过滤防火墙功能; 包含:INPUT、OUTPUT、FORWARD三条链; nat:用于修改报文的源地址和/或目的地址,并且还能够修改端口号; 地址转换 地址假装 包含:PREROUTING、POSTROUTING、OUTPUT、INPUT(1.4+版本中新增长) mangle:拆解报文并对报文格式进行修改,而后再从新封装报文; 流量控制 数据标签 包含:PREROUTING、POSTROUTING、OUTPUT、INPUT、FORWARD五条链; raw:关闭nat表上启动的链接追踪机制; 包含:PREROUTING、OUTPUT两条链; 各个表中相同规则链上的规则生效优先级次序(从高到低): raw --> mangle --> nat --> filter 数据报文的流向: 入站数据——目的IP地址为防火墙主机的有效IP地址的数据报文: PREROUTING --> (Routing table) --> INPUT 出站数据——源IP地址为防火墙主机的有效IP地址的数据报文: PREROUTING --> (Routing table) --> OUTPUT --> POSTROUTING 转发数据——源、目的IP地址都不是防火墙主机的有效IP地址,且须要通过防火墙转发的数据报文: PREROUTING --> (Routing table) --> FORWARD --> POSTROUTING ** iptables/netfilter:** iptables:规则编写工具,非交互式命令行工具,一次只能编写一条规则并送往netfilter执行; netfilter的规则匹配顺序是:首项匹配; 首项匹配:由上至下依次匹配每条规则,且只要有规则可以匹配数据报文,则再也不继续检索其余匹配规则; ** iptables命令:** 规则编写工具: 规则: 也称为匹配规则或识别条件,根据要求定义的用来匹配进入、流出或通过本机的报文的匹配条件,而且在匹配以后指明具体的处理机制; 简单来讲,规则 = 匹配条件 + 处理动做 匹配条件: 基本匹配条件: 简单的IP、TCP、UDP等协议的报文首部中特定属性的匹配条件; 扩展匹配条件: 须要借助于扩展的功能模块进行匹配的机制; 隐式扩展: 不明确的指出使用哪一个具体的模块,但实际上确实在使用扩展模块来完成条件匹配; 显式扩展: 必需要明确指出这次使用哪一个具体模块来完成条件匹配; 处理动做: 基本动做: 即包过滤的动做: ACCEPT,DROP,REJECT 扩展动做: 须要借助于扩展模块才能执行的处理动做; 注意:想要添加正确合适的规则,须要事先考虑以下几个问题: 1.数据报文的流经路径,已肯定将规则添加至正确的表的正确链上; 2.肯定这次规则实现的功能,以选择正确的表; 3.肯定具体的匹配条件的内容,以便用于匹配感兴趣的数据; 4.肯定链的默认匹配条件和执行动做; ** iptables命令:** iptables/ip6tables — administration tool for IPv4/IPv6 packet filtering and NAT 格式: iptables [-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] target = -j targetname [per-target-options] iptables规则编写的通用格式: iptables [-t table] COMMAND CHAIN [-m matchname] [per-match-options] -j targetname [per-target-options] 说明: -t table:指定选择执行哪一个表的功能,能够选择的表包括:raw,mangle,nat及filter,若是省略此选项,则表示使用默认表——filter表; -m matchname:一般是配置显式扩展的匹配条件时,必须书写;若是省略则表示要配置基本匹配条件或隐式扩展匹配条件; -j targetname:指定全部匹配条件的数据包的处理动做; COMMAND: 链的操做命令; -P, --policy chain target 用于定义指定链的默认策略;一般有两种动做选择,即:ACCEPT和DROP; -N, --new-chain chain 建立一条新的自定义的规则链;新建的链上的规则必需要被内建链上的规则调用才能生效; -X, --delete-chain [chain] 删除被内建链调用次数为0的自定义链; -E, --rename-chain old-chain new-chain 重命名被内建链调用次数为0的自定义链; -F, --flush [chain] 清除指定链(表中全部链)上的规则; 规则的操做命令: -A, --append chain rule-specification 在指定的链的末尾追加一条规则; -D, --delete chain rule-specification -D, --delete chain rulenum 从指定的链上删除一条规则,能够指明具体规则,也能够指明规则在链上的编号; -I, --insert chain [rulenum] rule-specification 在指定的链上插入一条规则,默认是将新规则插入至链的第一条规则,也能够指定规则编号,是的插入的规则称为指定链上的第rulenum条规则; -R, --replace chain rulenum rule-specification 用命令行中的规则替换指令链上的第rulenum条规则;并非修改规则中某个具体条件,而是彻底替换整条规则; -L, --list [chain] 列表显示指定表指定链(全部链)上的全部规则; 可使用的其余经常使用选项: -v, --verbose:显示更详细格式的信息,还有-vv; -n, --numeric:将规则中的全部信息都进行数字化显示;包括主机名和端口号等信息; -x, --exact:精确的显示计数器的结果; 每一个规则都有两个计数器: 1.规则所匹配的报文的个数; 2.规则所匹配的报文的字节总数; --line-numbers:显示指定链上各个规则的编号; 其余的命令: -Z, --zero [chain [rulenum]] 将指定链的规则计数器置0; 经常使用的TARGETS: LOG:对于匹配的数据报文的流动状况进行日志记录,并不会影响数据报文自己的传输; MARK:对于匹配的数据报文进行防火墙标记的设置; MASQUERADE:源地址假装,一种特殊的源IP地址转换; REDIRECT:目标IP地址和端口的重定向; REJECT:阻止数据报文传输并向数据报文的源头返回消息; SNAT:源IP地址转换; DNAT:目标IP地址转换; ACCEPT:对于匹配的数据报文进行放行; DROP:对于匹配的数据报文进行阻止; RETURN:在规则链之间跳转; 匹配条件: 默认状况下,同一条命令中的不一样条件之间存在逻辑"与"的关系; !:对于匹配的结果取反,有除了...以外的意思; 基本匹配条件: [!] -s, --source address[/mask][,...] 检查数据报文中的源IP地址的匹配范围;能够是单个的IP地址,也能够是子网,主网,超网等IP地址设定;0.0.0.0/0表示整个IP地址栈中全部的IP地址;若是省略该条件,意味着将匹配全部的源IP地址; [!] -d, --destination address[/mask][,...] 检查数据报文中的目标IP地址的匹配范围;能够是单个的IP地址,也能够是子网,主网,超网等IP地址设定;0.0.0.0/0表示整个IP地址栈中全部的IP地址;若是省略该条件,意味着将匹配全部的目标IP地址; [!] -i, --in-interface name 检查数据报文入站的接口是否可以被此条件所匹配; [!] -o, --out-interface name 检查数据报文出站的接口是否可以被此条件所匹配; 扩展匹配条件: 隐式扩展匹配条件: [!] -p, --protocol protocol [!] -p, [-m matchname] --protocol protocol 检查数据报文某指定的协议的封装首部中是否有符合条件的特性或字段; 能够在此处指定的协议包括: tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh, all tcp协议(tcp模块): [!] --source-port,--sport port[:port] [!] --destination-port,--dport port[:port] 用于指定源端口和/或目标端口的匹配条件;每次只能指定一个端口或一组连续的端口范围,而不能指定离散端口; [!] --tcp-flags mask comp 用于指定在TCP协议首部中各标志位的匹配条件; URG, SYN, RST, PSH, ACK, FIN, ALL, NONE mask:设定要检测的标志位的列表,各标志位之间使用","进行分隔; comp:必须被置"1"的标志位列表,剩余的在mask列表中的标志位必须置"0"; [!] --syn 至关于:--tcp-flags SYN,RST,ACK,FIN SYN udp协议(udp模块): [!] --source-port,--sport port[:port] [!] --destination-port,--dport port[:port] 用于指定源端口和/或目标端口的匹配条件;每次只能指定一个端口或一组连续的端口范围,而不能指定离散端口; icmp协议(icmp模块): [!] --icmp-type {type[/code]|typename} 经常使用的icmp-type: echo-request,代码为8; echo-reply,代码为0; ** 定义规则时的注意事项:** 1.规则的匹配顺序是由上至下安装书写顺序进行匹配: 1) 同一类规则,匹配范围最小的应该写在最上面; 2) 非同一类的规则,匹配频率越高的应该写在上面; 3) 建议尽可能不修改链的默认策略为阻止全部数据,若是想要设置阻止全部数据的规则,在链的最后一条设置阻止全部数据的规则便可; ** 注意**:凡是经过FORWARD链来设置的网络防火墙的匹配规则,必须成对出现;即,数据的往返过程必须同时被放行,才能保证路由功能的正常进行; **显式扩展匹配条件:** 1.multiport扩展: 一次性的写入多个离散端口或多组连续端口,最大的上限15组端口,每个端口范围占用两个端口; 能够支持的协议:tcp, udp, udplite, dccp, sctp. 相关选项: [!] --source-ports,--sports port[,port|,port:port]... [!] --destination-ports,--dports port[,port|,port:port]... [!] --ports port[,port|,port:port]... --dports 22,80,3306 -j ACCEPT 示例: ~]# iptables -I FORWARD -s 192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT ~]# iptables -I FORWARD -d 192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT 2.iprange扩展: 以连续的任意数量的IP地址访问做为匹配条件; 相关选项: [!] --src-range from[-to] [!] --dst-range from[-to] -m iprange --src-range 192.168.100.1-192.168.100.100 示例: ~]# iptables -I FORWARD -m iprange --src-range 192.168.100.1-192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT ~]# iptables -I FORWARD -m iprange --dst-range 192.168.100.1-192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT 3.string扩展: 对数据报文中的应用层数据作字符串匹配检测; 相关选项: --algo {bm|kmp} --string "STRING" 示例: ~]# iptables -I FORWARD -s 172.16.69.2 -m string --algo bm --string "dafa" -j REJECT 4.time扩展: 根据报文到达防火墙本机的时间与指定的时间范围进行匹配检测; 相关选项: --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 定义惟一一个绝对的时间范围; --timestart hh:mm[:ss] --timestop hh:mm[:ss] 定义一个周期性的时间范围; [!] --monthdays day[,day...] 定义每月中各个天;取值1-31 [!] --weekdays day[,day...] 定义每一个星期中的星期几; 取值:Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7, or Mo, Tu, etc. 示例: ~]# iptables -I FORWARD -m time --timestart 08:00:00 --timestop 17:59:59 ! --weekdays 6,7 -o eno16777736 -j REJECT 5.state扩展 链接状态检测;基于链接追踪机制实现; conntrack 相关选项: [!] --state state iptables对链接状态的定义: INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED; INVALID:没法识别的链接状态,无效的通讯状态; SYN,FIN ESTABLISHED:已经创建链接的状态;链接态; NEW:还没有创建链接的状态;新链接态; RELATED:与其余已经创建的链接有相互关联的链接状态;关联态或衍生态; UNTRACKED:未追踪的状态; 内核中用于保存链接追踪状态数据的位置:/proc/net/nf_conntrack 可以被追踪到的最大的链接数:/proc/sys/net/nf_conntrack_max 注意:此处记录的最大链接数的数值,建议必要时能够调整其大小到足够大; 为了可以尽量的高效利用内存资源,缓存的链接追踪的状态不能无限期保存,所以设置了相应的超时时间; /proc/sys/net/netfilter/nf_conntrack*timeout* 利用链接追踪设置FTP服务器的访问控制: ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ~]# iptables -A INPUT -d 172.16.69.2 -p tcp -m multiport --dports 21,22,80,3306 -m state --state NEW -j ACCEPT ~]# iptables -A INPUT -j DROP 注意:须要装载nf_conntrack_ftp内核模块; ~]# modprobe nv_conntrack_ftp 设置nf_conntrack_ftp模块的自动装载: 设置/etc/sysconfig/iptables-config IPTABLES_MODULES="nf_conntrack_ftp" 利用链接追踪能够设置OUTPUT链上的通用规则: ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -j DROP 6.mac扩展 实现mac地址匹配检测;用于PREROUTING, FORWARD or INPUT链; 相关选项 [!] --mac-source address 匹配源mac地址;其形式必须是:XX:XX:XX:XX:XX:XX 7.connlimit扩展: 根据每一个客户端IP地址作并发链接数的匹配检测; 相关选项: --connlimit-upto n 当客户端当前的并发链接数小于或等于n时,能够匹配此条件;此条件一般和ACCEPT动做配合使用; --connlimit-above n 当客户端当前的并发链接数大于n时,能够匹配此条件;此条件一般和DROP或REJECT动做配合使用; 8.limit扩展: 基于服务器端收发数据报文的速率来进行匹配检测; 相关选项: --limit rate[/second|/minute|/hour|/day] 服务器端最大单位时间内可以接收的报文速率; --limit-burst number 初始时所能接收的数据报文的最大数量;