iptables,简单使用
iptables 介绍
Linus 防火墙是由Netfiter组件提供,Netfiter工作在linux内核,是内核提供的一种网络包过滤工具。采用模块化设计,具有很好的扩展性,netfilter与IP协议栈完美的契合,并允许对数据进行过滤,地址转换,处理等操作。通常内核不不能直接面对用户的,所以在linux中提供了一个netfiter前端管理工具既IPtables,firewalld 等,用于编写规则,写好的规则被送往Netfiter,告诉内核如何去处理信息包
以centOS7 为例,我们可以通过/boot//config-3.10.0-1127.el7.x86_64文件中筛选与NETFILTER 获取相关模块信息
[root@localhost 00]# grep -m 100 NETFILTER /boot/config-3.10.0-1160.el7.x86_64
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=m
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_ACCT=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NETFILTER_NETLINK_QUEUE_CT=y
CONFIG_NETFILTER_SYNPROXY=m
CONFIG_NETFILTER_XTABLES=y
CONFIG_NETFILTER_XT_MARK=m
Netfilter 相关知识
Netfilter在内核中有5个沟子函数,根据网络数据包的流向不同 分别放在了内核的五个位置,这五个钩子函数向用户开放,用户可以通过一个命令工具向其写入规则,这五个钩子函数分别为PREROUTING,INPUT,OUTPUT,FORWARD,POSROUTING。
通常我们可以将网络中的数据包分成三种流向:
1,流入本机:发送给本机的数据报,其数据流向为:PREROUTE->INPUT->内核空间进程
2,流出本机:本机向其他网络设备发送的数据报,其数据流向为:OUTPUT->POSROUTING->
3,转发:该数据报不需要本机进程处理,但是需要经过本机,发送给其他机器,其数据流向为:PREROUTING->FORWARD->POSTROUTING
iptables的组成
前面说过,iptables是Netfilter的用户端工具,其内置了五表(table)和五链(chain)
五链
五链则对应着Netfilter的五个钩子函数分别为:(PREROUTING,INPUT,OUTPUT,FORWARD,POSROUTING。)
五表:
filter表:过滤规则表,默认表,根据定义的规则过滤符合条件的数据包
nat表:地址转换表,按照预先定义的规则将地址进行转换
mangle表:修改数据标记位规则表
raw表:关闭或启用练级额跟踪功能,加快数据包穿越防火墙
security表:用于强制访问控制
优先级高低顺序:
security->raw->mangle->nat-<filter
其数据流向图如下:
数据包进入网卡处理流程
1,首先当网络中的数据包通过ip地址到达指定主机,由绑定对应IP的网卡负责接收数据包,此时会有cpu分配时间片进行预处理,(此处会涉及cpu的软中断和硬中断,具体过程请自行查找资料)。数据到达内核后,会被NETFILTER对应的五个沟子函数进行匹配
2,数据首先到达NETFILTER入口,由PREROUTING首先进行规则匹配,PREROUTING会将数据包拿到对应的表中以进行校验,如果数据包是交给本机的则数据包进入下一个链中。到达INPUT链后任何程序都会收到它,本机上运行的程序可以发送数据包,这些数据包经过output链,然后到达POSTROUTING链从网卡输出
3,如果数据包是要转发出去的,且内核允许转发,数据包将通过FORWARD链,然后到达POSTROUTING链输出
iptables 规则组成
规则:根据规则的匹配条件尝试匹配报文,对匹配成功的报文按照规则定义动作进行处理,规则在链上的次序就是检查时的生效次序
匹配条件: 默认为与条件,需要同时满足
基本匹配: IP ,端口,TCP的Flags
扩展匹配:通过复杂的高级功能匹配
处理动作: 称为target,跳转目标
内置的处理动作包括:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG....
自定义处理动作 :自定义chain,利用分类 管理复杂情形
规则要添加在链上,才生效;添加在自定义链上不会自动生效
白名单:只有指定的特定主机可以访问,其它全拒绝
黑名单:只有指定的特定主机拒绝访问,其它全允许,默认方式
iptables规则添加时考量点
要实现哪种功能:判断添加在哪张表上
报文流经的路径:判断添加在哪个链上
报文的流向:判断源和目的
匹配规则:业务需要
iptables命令格式详解
iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t :指定表 raw,mangle,nat,filter(默认)
SUBCOMMAND: 子命令
链管理类
-N: new 创建一个新的规则链
-E :重命名自定义链
-X : 删除自定义的空规则链
查看类
-L : 列出指定链上的所有规则,若是组合选项此项必须放在最后
-n :以数字格式显示地址和端口号
-v : 详细信息,若想看更为详细的信息,可通过加v实现,如 -vv
--line-numbers: 显示规则的需要
-S : 以命令格式显示链上的规则
规则管理类
-A :追加规则
-I : 插入规则,需要指定插入到那个编号,默认为第一条
-D: 删除规则。需要指明需要删除的规则序号,或者规则本身
-R :替换指定链上的指定的规则编号
-Z :置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
处理动作
-j targetname [per-target-options]
简单动作:
ACCEPT
DROP
扩展动作:
REJECT:--reject-with:icmp-port-unreachable默认
RETURN:返回调用链
REDIRECT:端口重定向
LOG:记录日志,dmesg
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装
iptables 基本匹配条件
[!] -s :源IP地址或者不连续的IP地址(用逗号间隔)
[!] -d:目标IP地址或者不连续的IP地址(用逗号间隔)
[!] -p:指定协议,可使用数字如0(all)参看:/etc/protocols
[!] -i:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
[!] -o:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
范例:
//拒绝指定IP地址的主机ping本机
iptables -A INPUT -s 192.168.144.40 -p icmp -j REJECT
//拒绝指定网段的所有主机ping本机
iptables -A INPUT -s 192.168.144.0/24 -p icmp -j REJECT
//设置白名单,只有允许的IP才能访问本机
iptables -P INPUT DROP
// 查看规则编号
iptables -vnL --line-numbers
// 删除指定编号的规则
iptables -D INPUT 4
//排除某个地址以外的地址都拒绝访问本机22端口 插入到规则第一行
iptables -I INPUT 1 ! -s 192.168.144.40 -p TCP --dport 22 -j DROP
iptables 扩展匹配条件
扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
扩展匹配条件:
- 隐式扩展
- 显式扩展
隐式扩展
iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
tcp 协议的扩展选项:
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围(用:号分割)
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围(用:号分割)
udp 协议的扩展选项
[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围(用:号分割)
[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围(用:号分割)
范例:
iptables -I INPUT 1 ! -s 192.168.144.40 -p tcp --dport 22:23 -j DROP
显式扩展及相关模块
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块
multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
#指定多个源端口
[!] --source-ports,--sports port[,port|,port:port]...
# 指定多个目标端口
[!] --destination-ports,--dports port[,port|,port:port]
范例:
iptables -A INPUT -s 172.16.0.0/16 -d 192.168.144.60 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
范例:
iptables -A INPUT -s 172.16.0.0/16 -d 192.168.144.60 -p tcp -m iprange --src-range 192.168.144.40-192.192.144.50 -j ACCEPT
connlimit扩展
根据每客户端IP做并发连接数数量匹配,可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配
范例:
//控制每个ip 只能有一个并发访问
iptables -I INPUT 1 -d 192.168.144.60 -p tcp --dport 22 -m connlimit --connlimit-above 1 -j DROP
iptables 规则保存
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
持久保存规则:
iptables-save > iptable.sh
加载规则
iptables-restore < /root/iptable.sh
需要开机自动加载得话,就将上述命令添加到/etc/rc.d/rc.local 文件中