[TOC]
防火墙分类 按照硬件组成部分划分: 硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现; 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙; 按照服务范围划分: 主机防火墙:服务范围为当前主机; 网络防火墙:服务范围为防火墙被的局域网;
netfilter netfilter是位于内核空间的一个防火墙框架,通过iptables这样一个规则管理工具,向框架中添加规则,从而实现防火墙功能。
iptables Firewall:防火墙的意思,只是一个隔离工具;Packets Filter Firewall,主要实现经过该网络的数据包的过滤功能;工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件;
1 2 netfilter:防火墙框架,framework;位于内核空间; iptables:命令行工具程序,位于用户空间;规则管理工具;
传说中的四表五链 要处理这些数据包总要一种规则,然而这些表和链就组成了一个规则。来看一张完整图:
1 2 3 4 5 6 7 8 9 10 11 12 表: filter表--过滤数据包 nat表--用于网络地址转换(IP、端口) mangle表--修改数据包的服务类型、TTL、并且可以配置路由实现QOS raw表--决定数据包是否被状态跟踪机制处理 链: INPUT链--进来的数据包应用此规则链中的策略 OUTPUT链--外出的数据包应用此规则链中的策略 FORWARD链--转发数据包时应用此规则链中的策略 PREROUTING链--对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理) POSTROUTING链--对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯最后都由这个链处理)
上图十分清晰的表明数据包的流向。
由于四表中我们常用的就只有filter和nat,所以再来一张鸟哥版精简图:
iptables的命令组成 匹配条件: 网络层首部:Source IP, Destination IP, … 传输层首部:Source Port, Destination Port, TCP Flags(SYN,ACK,FIN,URG,RST,PSH), … 扩展检查机制: 处理动作:target ACCEPT,DROP,REJECT,…
iptables 语法 iptables 不是固定的一种使用格式,而是有好多种。来看看帮助文档的写法吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # man iptables 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]
总结起来大概就是这样
1 2 3 4 iptables [-t TABLE] COMMAND CHAIN [num] 匹配条件 -j 处理动作 iptables [-t table] COMMAND chain criteria [-m matchname [per-match-options]] [-j targetname [per-target-options]] -t table:指明要管理的表; 默认为filter;
命令参数 命令参数这么多,那我们就来详细分析下命令吧。命令选项有长有断,后面只列举短的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 --append -A chain #增加链 --check -C chain #检查链规则 --delete -D chain #删除链规则 --delete -D chain rulenum #删除制定数链规则 --insert -I chain [rulenum] #插入指定链的规则到指定位置 --replace -R chain rulenum #替换链规则 --list -L [chain [rulenum]] #列出链规则 --list-rules -S [chain [rulenum]] #打印链规则 --flush -F [chain] #清空链规则 --zero -Z [chain [rulenum]] #清零链规则 --new -N chain #创建自定义链 --delete-chain -X [chain] #删除自定义链 --policy -P chain target #修改链策略 --rename-chain -E old-chain new-chain #重命名链
这些命令可分为三类:链管理,规则管理和查看。
链管理 1 2 3 4 5 6 -P:iptables [-t table] -P chain target,定义链的默认策略;其target一般可使用ACCEPT或DROP; -N:iptables [-t table] -N chain,自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数; -X:iptables [-t table] -X [chain],删除自定义的空的引用计数为0的链; -F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 ; -E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为0的链; -Z:iptables [-t table] -Z [chain [rulenum]] [options...]
规则管理 1 2 3 4 -A:append, iptables [-t table] -A chain rule-specification,追加规则到指定的链尾部; -I:insert, iptables [-t table] -I chain [rulenum] rule-specification,插入规则到指定的链中的指定位置,默认为链首; -D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum,删除指定的链上的指定规则; -R:replace,iptables [-t table] -R chain rulenum rule-specification,将指定的链上的指定规则替换为新的规则;
规则查看 1 2 3 4 5 6 -L:list, iptables [-t table] -L [chain [rulenum]] [options...] -n:数字格式; -v:verbose,详细格式信息; -vv, -vvv --line-numbers:显示链上的规则的编号; -x:exactly,显示计数器的精确值;
计数器 每条规则以及链的默认策略分别有各自的两个计数器: (1) 匹配到的报文的个数:pkts (2) 匹配到的所有报文的大小之积:bytes
匹配条件 [-m matchname [per-match-options]]
匹配条件包括基本匹配条件和扩展匹配条件,扩展匹配条件又分显示和隐式
1 2 3 4 5 匹配条件: 基本匹配条件 扩展匹配条件 隐式扩展 显式扩展
基本匹配条件 1 2 3 4 5 6 7 8 9 [!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或地址范围; [!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围; [!] -p, --protocol protocol:检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all"; [!] -i, --in-interface name:检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD and PREROUTING ; [!] -o, --out-interface name:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING; -m, --match match:显式指明要使用的扩展模块; -j, --jump target:跳转目标; 注:[!] :表示取反
扩展匹配条件 隐式扩展 隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p, {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 -p tcp:可直接使用tcp协议对应的扩展选项; [!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口; [!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; [!] --tcp-flags mask comp SYN,ACK,FIN,RST,URG,PSH; mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0; --tcp-flags SYN,ACK,FIN,RST SYN [!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN -p udp:可直接使用udp协议对应的扩展选项; [!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口; [!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; -p icmp:可直接使用cimp协议对应的扩展选项; [!] --icmp-type {type[/code]|typename} --icmp-type 0/0:匹配对ping请求的响应报文 --icmp-type 8/0:匹配ping请求报文
显示扩展 显式扩展:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 1、multiport 以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified. [!] --source-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] [!] --dst-range from[-to] 3、string 对报文中的应用层数据做字符串匹配检测; [!] --string pattern [!] --hex-string pattern --algo {bm|kmp}:字符串匹配检查算法; --from offset --to offset 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...] [!] --weekdays day[,day...] 5、connlimit 根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求; --connlimit-upto n:连接数小于等于阈值; --connlimit-above n:连接数超出阈值; ~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT 6、limit 基于收发报文的速率进行匹配; --limit rate[/second|/minute|/hour|/day] --limit-burst number # iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT 7、state 状态检测:连接追踪机制(conntrack) NEW:新连接 ESTABLISHED:已建立的连接 RELATED:相关联的连接 INVALID:无法识别的连接 UNTRACKED:未被追踪连接; 相关的内核模块: nf_conntrack nf_conntrack_ipv4 nf_conntrack_ftp 手动装载 追踪到的连接:/proc/net/nf_conntrack文件中; 能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max 建议调整至足够大; 不同的协议的连接追踪时长: /proc/sys/net/netfilter/ [!] --state state 如何开放被动模式的ftp服务: (1) 装载追踪ftp协议的模块; # modprobe nf_conntrack_ftp (2) 放行入站命令连接 # iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT (3) 放行入站数据连接 # iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT (4) 放行出站的ESTABLISHED连接 # iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
处理动作(跳转目标) -j tagetname [per-target-options]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 简单target: ACCEPT,DROP 扩展target: REJECT: --reject-with type icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, icmp-admin-prohibited, 默认为:icmp-port-unreachable; LOG: Turn on kernel logging of matching packets. --log-level level --log-prefix prefix:日志信息的前导信息;
保存和载入规则 CentOS 7:
1 2 3 4 5 6 保存:iptables-save > /PATH/TO/SOME_RULE_FILE 重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE -n, --noflush:不清除原有规则 -t, --test:仅分析生成规则集,但不予提交; 注意:重载文件中的规则,会清除已有规则;
CentOS 6:
1 2 3 4 5 6 7 保存:service iptables save 保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容; 重载:server iptables restart 默认重载/etc/sysconfig/iptables文件中的规则 脚本配置文件:/etc/sysconfig/iptables-config 用于指明要装载的模块;
规则添加是考量原则 (1) 报文流经的位置:用于判断将规则添加至哪个链; (2) 实现的功能:用于判断将规则添加至哪个表; (3) 报文的方向:用于判断哪个为“源”,哪个为“目标”; (4) 匹配条件:用于编写能够正确匹配目标报文的规则;
优化规则思路 (1) 优先放行双方向状态为ESTABLISHED的报文; (2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面; (3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面; (4) 设置默认策略:白名单机制
(a) 可使用iptables -P设定默认策略;不建议 (b) 建议在规则链的最后定义规则做为默认策略;
看完了吗?试试吧!
1 2 3 4 练习:基于状态放行telnet, ftp, ssh, http, samba, icmp等服务; (1) 对本机的ping请求每分钟不得超出20个; (2) 每客户端对本机的ssh的并发连接数不得超过3个; (3) 本机的telnet服务仅允许工作时间内访问;
网络防火墙 网络防火墙主要是在两个地方做:
(1) 网关; (2) filter表的FORWARD链;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 要注意的问题: (1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性; (2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接报文; NAT: Network Address Translation 请求报文:由管理员定义; 响应报文:由NAT的conntrack机制自动实现; 请求报文: 改源地址:SNAT 改目标地址:DNAT iptables/netfilter: NAT定义在nat表; PREROUTING,INPUT,OUTPUT,POSTROUTING SNAT:POSTROUTING DNAT:PREROUTING PAT: target: SNAT: This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains. --to-source [ipaddr[-ipaddr]] DNAT: This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains. --to-destination [ipaddr[-ipaddr]][:port[-port]] MASQUERADE This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target. SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target; REDIRECT This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains. --to-ports port[-port]