什么是防火墙?
工作于主机或网络的边缘,对于进出的报文根据事先定义的规则作检查,将那些能够被规则所匹配到的报文作出相应处理的组件。
centos6.6上的防火墙组件:
netfilter:过滤器,内核中工作在tcp/ip网络协议栈上的框架
iptables:过滤规则的编写工具,定义的规则通过内核接口直接送至内核,立即生效,但不会永久有效;果期望有永久有效,需要保存至配置文件中,此文件还开机时加载和由用户手工加载;iptables可以自动实现规则语法检查。
netfilter在TCP/IP协议栈上定义了5个卡点(钩子函数)来控制报文:
hooks function(钩子函数):
prerouting: 进入本机后路由功能发生之前
input:到达本机内部
output: 由本机发出
forward: 由本机转发
postrouting:路由功能发生之后,即将离开本机之前
根据报文的分类,要经过的卡点如下:
到本机内部:prerouting,input
由本机发出:output,postrouting
由本机转发:prerouting,forward,postrouting
功能表:
过滤功能:filter表
卡点:input ,forward,output
修改功能:net表:修改报文的源地址和目标地址。
卡点:prerouting,output,postrouting
mangle表:修改报文IP,TCP报文首部的某些信息。
卡点:prerouting,postrouting,input,output,forward
追踪功能:raw表
卡点:prerouting,output
优先级(由高到低):raw --> mangle --> nat --> filter(最常用)
基本格式:
iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
-t TABLE:
默认为filter, 共有filter, nat, mangle, raw四个可用;
SUBCOMMAND(子命令):
CRETERIA: 匹配条件
扩展匹配:
隐式扩展:如果在通用匹配上使用-p选项指明了协议的话,则使用-m选项指明对其协议的扩展就变得可有可无了;
tcp:
--dport PORT[-PORT]
--sport
--tcp-flags LIST1 LIST2
LIST1: 要检查的标志位;
LIST2:在LIST1中出现过的,且必须为1标记位;而余下的则必须为0;
例如:--tcp-flags syn,ack,fin,rst syn
--syn:用于匹配tcp会话三次握手的第一次;
udp:
--sport
--dport
icmp:
--icmp-types
8: echo request
0:echo reply
显式扩展:必须指明使用的扩展机制;
-m 模块名称(每个模块会引入新的匹配机制);
想知道有哪些模块可用:
rpm -ql iptables
小写字母,以.so结尾;
multiport扩展:以离散定义多端口匹配;最多指定15个端口;
专用选项:
--source-ports, --sports PORT[,PORT,...]
--destination-ports, --dports PORT[,PORT,...]
--ports PORT[,PORT,...]
例子:
iptables -I INPUT 1 -d 172.16.100.11 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp -m multiport --sports 22,80,443 -j ACCEPT
iprange扩展:指定连续的ip地址范围;在匹配非整个网络地址时使用;
专用选项:
[!] --src-range IP[-IP]
[!] --dst-range IP[-IP]
示例:
iptables -A INPUT -d 172.16.100.11 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.11 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
string扩展:检查报文中出现的字符串,与给定的字符串作匹配;
专用选项:
--algo {kmp|bm} :两种字符串匹配算法
--string "STRING"
--hex-string "HEX_STRING":HEX_STRING为编码成16进制格式的字串;
示例:
iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp --sport 80 -m string --string "sex" --algo kmp -j REJECT
time扩展:基于时间区间做访问控制
专用选项:
--datestart YYYY[-MM][-DD][hh[:mm[:ss]]] :开始日期
--dattestop :停止日期
--timestart:开始时间
--timestop:停止时间
--weekdays DAY1[,DAY2,...]:控制每周的周几
示例:
# iptables -R INPUT 1 -d 172.16.100.11 -p tcp --dport 80 -m time --timestart 08:30 --timestop 18:30 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit扩展:基于连接数作限制;对每个IP能够发起的并发连接数作限制;
专用选项:
--connlimit-above [n]
示例:
# iptables -I INPUT 2 -d 172.16.100.11 -p tcp --dport 22 -m connlimit --connlimit-above 5 -j REJECT
limit扩展:基于发包速率作限制;
专用选项:令牌桶算法
--limit n[/second|/minit|/hour|/day]
--limit-burst n
示例:
iptables -R INPUT 3 -d 172.16.100.11 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
TARGET:
-j: jump,跳转目标
内置目标:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
自定义链:
未完。。。。。