叙述
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;
那么我们来通俗的解释一下什么是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