防火墙iptables如何做匹配

版权声明:博文为原创,引用请注明出处 https://blog.csdn.net/ANYELEISHOU/article/details/82906064

防火墙iptables如何做匹配

iptables如何做匹配
通用匹配:iptables内置功能模块就可以实现的匹配方式
扩展匹配:需要依赖额外的模块才能实现匹配

一.通用匹配
-s:指定源ip
-d:指定目标ip
-i:指定进入数据包所经过网卡名称
-o:指定发出数据包所经过网卡名称

案例:允许10.220.5.254所发送过来的数据包
	# iptables -t filter -A INPUT -s 10.220.5.254 -j ACCEPT

案例:禁止10.220.5.254所发送过来的任意数据包
	# iptables -t filter -A INPUT -s 10.220.5.254 -j DROP

案例:禁止当前主机给10.220.5.3发送数据包
	# iptables -A OUTPUT -d 10.220.5.3 -j DROP

案例:允许从eth0进入的数据包,且数据包的源ip 是10.220.5.3 目标ip是10.220.5.191
	# iptables -A INPUT -s 10.220.5.3 -d 10.220.5.191 -i eth0 -j ACCEPT

二.扩展匹配:在匹配的时候需要用到额外的功能模块
隐式扩展:不需要手动指定调用的模块,系统会自动加载模块
显式扩展:必须手动指定模块名称才可以

1.隐式匹配
-p 协议
-p tcp
-p udp
-p icmp

1)对于icmp协议的隐式匹配
扩展名称:
icmp
格式:
-p icmp --icmp-type
ping的数据包协议是icmp协议
type
0:应答包
8:请求包

	案例:单向ping(点到点)
		可以从10.220.5.1 ping 10.220.5.182
		禁止从10.220.5.182 ping 10.220.5.1

	实现:
		iptables -P INPUT DROP
		iptables -P OUTPUT DROP
		iptables -A OUTPUT -p icmp --icmp-type 8 -s 10.220.5.1 -d 10.220.5.182 -j ACCEPT
		iptables -A INPUT -p icmp --icmp-type 0 -s 10.220.5.182 -d 10.220.5.1 -j ACCEPT

	案例:单向ping(一对多)
		可以从10.220.5.1 ping 其他主机
		禁止其他主机ping 10.220.5.1

	实现
		iptables -P INPUT DROP
		iptables -P OUTPUT DROP
		iptables -A OUTPUT -p icmp --icmp-type 8 -s 10.220.5.1  -j ACCEPT
		iptables -A INPUT -p icmp --icmp-type 0 -d 10.220.5.1 -j ACCEPT 

	基本思路:
		禁止所有、允许个别
		允许所有、禁止个别

2)对于tcp协议的隐式扩展
扩展名称
tcp
用法:
-p tcp 选项
选项:
–sport:源端口
–dport:目标端口
–tcp-flags list1 list2:根据tcp包中的标志位进行匹配
–syn:等同[–tcp-flags syn,ack,fin syn 匹配syn=1 ack=0 fin=0的包]

案例:让所有主机可以访问10.220.5.1上的网站,但是禁止10.220.5.191访问网站
	iptables -A INPUT -p tcp --dport 80  -d 10.220.5.1 -j ACCEPT
	iptables -A OUTPUT -p tcp --sport 80 -s 10.220.5.1  -j ACCEPT
	ipatbles -I INPUT -p tcp --dport 80 -s 10.220.5.191 -j DROP
	iptables -I OUTPUT -p tcp --sport 80 -d 10.220.5.191 -j DROP

–tcp-flags list1 list2:
作用:根据tcp包中的标志位进行匹配
说明:
list1:指定对哪几个标志位做匹配
list2:指定在list1中哪几个标志位必须为1,在list2中没有出现的哪个标志为必须为0
–tcp-flags syn,ack,fin syn 匹配syn=1 ack=0 fin=0的包
–tcp-flags syn,ack,fin syn,ack 匹配syn=1 ack=1 fin=0的包
–tcp-flags syn,ack,fin ack 匹配ack=1 syn=0 fin=0的包

案例:只运行从10.220.5.182发送连接httpd请求
	# iptables -A INPUT -s 10.220.5.182 -p tcp --dport 80 --tcp-flags ack,fin,syn syn -j ACCEPT

3.)对于udp协议的隐式扩展
-p udp --sport|–dport
iptables的连接状态追踪模块
作用:记录当前每个客户端(ip)连接情况(请求连接、成功连接、等待断开…)
名称:nf_conntrack
记录的信息保存在:/proc/net/nf_conntrack,事实上保存在内存中,因此会占用额外的内存空间
激活基于nf_conntrack的状态追踪:查看nat表的规则即可
状态追踪表被填满报错:nf_conntrack: table full, dropping packet.
解决状态追踪表被填满导致用户无法请求
1. 直接关闭防火墙
2. 关闭追踪功能
3. 调大状态追踪表的条目数:/proc/sys/net/nf_conntrack_max
4. 缩短连接断开超时时间:/proc/sys/net/netfilter/.timeout.
5. 设置对于一些特定请求不做状态追踪(raw)
iptables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK
iptables -t raw -I OUTPUT -p tcp --sport 80 -j NOTRACK

设置的过大:
导致内存空间浪费
设置的太小:
每个连接的用户信息都会记录在这个文件中,如果该文件空间满了,会导致新用户无法建立连接

通常被植入的木马程序(后门)会开启一个随机端口,等待黑客来连接

对于80端口
正常进入数据
建立连接
syn=1 ack=0
正常传输
syn=0 ack=1

正常出去的数据
	连接连接
		syn=1 ack=1
	正常传输
		syn=0 ack=1

反弹式木马
建立连接–向外发
syn=1 ack=0

修改内核参数
1. echo “num” > /proc* /sys*
立刻生效,但是临时有效
2. vim /etc/sysctl.conf
写法格式:
将伪文件系统中的 /proc/sys/省略、后面内容中的/替换为.即可
比如:/proc/sys/net/nf_conntrack_max 设置为 6553500
写法:net.nf_conntrack_max = 6553500
激活:sysctl -p

2.显示扩展
注意:用显式扩展的时候,必须指定扩展功能所依赖模块的名称
指定:
-m 扩展名称 --options-xxx

显示扩展1:state
作用:根据nv_conntrack的记录来对连接进行规则匹配,是根据连接记录中的状态信息做匹配
状态:
NEW:表示新的连接请求(syn=1 ack=0 fin=0)
三次握手的第一次
ping请求的第一包
udp通信的第一个包
ESTABLISHED:连接建立完成状态下所传递的数据包(syn=0 ack=1 fin=0)
INVALID:非法连接
RELATED:相关联的连接

-m state --state NEW -j ACCEPT
-m state --state NEW,ESTABLISHED -j ACCEPT

案例:对主机做安全加固
# 1. 将默认规则改为DROP
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP

# 2. 限制只有从10.220.5.182可以登录ssh
	# iptables -A INPUT -p tcp --dport 22 -s 10.220.5.182 -j ACCEPT
	# iptables -A OUTPUT -p tcp --sport 22 -d 10.220.5.182 -j ACCEPT

# 3. 实现单向可ping
	# iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
	# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

# 4. 让所有人都可以访问web站点
	# iptables -A INPUT -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT
	# iptables -A OUTPUT -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT

显示扩展2:multiport
作用:对连续或者离散的端口做匹配
选型:
–sports port[,port|,port:port]…
–dports port[,port|,port:port]…
–ports port[,port|,port:port]…

例子:
	--sport 80,22,3306
	--sport 80:1024
	--sport 80,22,23:1024

例子:
	允许让10.220.5.182访问本机的80 22 443 3389 3306端口
	iptables -A INPUT -s 10.220.5.182 -p tcp -m multiport --dports 22,80,443,3389,3306 -m state --state NEW,ESTABLISHED -j ACCEPT

显示扩展3:iprange
作用:用于对ip地址的范围做匹配
选项
–src-range from[-to]
–dst-range from[-to]

案例:5.1~5.100无法访问web
iptables -I INPUT -p tcp --dport 80 -m iprange --src-range 10.220.5.1-10.220.5.100 -j DROP
iptables -I INPUT -p tcp --dport 80 -m iprange ! --src-range 10.220.5.1-10.220.5.100 -j ACCEPT

显示扩展4:mac
[!] --mac-source address

显示扩展5:limit
作用:限速
–limit rate[/second|/minute|/hour|/day]:给保安发新的门禁卡的时间间隔()
–limit-burst number:指定保安手里初始状态下有几张门禁卡(设置的是峰值、最大并发值)

例子:
	每20分钟可以通过一个数据包
	-m limit --limit 3/hour --limit-burst 5

案例:实现每分钟可以发送10个ping包,峰值是7
	# iptables -A INPUT -p icmp -m limit --limit-burst 7 --limit 10/minute -j ACCEPT

案例:防暴力破解。限制登录22端口的请求的频率(限制1小时只能尝试登录ssh5次)
	# iptables -A INPUT -s 10.220.5.182 -p tcp --dport 22 -m state --state NEW -m limit --limit 5/hour --limit-burst 5  -j ACCEPT
	# iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -s 10.220.5.182 -j ACCEPT

案例:限制每个客户端在1分钟之内只能向80端口发送10次syn请求
	# iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/minute --limit-burst 3 -m state --state NEW -j ACCEPT

显示扩展6:string
作用:对数据包中的字符类型的内容做检查
选项
–algo {bm|kmp}:指定匹配字符串所用的算法
–string “xxxx”:指定所检查的字符串

例子:限制只能从10.220.5.182登录后台页面(admin.php)
	iptables -A INPUT -s 10.220.5.182 -m string --algo bm --string "admin.php" -j ACCEPT

显示扩展7:connlimit
作用:限制一个客户端可以同时与当前主机建立几个链接
[!] --connlimit-above n

案例:限制每个IP可以同时登录5个ssh
方案1:
# iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 5 -j DROP   <<< 匹配并发连接在5个以上的情况
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

方案2:
#iptables -A INPUT -p tcp --dport 22 -m connlimit ! --connlimit-above 5 -j ACCEPT

案例:限制每个客户端只能与80端口并发建立10个连接
# iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -m connlimit !--connlimit-above 10 -j ACCEPT

拒绝服务攻击(Dos)
分布式拒绝服务工具(DDOS)

显示扩展8:recent
作用:
–name name:指定一个用于记录用登录次数等信息的文件名(记录sip、几个包、时间戳)
–set:将客户端的地址加入到name所指定的哪个文件中
–remove:将ip地址等信息从name指定的哪个文件中删除
–seconds seconds:指定限制的时间,单位是秒
比如:限制用户在1小时只能登录5次,当在连续的1小时之内登录第六次的时候,那么该用户就会被禁止登录,持续1h
–hitcount hits:指定一个主机在一定时间只能可以发送的数据包的数量
–update:检查name做指定的哪个文件中是否有当前这个数据包的源地址信息,如果有,就将计时重试开始,还会将计数器加1
–rcheck:检查name做指定的哪个文件中是否有当前这个数据包的源地址信息,如果有,会将计数器加1

案例:限制客户端在1h之内只能登录 ssh 5次

# 指定在1h只能当登录此时达到5次之上的,该次链接请求会被丢弃
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name loginSSH --update --seconds 3600 --hitcount 5 -j DROP

# 当用户请求的端口是22,并且状态是new的情况下,会将该数据包中的源IP地址等信息写入到文件 loginSSH
# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name loginSSH --set -j ACCEPT

# iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT

动作
ACCEPT
DROP
REJECT
DNAT
SNAT
LOG

-j LOG 参数
–log-level level:指定记录哪个级别的日志信息
–log-prefix prefix:指定日志系想你中的前缀

日志的级别:数字越小,级别越高、事件越严重
7:调试级别 DEBUG
6:通知 INFO
5:注意 NOTICE
4:警告 WARNING
3:错误 ERR
2:临界 CRIT
1:警戒 ALERT
0:致命 EMEGR

建议:每个服务用自己单独的一个日志文件
iptables默认日志: /var/log/messages
修改iptables的日志文件位置:
# echo "kern.warning /var/log/kernel.log ">>/etc/rsyslog.conf
# service rsyslog restart

猜你喜欢

转载自blog.csdn.net/ANYELEISHOU/article/details/82906064