防火墙概述
防火墙:它是工作在主机或者网络的边缘,对进出的数据报文按照事先定义好的规则中的标准进行检查,一旦符合标准,就会采取由这个规则所定义的动作来进行处理的一套流程。
linux:网络防火墙
netfilter:Frame
iptables:数据报文过滤,NAT,mangle等规则生成的工具;
网络:IP报文首部,TCP报文首部
防火墙:硬件,软件:规则(匹配标准,处理办法)
Framework:
默认规则;
开放:堵
关闭:通
规则:匹配标准
IP:SIP,DIP
TCP:SPORT DPORT, SYN=1,FIN=0,RST=0,ACK=0(三次握手的第一次)
SYN=1, FIN=0, RST=0, ACK=1(三次握手的第二次)
SYN=0, FIN=0, RST=0, ACK=1(ESTABLISHED)
UDP:SPORT,DPORT
ICMP:icmp-type
数据报文过滤:
Linux2.0
ipfirewall/firewall
Linux2.2
ipchain/firewall
Linux2.4
iptables/netfilter
hook function:钩子函数
prerouting
input
output
forward
postrouting
规则链:
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
filter(过滤):表
INPUT
OUTPUT
FORWARD
nat(地址转换):表
PREROUTING[DNAT]
OUTPUT
POSTROUTING[SNAT]
mangel(拆开,修改,封装):表
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
RAW
PREROUTING
OUTPUT
每个filter,nat,mangel下都有多个链,每个链下又有多个规则,相当于多行多列(即表),这是为什么叫做iptables的原因
iptables总共有 四表五链,其作用是往这些表的链上写入相应的规则,并让他们完成相应功能的。
数据包过滤匹配流程
用法
iptables:
能否使用自定义链?
可以使用自定链,但只在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制;
用可以删除自定义的空链
默认链无法删除
每个规则都有两个内置的计数器:
被匹配的报文个数
被匹配的报文大小之和
规则:匹配标准,处理动作
netfilter:Framework,位于TCP/IP协议栈(内置了五个钩子函数),内核中
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
-
匹配标准:
-
通用匹配
-s, --src:指定源地址
-d, --dst:指定目标地址
-p {tcp|udp|imcp}:指定协议
-i INTERFACE:指定数据报文流入的接口
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o INTERFACE:指定数据报文流出的接口
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD -
扩展匹配
- 隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p{tcp|udp|icmp}
–sport PORT[-PORT]
–dport PORT[-PORT]
–tcp-flags mask comp:只检查mask指定的标志位,是逗号分隔的标志位列表: comp:此列表中出现的表记位必须为1, comp中没出现,而mask中出现的,必须为0:
–tcp-flags SYN,ACK,RST,FIN SYN = --syn - 显式扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能
-m EXTENSION --spe-opt
state:状态扩展
综合ip_conntrack追踪会话的状态
NEW:
ESTABLISHED
INVALID
RELATED
-m state --state NEW,ESTABLISHED -J ACCEPT
首先要装载ip_conntrack_ftp和ip_nat_ftp模块
iptables -A INPUT -d 172.16.100.7 -p tcp -m --state ESTABLISHED,RELATED -J ACCEPT
multiport:离散的多端口匹配扩展
–source-ports
–destination-ports
–ports
-m multiport --destination-port 21,22,80 -j ACCEPT
条件取反: !, -s 172.16.100.6 几乎所有的条件都可以取反。
iprange__ip地址范围扩展
-m iprange
–src-range
–dst-range
iptables -A INPUT -t tcp -m iprange --src-range 172.16.100.2-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-m connlimit:连接数限制
! --connlimit-above n 最大连接上限
iptables -N INPUT -s 172.16.100.3 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT 不超过两个连接的就放行,否则,拒绝掉第三个及其更多的连接。
-m limit
–limit rate 速率限制列如5/minute
–limit-burst 定义了limit match的峰值,即在单位时间内最多可通过的包数
iptables -t filter -A INPUT -m limit --limit-burst 5 -j ACCEPT 即在单位时间内最多可匹配5个包
-m string
–algo {bm|kmp}
–string “STRING”
- 隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p{tcp|udp|icmp}
-
-
命令:
- 管理规则
-A:附加一条规则,添加在链的尾部
-I:CHAIN [num]:插入一条规则
-D CHAIN [num]: 删除一条规则
-R CHAIN [num]: 替换一条规则
管理链:
-F: flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中所有链
-P: CHAIN:设定链的默认策略:
-N:自定义一个新的空链
-X:删除一个自定义的空链
-Z:置零指定链中所有的规则计数器
-E:重命名一条自定义的链 - 查看链:
-L:显示指定表中的规则
-n :以数字格式显示主机地址和端口号(iptables默认会反解IP成主机名,端口反解成对应的服务名,如果你没有配置DNS,那么这个反解的过程会非常慢,所以用-n可以解决这个慢的问题。)
-v:显示详细信息
-vv:
-x:显示计数器的精确值(exact)
–line-numbers:显示规则号码
- 管理规则
-
动作(target):
ACCEPT:放行
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
SNAT:源地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:日志
–log-prefix “STRING”
MARK:打标记
一些列子
1.丢弃掉192.168.2.0网络访问过来的数据包
iptables -t filter -A INPUT -s 192.168.2.0/24 -j drop
2.放行所有访问本机(172.16.100.7)22号端口的数据包
iptables -t filter -A INPUT -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
3.放行所有对本机器22号端口的新请求或者已经建立的请求
iptables -t filter -A INPUT -d 172.16.100.7 -p tcp --DPORT 22 -m state --state NEW,ESTABLISHED -j ACCEPT
4.使用自定义链
iptables -N clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
iptables -A clean_in ! --syn -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 172.16.100.7 -j RETURN 此条规则返回主链
iptables -I INPUT -j clean_in 使用自定义链