前提基础:
一、当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。linux
二、iptables实现防火墙功能的原理是:在数据包通过内核的过程当中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件能够在这5处地方写规则,对通过的数据包进行处理,规则通常的定义为“若是数据包头符合这样的条件,就这样处理数据包”。网络
三、iptables中定义有5条链,说白了就是上面说的5个钩子函数,由于每一个钩子函数中能够定义多条规则,每当数据包到达一个钩子函数时,iptables就会从钩子函数中第一条规则开始检查,看该数据包是否知足规则所定义的条件。若是知足,系统就会根据该条规则所定义的方法处理该数据包;不然iptables将继续检查下一条规则,若是该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包tcp
四、iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具备必定的优先级:raw-->mangle-->nat-->filteride
一条链上可定义不一样功能的规则,检查数据包时将根据上面的优先级顺序检查
linux iptables详解--我的笔记
一、目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;函数
二、若知足PREROUTING的nat表上的转发规则,则发送给FORWARD,而后再通过POSTROUTING发送出去,流程为: ①--->③--->④--->⑥性能
主机发送数据包时,流程则是⑤--->⑥大数据
iptables安装配置rest
linux通常默认都已经安装iptables,只须要开启服务便可blog
service iptables start //启动ip
service iptables restart //重启
service iptables stop //关闭
iptables规则书写:
基本语法:iptables [-t 表] [操做命令] [链] [规则匹配器] [-j 目标动做]
表 说明 支持的链
raw 通常是为了避免再让iptables对数据包进行跟踪,提升性能 PREROUTING、OUTPUT
mangle 对数据包进行修改 五个链均可以
nat 进行地址转换 PREROUTING、OUTPUT、POSTROUTING
filter(默认) 对包进行过滤 INPUT、FORWARD、OUTPUT
经常使用操做命令 说明
-A 在指定链尾部添加规则
-D 删除匹配的规则
-R 替换匹配的规则
-I 在指定位置插入规则(例:iptables -I INPUT 1 --dport 80 -j ACCEPT(将规则插入到filter表INPUT链中的第一位上)
-L/S 列出指定链或全部链的规则
-F 删除指定链或全部链的规则
-N 建立用户自定义链[例:iptables -N allowed]
-X 删除指定的用户自定义链
-P 为指定链设置默认规则策略,对自定义链不起做用
-Z 将指定链或全部链的计数器清零
-E 更改自定义链的名称[例:iptables -E allowed disallowed]
-n ip地址和端口号以数字方式显示[例:iptables -nL]
经常使用规则匹配器 说明
-p tcp/udp/icmp/all 匹配协议,all会匹配全部协议
-s addr[/mask] 匹配源地址
-d addr[/mask] 匹配目标地址
--sport port1[:port2] 匹配源端口(可指定连续的端口)
--dport port1[:port2] 匹配目的端口(可指定连续的端口)
-o interface 匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT(例:iptables -A FORWARD -o eth0)
-i interface 匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。
--icmp-type 匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型)
--tcp-flags mask comp 匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。(例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT 表示匹配SYN和ACK标记的数据包)
目标动做 说明
ACCEPT 容许数据包经过
DROP 丢弃数据包
REJECT 丢弃数据包,而且将拒绝信息发送给发送方
SNAT 源地址转换(在nat表上)例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1
DNAT 目标地址转换(在nat表上)例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102
REDIRECT 目标端口转换(在nat表上)例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80
MARK 将数据包打上标记;例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60
PS:
一、目标地址转换通常在PREROUTING链上操做
二、源地址转换通常在POSTROUTING链上操做
保存和恢复iptables规则
使用iptables-save能够保存到特定文件中
iptables-save >/etc/sysconfig/iptables_save
使用iptables-restore能够恢复规则
iptables-restore</etc/sysconfig/iptables_save
iptables的进阶使用
一、limit限制流量:
-m limit --limit 1000/s #设置最大平均匹配速率
-m limit --limit-burst 15 #设置一开始匹配的最大数据包数量
-m limit --limit 5/m --limit-burst 15 #表示一开始能匹配的数据包数量为15个,每匹配到一个,limit-burst的值减1,因此匹配到15个时,该值为0,之后每过12s,limit-burst的值会加1,表示又能匹配1个数据包
例子:
iptables -A INPUT -i eth0 -m limit --limit 5/m --limit-burst 15 -j ACCEPT
iptables -A INPUT -i eth0 -j DROP
注意要点:
A、--limit-burst的值要比--limit的大
B、limit自己没有丢弃数据包的功能,所以,须要第二条规则一块儿才能实现限速的功能
二、time :在特定时间内匹配
-m time 说明
--monthdays day1[,day2] 在每月的特定天匹配
--timestart hh:mm:ss 在天天的指定时间开始匹配
--timestop hh:mm:ss 在天天的指定时间中止匹配
--weekdays day1[,day2] 在每一个星期的指定工做日匹配,值能够是1-7
例子:
iptables -A INPUT -i eth0 -m time --weekdays 1,2,3,4 -jACCEPT
iptables -A INPUT -i eth0 -j DROP
三、ttl:匹配符合规则的ttl值的数据包
参数 说明
--ttl -eq 100 匹配TTL值为100的数据包
--ttl -gt 100 匹配TTL值大于100的数据包
--ttl -lt 100 匹配TTL值小于100的数据包
例子:
iptables -A OUTPUT -m ttl --ttl-eq 100 -j ACCEPT
四、multiport:匹配离散的多个端口
参数 说明
--sports port1[,port2,port3] 匹配源端口
--dports port1[,port2,port3] 匹配目的端口
--ports port1[,port2,port3] 匹配源端口或目的端口
例子:
iptables -A INPUT -m multiport --sports 22,80,8080 -j DROP
五、state:匹配指定的状态数据包
参数 说明
--state value value能够为NEW、RELATED(有关联的)、ESTABLISHED、INVALID(未知链接)
例子:
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
六、mark:匹配带有指定mark值的数据包
参数 说明
--mark value 匹配mark标记为value的数据包
例子:
iptables -t mangle -A INPUT -m mark --mark 1 -j DROP
七、mac:匹配特定的mac地址
例子:
iptables -A FORWARD -m mac --mac-source 00:0C:24:FA:19:80 -j DROP