linux防火墙详解(iptables、firewalld)

一、防火墙防火墙基本概念

  • 防火墙技术根据管理员设定的规则来控制数据包的进出。主要保护内网安全

  • Linux的防火墙分为两种,iptables和firewall

  • iptables静态防火墙

    • 早期的Linux默认使用iptables防火墙,配置文件在/etc/sysconfig/iptables。主要工作在网络层
    • 该防火墙只能过滤互联网的数据包,无法对内网到内网进行过滤
    • iptables只有命令模式
    • iptables默认允许,通过添加拒绝来限制
    • iptables修改规则后刷新才能生效。无法守护进程
  • firewall动态防火墙

    • 取代了iptabels防火墙,配置文件在/usr/lib/firewalld和/etc/firewalld主要工作在网络层
    • 不仅可以过滤互联网数据包,也可以过滤内网数据包
    • firewalld支持命令和图形化配置
    • firewalld默认为拒绝所有
    • firewalld可以动态更新策略,(允许更新策略而不破环现有会话)
  • 注意:iptables和firewalld不是真正的防火墙,是指用来定义防火墙规则功能的“防火墙管理工具/程序”,将定义好的规则交给内核的netfiler即网络过滤器来读取,从而实现防火墙的功能。

    img

    • 在配置防火墙时,不建议两种配置方法结合使用(建议只使用其中的一种)

二、iptables讲解

  • iptables配置防火墙依靠四个部分实现:表、规则链、规则(匹配条件)、控制类组成;该防火墙使用链式规则

  • iptables的四表

    • raw表

      raw表常用于控制数据包的状态跟踪。它允许管理员决定是否对某个数据包是否进行状态跟踪,从而优化性能或者防止特定的攻击。

    • mangle表

      修改数据包内容;可以做流量整形、对数据包设置标记(包含所有规则链)

    • nat表

      负责地址转换功能;修改数据包中的源目IP地址或端口(包含IN、OU、PR、PO三个规则链)

    • filter表

      负责过滤数据包(防火墙核心功能);对数据包时允许放行还是不允许放行(包含IN、OU、FO三个规则链)

  • iptables的五规则链

    • 什么是规则链

      由很多规则组成一个规则链,规则从上到下匹配。匹配到则再不向下匹配,并且执行相应控制动作。如果都无匹配到,则执行该规则链的默认控制类型。

    • 规则链类型

      INPUT 处理入站的数据包(处理目标是本机的数据包)

      OUTPUT 处理出站的数据包(处理源是本机的数据包,一般不在此链上做规则)

      PREROUTING 在进行路由选择前处理数据包(一般用来做NAT Server)

      POSTROUTING 在进行路由选择后处理数据包(一般用来做源NAT)

      FORWARD 处理转发的数据包(处理经过本机的数据包)

      img

      img

  • iptables控制类型

    ACCEPT 允许数据包通过

    DROP 丢弃数据包(不给对方回应,一般工作时用这个)

    ​ REJCET 拒绝数据包通过(会给对方回应,对方知道自己被拒绝)

    ​ SNAT 修改数据包的源地址

    ​ DNAT 修改数据包的目的地址

    ​ MASQUERADE 伪装程一个非固定的公网IP地址

    ​ LOG 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

  • iptables命令配置

    • 配置防火墙服务

      #查看防火墙的服务
      chkconfig --list | grep iptables
      #永久关闭防火墙
      chkconfig iptables off
      #永久开启防火墙
      chkconfig iptables on
      
    • systemctl基本命令

      #查看防火墙的状态
      systemctl status iptables.service
      #停止防火墙
      systemctl stop iptables.service    
      #启动防火墙
      systemctl start iptables.service
      #重启防火墙
      systemctl restart iptables.service
      #重载防火墙等价于restart
      systemctl reload iptables.service
      #禁止开机启动防火墙
      systemctl disable iptables.service
      #开机启动防火墙
      systemctl enable iptables.service
      
    • service基本命令

      #查看防火墙状态
      service iptables status            
      #启动防火墙
      service iptables start
      #停止防火墙
      service iptables stop
      #重启防火墙
      service iptables restart
      #尝试重启防火墙
      service iptables try-restart
      #重载防火墙
      service iptables reload
      #强制重载防火墙
      service iptables force-reload
      
    • 查看iptable各表的内容

      # iptables -t mangle --list
      # iptables -t raw --list
      # iptables -t nat --list
      # iptables -t filter --list or # iptables --list
      注意:如果不指定-t选项,就只会显示默认的filter表
      

      以下例子表明在filter表的input链, forward链, output链中存在规则:

      root@server ~]# iptables --list -n
      Chain INPUT (policy ACCEPT)
      target     prot opt source               destination         
      ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
      ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
      ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
      ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
      REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-proh
      
      Chain FORWARD (policy ACCEPT)
      target     prot opt source               destination         
      REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-proh
      
      Chain OUTPUT (policy ACCEPT)
      target     prot opt source               destination         
      

      target – 前面提到的target的特殊值
      prot – 协议:tcp, udp, icmp等
      source – 数据包的源IP地址
      destination – 数据包的目标IP地址

    • 清空所有iptables规则

      iptabels --flush
      

      nat规则需要再次手动清理

      iptables -t NAT -F
      
  • iptables描述规则的基本参数

    • -p 协议(protocol)
      • 指规则协议,如tcp、udp、icmp,可以用all来代替所有
      • 如果不指定-p,默认为所有。
    • -s 源地址(source)
      • 指定数据包的源地址
      • 参数可以使用IP、网络地址、主机名
      • 例如:-s 192.168.1.101指定IP地址
      • 例如:-s 192.168.1.10/24指定网络地址
      • 如果不指定-s参数,就代表所有地址
    • -d 目的地址(destination)
      • 指定目的地址
      • 参数和 -s相同
    • -j 执行目标(jump to target)
      • -j代表”jump to target”
      • -j指定了当与规则(Rule)匹配时如何处理数据包
      • 可能的值是ACCEPT, DROP, QUEUE, RETURN
      • 还可以指定其他链(Chain)作为目标
    • -i 输入接口(input interface)
      • -i指定了要处理来自哪个接口的数据包
      • 这些数据包即将进入INPUT, FORWARD, PREROUTE链
      • 例如:-i eth0指定了要处理经由eth0进入的数据包
      • 如果不指定-i参数,那么将处理进入所有接口的数据包
      • 如果出现! -i eth0,那么将处理所有经由eth0以外的接口进入的数据包
      • 如果出现-i eth+,那么将处理所有经由eth开头的接口进入的数据包
      • 还可以使用–in-interface参数
    • -o 输出(out interface)
      • -o指定了数据包由哪个接口输出
      • 这些数据包即将进入FORWARD, OUTPUT, POSTROUTING链
      • 如果不指定-o选项,那么系统上的所有接口都可以作为输出接口
    • -m state: 启用状态匹配模块(state matching module)
      • –-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED
    • –-sport 源端口(source port)针对 -p tcp 或者 -p udp
      • 缺省情况下,将匹配所有端口
      • 可以指定端口号或者端口名称,例如–sport 22–sport ssh
      • /etc/services文件描述了上述映射关系。
      • 从性能上讲,使用端口号更好
      • 使用冒号可以匹配端口范围,如–sport 22:100
      • 还可以使用–source-port
    • --dport 目的端口(destination port)针对-p tcp 或者 -p udp
      • 参数和-spot类似
    • --icmp-type ICMP类型 针对-p icmp
      • –icmp-type 0 表示Echo Reply
      • –icmp-type 8 表示Echo
  • 配置案例

    • 仅允许SSH服务

      iptables -F ##清空所有iptables规则
      iptables -A INPUT -i eth0 -p tcp -dport 22 -j ACCEPT
      iptables -A INPUT -j DROP	
      
    • 屏蔽指定ip

      BLOCK_THIS_IP="x.x.x.x"
      iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
      

三、firewalld讲解

  • firewalld概念

    firewalld是服务名,firewall-cmd(命令行)和firewall-config(图形化)是配置文件的名称。

  • firewalld区域的概念

    • Trust 信任区 :允许所有流量通过
    • Public 公共区 :仅接受ssh、dhcpv6-client服务连接(默认区域)
    • External 外部区域:仅允许接收ssh服务连接(默认通过此区域转发的IPv4流量将会进行地址伪装)
    • Home 家庭区域:仅接受ssh、msdns、ipp-client、samba-client、dhcpv6-client服务网络连接
    • Internal 内部区域:同home区域
    • work 工作区 :仅接受ssh、ipp-client、dhcpv6-client服务连接
    • Dmz 隔离区(非军事区) 仅接受ssh服务连接
    • Block 限制区域 :拒绝所有传入的流量
    • drop 丢弃区:丢弃所有传入的流量
  • firewalld两种配置方法

    • 临时配置(runtime 当前生效表)

      立即生效,重启后失效

      不会中断现有的连接

      无法修改服务配置

    • 永久配置(permanent 永久生效表)

      不立即生效,重启后生效,或者立即同步后生效

      会中断现有连接

      可以修改服务配置

  • firewall-cmd命令行基础配置

    • 如何实现配置永久生效

      --permanent 表示此配置加入到永久生效(默认临时生效)

      或者在配置结束后执行此命令 firewall-cmd --runtime-to-permanent将临时更改为永久

      永久配置完成后需要立即同步 firewall-cmd --reload 立即同步永久配置

    • 查看默认区域并且进行更改

      firewall-cmd --get-zones 查询可用的区域

      [root@server ~]# firewall-cmd --get-zones
      block dmz drop external home internal public trusted work
      

      firewall-cmd --get-default-zone 查询目前默认的区域

      [root@server ~]# firewall-cmd --get-default-zone
      public
      

      firewall-cmd --get-active-zone 显示当前正在使用的区域和网卡名称

      [root@server ~]# firewall-cmd --get-active-zones 
      public
        interfaces: eth0 eth1
      

      firewall-cmd --set-default-zone=trusted 设置默认区域为trusted区域

      [root@server ~]# firewall-cmd --set-default-zone=trusted 
      success
      
    • 将网卡/子网与区域进行绑定(允许/拒绝此子网通过)

      firewall-cmd --zone=drop --add-source=192.168.20.0/24 #子网绑定
      firewall-cmd --zone=drop --change-interface=eth2 #接口绑定
      
    • 配置允许/拒绝的协议/端口号

      firewall-cmd --list-all 显示当前区域的端口号、网卡、服务等信息
       			 --list-all-zones         显示所有区域的
      firewall-cmd --get-services        列举出来当前所有被允许的协议
      firewall-cmd --zone=public --add-service http ##允许http
      						   --remove-service ssh ##拒绝ssh
      						   --add-port=123/tcp  ##允许tcp端口的123
      						   --remove-port=123/tcp ##拒绝tcp端口的123
      
    • 配置目的nat(使用firewalld)

      • 开启ip转发,P 转发是 NAT 的基础,它允许 Linux 内核将数据包从一个网络接口转发到另一个网络接口。

        临时开启:

        echo 1 > /proc/sys/net/ipv4/ip_forward
        

        永久开启:

        sudo nano /etc/sysctl.conf
        net.ipv4.ip_forward = 1
        sudo sysctl -p
        
      • firewalld配置

        sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.10.10:toport=8080 --permanent
        
        • port=80 :外部访问的端口。
        • proto=tcp :协议类型。
        • toaddr=192.168.10.10 :目标服务器的 IP 地址
        • toport=8080 :目标服务器的端口
      • 重新加载防火墙即可实现

posted @ 2025-02-17 22:48  Epiphany(qrx)  阅读(790)  评论(0)    收藏  举报