防火墙:一套安全隔离工具;
工作在网络边缘,对经过防火墙的数据报文,根据预先定义的匹配规则进行检测,如果能匹配,用预先定义好的处理机制进行处理,
如果不匹配,则用默认的处理机制进行处理的一套安全组件;
防火墙分为两种:
1)软件防火墙:
应用软件处理逻辑利用硬件实现的安全隔离;
2)硬件防火墙:
利用硬件实现安全隔离;
根据服务范围,防火墙分为两种:
1)主机防火墙:
工作在当前主机
2)网络防火墙
工作在当前局域网
Linux中防火墙的实现依赖:iptables/netfilter
功能: 实现主机防火墙和网络防火墙
netfilter: 位于Linux内核中的防火墙框架,防火墙功能实现的主体是framework;
iptables: 客户端工具,为netfilter编写数据报文的规则;
防火墙的基础概念:
netfilter的逻辑结构:
1.hook function:钩子函数
hook_input()
hook_output()
hook_forward()
hook_prerouting()
hook_postrouting()
clain : 规则链,与钩子函数一一对应
input
output
forward
prerouting
postrouting
table: 表——多条链的组合
filter :由input,output,forward三条链组成;
功能: 实现过滤功能,对入站,出站,转发的数据报文进行过滤;
nat : 由input,output,prerouting,postrouting四条链组成
功能: 用于修改报文的源地址和目的地址,实现地址伪装和地址转换
mangle: 由所有链组成
功能: 拆解报文修改首部格式,进行再封装,可实现数据标签和流量控制
raw : 由prerouting,output链组成;
功能:关闭nat表上启动的连接追踪机制;
注意: 同一条链在不同表上的优先级不同,由低到高依此是filter-nat-mangle-raw
数据报文的流向:
1.入站数据:目的地址为防火墙主机的数据报文;
prerouting---routing table---input
2.出站数据:源地址为防火墙主机的数据报文
prerouting---routing table---output---postrouting
3.转发数据:源地址和目的地址不是防火墙主机,但需要经过防火墙主机的数据报文
prerouting---routing table---forward---postrouting
使用iptables命令编写规则
根据定义用来匹配入站,出站的数据报文的匹配条件,匹配后指明处理动作;
规则组成:匹配条件+处理动作
匹配条件分为
1.基础匹配条件:
简单的IP,tcp,udp,icmp等协议报文首部中特定属性的匹配条件
2.扩展匹配条件:借助扩展模块进行匹配的机制
1): 隐式扩展
不明确指出使用哪个模块,实际已经使用
2): 显示扩展
指明使用哪个模块进行条件匹配
处理动作:
ACCEPT:接受报文
DROP :丢弃报文
REJECT : 弹回报文
LOG:对于匹配的数据报文的流动情况进行日志记录,并不会影响数据报文本身的传输;
MARK:对于匹配的数据报文进行防火墙标记的设置;
MASQUERADE:源地址伪装,一种特殊的源IP地址转换;
REDIRECT:目标IP地址和端口的重定向;
REJECT:阻止数据报文传输并向数据报文的源头返回消息;
SNAT:源IP地址转换;
DNAT:目标IP地址转换;
注意: 若想正确的添加规则,需考虑:
1.数据报文的流经路径,将规则添加至相应表的相应链上
2.确定要实现的功能,选择正确的表
3.确定具体的匹配条件内容
4.设置链的默认匹配规则;
iptables命令:
通用规则:
iptables [-t table] COMMAND CHAIN [-m matchname] [per-match-options] -j targetname [per-targement-options]
-t table : 指定表,filter,nat,mangle,raw
COMMAND: 链的操作命令
-P: 指定链的默认策略,通常由ACCEPT,DROP
] # iptables -t filetr -P input -j ACCEPT(默认允许filter表的input链上的报文通过)
] # iptables -t filetr -P output -j ACCEPT(默认丢弃filter表的input链上的报文)
-N: --new chain chain:自定义一条规则链
] # iptables -N pass(自定义一条名为pass的链)
-X:--delete-chain [chain]:删除被内建链调用次数为0的自定义链
-F: --flush [chain]
] # iptables -F :清空所有链的规则
] # iptables -F input:清空input链上的所有规则
-E: --rename-chain old-cahin new-chain
] # iptables -E pass PASS:将自定义链pass改名为PASS
给链添加规则的命令:
-A, --append chain rule-specification
在指定的链的末尾追加一条规则;
-D, --delete chain rule-specification
-D, --delete chain rulenum
从指定的链上删除一条规则,可以指明具体规则,也可以指明规则在链上的编号;
] # iptables -D INPUT 1(删除INPUT链上的第二条规则)
-I, --insert chain [rulenum] rule-specification
在指定的链上插入一条规则,默认是将新规则插入至链的第一条规则,也可以指定规则编号,是的插入的规则称为指定链上的第rulenum条规则;
] # iptables -I INPUT -s 172.16.1.11 -p tcp --dports 80 -j ACCEPT (在INPUT链上插入一条规则允许172.16.1.11主机访问本机的web资源)
-R, --replace chain rulenum rule-specification
用命令行中的规则替换指令链上的第rulenum条规则;并不是修改规则中某个具体条件,而是完全替换整条规则;
] # iptables -R INPUT 2 -j REJECT (将IPNPUT链上的第二条规则替换为弹回)
-L, --list [chain]
列表显示指定表指定链(所有链)上的所有规则;
可以使用的其他常用选项:
-v, --verbose:显示更详细格式的信息,还有-vv;
-n, --numeric:将规则中的所有信息都进行数字化显示;包括主机名和端口号等信息;
-x, --exact:精确的显示计数器的结果;
每个规则都有两个计数器:
1.规则所匹配的报文的个数;
2.规则所匹配的报文的字节总数;
--line-numbers:显示指定链上各个规则的编号;
] # iptables -vnL (列出所有表所有链上的所有规则)
] # iptables -vnL INPUT (列出INPUT链上的所有规则)
] # iptables -vnL --line-numbers INPUT (列出INPUT链上的所有规则及对应的编号)
其他的命令:
-Z, --zero [chain [rulenum]]
将指定链的规则计数器置0;
-m matchname: 扩展模块
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]...
] # iptables -A INPUT -s 172.16.1.11 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
(允许172.16.1.11主机访问本机的ssh服务,web服务,mysql服务)
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.1.11 -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.1.11-p tcp -m multiport --sports 22,80,3306 -j ACCEPT
(对源地址段为192.168.100.1到192.168.100.100范围内的主机向172.16.1.11主机访问ssh服务,web服务,mysql服务进行请求的报文进行转发)
3.string扩展模块
对数据报文中的应用层数据做字符串匹配检测;
相关选项:
--algo {bm|kmp}
--string "STRING"
~]# iptables -I FORWARD -s 172.16.1.11 -m string --algo bm --string "mysql" -j REJECT
(反弹源地址为172.16.1.11主机请求web资源中带有“mysql”的报文)
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 18:00:00 ! --weekdays 6,7 -o ens33 -j REJECT
(从周一到周五早上8点到下午6点不允许通过ens33接口访问外部网络)
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*
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
初始时所能接收的数据报文的最大数量;
~]# iptables -I INPUT 1 -p icmp --icmp-type 8 -m limit --limit 15/minute --limit-burst 8 -j ACCEPT
per-match-options:匹配条件
基本匹配条件:
[!] -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
检查数据报文出站的接口是否能够被此条件所匹配;
扩展匹配条件:
1) 隐式扩展匹配条件:
[!] -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) 建议尽量不修改链的默认策略为阻止所有数据,如果想要设置阻止所有数据的规则,在链的最后一条设置阻止所有数据的规则即可;
- j targetment:指定符合匹配条件的数据报文的处理动作
通常有ACCEPT,DROP,REJECT
per-target-options:处理动作的相关选项;
原文:http://blog.51cto.com/yuantianchi/2120434