Iptables简单使用

  • Post author:
  • Post category:其他




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 文件中



版权声明:本文为qq_42988315原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。