叙述

规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;

那么我们来通俗的解释一下什么是iptables的规则,之前打过一个比方,每条”链”都是一个”关卡”,每个通过这个”关卡”的报文都要匹配这个关卡上的规则,如果匹配,则对报文进行对应的处理,比如说,你我二人此刻就好像两个”报文”,你我二人此刻都要入关,可是城主有命,只有器宇轩昂的人才能入关,不符合此条件的人不能入关,于是守关将士按照城主制定的”规则”,开始打量你我二人,最终,你顺利入关了,而我已被拒之门外,因为你符合”器宇轩昂”的标准,所以把你”放行”了,而我不符合标准,所以没有被放行,其实,”器宇轩昂”就是一种”匹配条件”,”放行”就是一种”动作”,”匹配条件”与”动作”组成了规则。

了解了规则的概念,那我们来聊聊规则的组成部分,此处只是大概的将规则的结构列出,后面会单独对规则进行总结。

规则由匹配条件和处理动作组成。


教程

匹配条件分为基本匹配条件与扩展匹配条件

  • 基本匹配条件
  • 源地址Source IP,目标地址 Destination IP

上述内容都可以作为基本匹配条件。

  • 扩展匹配条件
    除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是netfilter中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。
    源端口Source Port, 目标端口Destination Port
    上述内容都可以作为扩展匹配条件

处理动作

处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。

此处列出四个常用的动作:

ACCEPT		将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链。
REJECT 		拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
DROP 		直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REDIRECT	在本机做端口映射,将包重新导向到另一个端口,进行完此处理动作后,将会继续比对其它规则。

iptables安装启动

1、安装Iptables
	[root@m01 ~]# yum install iptables*

2、启动Iptables
	[root@m01 ~]# systemctl start iptables

3、关闭firewalld
	[root@m01 ~]# systemctl disable --now firewalld

规则的增、删、改、查

格式:iptables -t 表名 选项 链名称 协议 条件  动作

-t				   指定操作的表
-L, --list			列出当前的规则
-v				   显示数据包和数据包大小
-n              不反解地址
-A, --append		追加一条规则到链中
-I, --insert		插入一条规则,插入到顶部
-F, --flush			清空
-Z, --zero			清空计数器(  包数量 、包大小)

-D, --delete		删除链中的规则

-R, --replace		修改
-S, --list-rules	列出所有的规则

-N, --new-chain		创建一个自定义 链
-X, --delete-chain	删除一个自定义链
-P, --policy		指定链的默认策略
iptables -t filter -L  -n -v				  # 查看规则
iptables -t filter -I INPUT -p icmp -j REJECT 	# 添加 规则 
iptables -t filter -R INPUT 1 -p icmp -j DROP	# 修改 规则
iptables -t filter -Z						 # 清空计数器
iptables -t filter -D INPUT 1				  # 指定编号删除规则

iptables基本的条件匹配 -p 协议

TCP(http)
UDP
ICMP(ping)
ALL

-s、-d 源地址、目标地址

源地址:发送请求的地址

目标地址  : 访问的地址

--sport源端口、--dport 目标端口

源端口:发送请求的端口

目标端口:接收请求的端口

-i、-o、-m、-j 动作

-i : 进来的网卡
-o : 出去的网卡
-m : 指定模块
-j : 转发动作

基本匹配规则相关案例

案例1:只允许22端口可以访问,其他端口全部无法访问。 
	iptables -t filter -A INPUT -p TCP --dport 22  -j ACCEPT
	iptables -t filter -A INPUT -p TCP -j DROP

案例2:只允许22,80,443端口可以访问,其他端口全部无法访问。 
	iptables -t filter -A INPUT -p TCP --dport 22  -j ACCEPT
	iptables -t filter -A INPUT -p TCP --dport 80  -j ACCEPT
	iptables -t filter -A INPUT -p TCP --dport 443  -j ACCEPT
	iptables -t filter -A INPUT -p TCP -j DROP

案例3:要求使用192.168.15.81能够通过22端口链接,但是其他的不行
	iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22  -j ACCEPT
	iptables -t filter -A INPUT -p TCP -j DROP

案例4:只允许192.168.15.71能够通过22端口链接,其他的不行。
	iptables -t filter -A INPUT -p  TCP -s 192.168.15.71  -d 192.168.15.81 --dport 22 -j ACCEPT
	iptables -t filter -A INPUT -p TCP -j DROP

案例5:要求192.168.15.71对外部不可见
	iptables -t filter -A INPUT -p TCP -d 192.168.15.71 -j DROP

案例6:要求使用eth0网卡的所有请求全部拒绝
	iptables -t filter -A INPUT -p TCP -i etho -j DROP

	使用172.16.1.71登录进来的窗口,不允许访问百度:
	iptables -t filter -A OUTPUT -p TCP -o eth1 -j DROP

案例7:要求访问服务器的8080端口转发至80端口
	iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80

案例8:要求只允许windows通过ssh连接192.168.15.81,其他的拒绝
	iptables -t filter -A INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT
	iptables -t filter -A INPUT -p TCP -j DROP

Iptables扩展的条件匹配——模块

连续匹配多个端口(multiport)

-m:使用指定模块

--dports  : 指定多个端口(不同端口之间以逗号分割,连续的端口使用冒号分割)。

eg:要求将22,80,443以及30000-50000之间所有的端口向外暴露,其他端口拒绝
	iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT
	iptables -f filter -A INPUT -p TCP -j DROP

指定一段连续的ip地址范围(iprange)

--src-range from[-to]:	源地址范围
--dst-range from[-to]	目标地址范围

eg:要求192.168.15.1 - 192.168.15.10之间的所有IP能够连接192.168.15.81,其他拒绝
	iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT 
	iptables -f filter -A INPUT -p TCP -j DROP

匹配指定字符串(string)

--string pattern	# 指定要匹配的字符串
--algo {bm|kmp}		# 匹配的查询算法
    
eg:要求访问数据包中包含HelloWorld的数据不允许通过。
	iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP

根据时间段匹配报文(time)

--timestart hh:mm[:ss]		# 开始时间
--timestop hh:mm[:ss]		# 结束时间
--monthdays day[,day...]	# 指定一个月的某一天
--weekdays day[,day...]		# 指定周 还是  周天

eg:要求每天的12点到13点之间,不允许访问
	iptables -t filter -A INPUT -p TCP -m time  --timestart 4:00  --timestop 5:00 -j DROP

注:这里必须使用UTC时间(当前时间-8h)

禁ping(icmp)

--icmp-type {type[/code]|typename}
	echo-request  (8) 请求 
	echo-reply    (0) 回应
	
eg:要求别人不能ping本机,但是本机可以ping别人
	iptables -t filter -A INPUT -p ICMP -m icmp --icmp-type "echo-request" -j DROP

默认情况下如果本机无法ping别人 、别人也无法ping自己

限制链接数,并发连接数(connlimit)

--connlimit-upto n		#  如果现有连接数小于或等于n 则匹配
--connlimit-above n		#  如果现有连接数大于n 则匹配

eg:要求主机连接最多有2个
	iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP

针对 报文速率 进行限制。 秒、分钟、小时、天

--limit rate[/second|/minute|/hour|/day] # 报文数量 
--limit-burst number  # 报文数量(默认:5)

eg1:允许10个数据报文快速通过,超过的数据报文:  1/m
	iptables -t filter -I INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
	iptables -t filter -A INPUT -j DROP

eg:要求限制速率在500k/s左右
	iptables -t filter -A INPUT -p TCP -m limit 300/s -j ACCEPT
	iptables -t filter -A INPUT -p TCP -j DROP