iptables防火墙

防火墙相关概念

    防火墙的种类(从物理角度)

      •   硬件防火墙
      •   软件防火墙

      硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。

      软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。

 

 

iptables防火墙

    iptables防火墙就属于软件防火墙,iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter

netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

 

    Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

      • 网络地址转换(Network Address Translate)
      • 数据包内容修改
      • 以及数据包过滤的防火墙功能

 

    所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

        

 

 

包过滤防火墙

    包的概念

      在数据传输过程中,将数据分成若干个数据包,一点一点的传输,可以减少对网络的负担

    包过滤防火墙的实现

      通过iptables中的netfilter这个安全框架,来实现对数据包的过滤,从而达到防火墙的效果

 

itables中的四表五链

    链的概念

      现在,我们想象一下,这些”关卡”在iptables中为什么被称作”链”呢?我们知道,防火墙的作用就在于对经过的报文匹配”规则”,然后执行对应的”动作”,所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了”链”,所以,我们把每一个”关卡”想象成如下图中的模样  ,这样来说,把他们称为”链”更为合适,每个经过这个”关卡”的报文,都要将这条”链”上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。

 

 

 

    有哪些链

      PREROUTING:主机外报文进入位置,允许的表mangle,nat(目标地址转换,把本机地址转换成真正的目标机地址,通常指响应报文)

      INPUT             : 报文进入本机用户空间位置,允许的表filter,mangle

      FORWORD     :  报文经过路过,单目标不是本机时,允许的表filter,mangle

      OUTPUT         : 报文从本机用户空间位置出去的,允许的表filter,mangle,nat

      POSTOUTING: 报文经过路由被转发出去,允许的表 mangle,nat

    表的概念

      一系列功能的集合,就称之为表

      

     filter表:负责过滤功能,防火墙;内核模块:iptables_filter

     nat表:network address translation,网络地址转换功能;内核模块:iptable_nat

     mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle

     raw表:关闭nat表上启用的连接追踪机制;iptable_raw

    iptables流程图

      ① 从A流出

        A——> OUTPUT——>POSTOUTING

 

 

 

      ② 从B流入

        ——>PREROUTING——>INPUT——>B

 

 

      ③ 从A流出经过C流向B

        A——> OUTPUT——>POSTOUTING——>PREROUTING——>INPUT——>B

 

 

 

iptables的使用

    安装与启动

        ①下载iptables

          yum install iptables*

        ②启动iptables

          systemctl start iptables

        ③关闭firewalld防火墙(不需要有两个防火墙)

          systemctl disable --now firewalld

     PS:systemctl status iptables :查看iptables是否启动

 

 

 

    语法格式

        iptables -t 表名 选项 链名称 条件  动作

    参数说明

        -t  :指定需要操作的表

        -L :列出规则链中已有的规则(默认列出filter的规则)

        -S/--list-rules :列出规则链中所有的已有的规则

        -n :不反解地址(以数字的形式显示ip地址)

        -v :显示数据包数量与数据包大小

        -A/--append : 添加一条规则到表中,添加到末尾

        -I/--insert :插入一条规则到表中,添加到开头

        -F/--flush :清空规则链中的已有条目

        -Z/--zero :清空计数器(包的数量与大小)

        -D/--delete :删除链中的规则

        -R/--replace :修改链中的规则

        -N/--new-chain :创建一个自定义链

        -X/--delete-chain :删除一个自定义链

        -P/--policy :指定默认的策略  

        -i :进来的网卡

        -o :出去的网卡

        -m : 指定模块

        -p:指定协议

        -s :源地址

        -d :目标地址

        --sport:源端口

        --dport:目标端口

    基本的条件匹配

      参数 -p 

      协议 :①TCP(http属于TCP)

          ②UDP

          ③ICMP(PING属于TCP)

             ④ALL(以上全部的条件) 

    动作

      参数 -j

      ① ACCPET(允许数据包通过)

      ② REJECT(拒绝数据包通过,并通知给目标方)

      ③ DROP(丢弃数据包,不给任何信息)

      ④ REDIRECT(将包导向到另一个端口)

    模块

      iptables中的模块是为了拓展iptables的功能的,为了更方便的使用iptables的功能

      参数 -m

      ① multiport模块

        使用multiport模块,可以匹配多个端口,不同的端口之间用逗号分割,连续的端口之间使用冒号分割

        参数 :--dports (多个目标端口)

      ② iprange模块

        指定一段连续的IP地址范围,可以使用iprange扩展模块。

        参数 :--src-range from [-to] (源地址范围)

            --dst-range from [-to] (目标地址范围)

      ③string模块

        使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。

        参数:--string pattern(指定匹配的字符)

           --algo bm/kmp (指定匹配的查询算法)

      ④time模块

        可以使用time扩展模块,根据时间段匹配报文,如果报文到达的时间在指定的时间范围内,则符合条件。

        参数:--timestart hh:mm:[ss](指定开始的时间,秒数ss可以省略)

           --timestop hh:mm : [ss](指定结束的时间,秒数ss可以省略)

           --weekdays day[,day] (指定一个星期的某一天,有多天用逗号隔开)

           --monthsday day[,day] (指定一个月的某一天,有多天可以用逗号隔开)

        注意:时间必须是UTC时间

      ⑤icmp模块

        禁ping,默认本机无法ping别人,别人无法ping本机

        参数:--icmp{type[/code]|typename} 

            echo-request(8) 请求

            echo-reply    (0) 响应

     ⑥connlimit模块

        connlimit模块可以限制每个IP地址同时链接到server端的链接数量,不指定IP,其默认就是针对每个客户端IP,即对单个IP的并发连接数限制。

        参数:--connlimit-upto n(限制连接数量小于或等于n)

           --connlimit-above n (连接数量大于n)

     ⑦limit模块

        limit模块是对“报文到达速率”进行限制;限制单位时间内流入的包的数据。

        参数 --limit rate[/second|/minute|/hour|/day] 

           --limit-burst number (报文数量,默认是5)

 

    测验

      案例1:只允许22,80,443端口可以访问,其他端口全部无法访问。 

        ① [root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443 -j ACCEPT (允许22,80,443端口通过)

        ②[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP (过滤其他条件直接丢弃)

 

 

 

      案例2:只允许22,80,443端口可以访问,其他端口全部无法访问,但是本机可以访问百度。 

        ①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,40,443 -j ACCEPT(允许22,80,443端口通过)

        ②[root@m01 ~]# iptables -t filter -A INPUT -p ICMP -m icmp --icmp-type "echo-request" -j DROP(将对自己发起的请求过滤丢弃)

 

 

 

      案例3:要求使用192.168.15.81能够通过22端口链接,但是其他的不行

        ①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22 -j ACCEPT(过滤目标ip是192.168.15.81的ip并且还是使用端口22的允许通过)

        ②[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP(过滤其他条件的并丢弃)

 

 

 

      案例4:只允许192.168.15.81能够通过22端口链接,其他的不行。

        ①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -s 192.168.15.71 -d 192.168.15.81 --dport 22 -j ACCEPT(允许源地址为192.168.15.71并且目标地址为192.168.15.81且端口为22号的通过)

        ②[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP(不允许其他的通过)

 

 

 

      案例5:要求192.168.15.81对外部不可见

        ①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.81 -j DROP(将公网的ip过滤并丢弃)

 

 

 

 

 

 

      案例6:要求使用eth0网卡的所有请求全部拒绝

        [root@m01 ~]# iptables -t filter -A INPUT -i eth0 -j DROP

 

 

 

 

      案例7:使用176.16.1.81登录进来的窗口,不允许访问百度。

        [root@m01 ~]# iptables -t filter -A OUTPUT -p TCP -o eth01 -j DROP

      案例8:要求访问服务器的8080端口转发至80端口

        [root@m01 ~]# iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80  

      案例9:要求只允许windows通过ssh连接192.168.15.81,其他的拒绝

        [root@m01 ~]# iptables -t filter -A INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT(只允许Windows的ip允许经过22端口通过)

        [root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP(将其他情况拒绝)

      案例10:要求将22,80,443以及30000-50000之间所有的端口向外暴露,其他端口拒绝

        [root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT

 

 

 

      案例11:要求访问数据包中包含HelloWorld的数据不允许通过。

        [root@m01 ~]# iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP

      案例12:要求192.168.15.1 - 192.168.15.10之间的所有IP能够连接192.168.15.81,其他拒绝

        ①[root@m01 ~]# iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT(允许192.168.15.1-192.168.15.10范围内的ip能够连接)

        ②[root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP(过滤其他IP并拒绝)

      案例13:要求每天的12到13之间,不允许访问

        [root@m01 ~]# iptables -t filter -A INPUT -p TCP -m time --timestart 4:00 --timestop 5:00 -j DROP

      案例14:要求别人不能ping本机,但是本机可以ping别人

        [root@m01 ~]# iptables -t filter -A INPUT -p ICMP -m icmp --icmp-type "echo-request" -j DROP

      案例15:要求主机连接最多有2个

        [root@m01 ~]# iptables -t filter -A INPUT -p TCP -m connlimit --connlimit-above 2 -j DROP

      案例16:要求限制速率在500k/s左右

         ①iptables -t filter -A OUTPUT -p TCP -m limit --limit 333/s -j ACCEPT

         ②iptables -t filter -A OUTPUT -p TCP -j DROP

 

posted @ 2021-12-24 19:34  椰子皮0oo0  阅读(132)  评论(0)    收藏  举报
1