美文网首页
Linux 防火墙:iptables、firewalld、SEL

Linux 防火墙:iptables、firewalld、SEL

作者: 月饮沙 | 来源:发表于2020-12-09 16:35 被阅读0次

    主机防火墙(一般是软件防火墙):针对单个主机进行防护
    网络防火墙(一般是硬件防火墙):作为网络的分界点,防护内网之外的攻击

    无论是iptables还是firewalld都只是配置防火墙的工具,真正实现数据包连接和转发的是系统内核中的netfilter模块

    iptables

    规则链

    iptables有5个规则链,如果流量经过规则链,就会从该链由上至下匹配遇到的第一条规则。

    • INPUT控制进入的流量
    • OUTPUT控制发出的流量
    • FORWORD控制转发的流量
    • POSTROUTING负责SNAT
    • PREROUTING负责DNAT

    查看规则

    #查看 INPUT OUTPUT FORWORD 规则
    [root@localhost ~]# iptables -L 
    
    Chain INPUT (policy ACCEPT) 
    target     prot opt source               destination         
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination 
    
    # 查看 POSTROUTING和PREROUTING  snat和dnat 规则
    [root@localhost ~]# iptables -L -t nat
    
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination
    

    设置规则

    iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
    # 22是目标ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求
    
    # -A INPUT 添加到INPUT链中
    # -s 源地址
    # -p 协议
    # --dport 表示目标端口
    # -j 表示动作 ACCEPT表示接受 REJECT表示拒绝 DROP表示丢弃
    # REJECT会回复拒绝,DROP不进行回复
    

    更改默认规则

    默认规则是ACCECP,允许所有流量通过

    iptables -P INPUT DROP # 配置默认的不让进
    iptables -P FORWARD DROP # 默认的不允许转发
    iptables -P OUTPUT ACCEPT # 默认的可以出去
    

    清空当前的所有规则和计数

    iptables -F  # 清空所有的防火墙规则
    iptables -X  # 删除用户自定义的空链
    iptables -Z  # 清空计数
    

    firewalld

    firewalld服务,实际上是将防火墙配置命令转换为iptables规则。
    防火墙(iptables/firewalld)只能应用于内核管理的网卡。

    Zone

    firewalld提供了zone的概念,zone就是区域,firewalld将系统划分成多个zone。一个网卡只能属于一个zone,一个zone中可以有多个网卡。zone中的规则应用于该zone中的所有网卡。
    firewall-cmd添加规则必须要指定zone。不指定zone的操作就是对缺省zone进行操作

    Zone相关操作

    # 查看缺省zone
    firewall-cmd --get-default-zone 
    # 设置缺省zone
    firewall-cmd --set-default-zone=public
    # 列出zone中的网卡
    firewall-cmd --list-interfaces --zone=public
    # 移除zone中的网卡
    firewall-cmd --remove-interface=ens33
    # 添加网卡到zone中
    firewall-cmd --add-interface=ens33
    

    规则

    规则生效时间

    默认配置的规则是临时的,需要使用--permanent让规则永久生效
    --permanent 表示该规则永久生效,但是不是立刻生效

    # 重新加载规则
    # 会让--permanent规则立刻生效,并清空临时规则
    firewall-cmd --reload
    # 将所有临时规则配置为永久规则
    firewall-cmd --runtime-to-permanent
    

    查看规则

    # 查看所有zone的所有规则
    firewall-cmd --list-all-zones
    # 列出缺省zone的规则
    # 如果一个zone里面没有网卡,那么这个zone就是非active状态
    firewall-cmd --list-all
     public (active)
       target: default
       icmp-block-inversion: no
       interfaces: ens33
       sources: 
       services: ssh dhcpv6-client
       ports: 
       protocols: 
       masquerade: no
       forward-ports: 
       source-ports: 
       icmp-blocks: 
       rich rules: 
    

    规则类别和配置方法

    service规则

    # 列出service规则 
      firewall-cmd --list-services
    # 添加service规则
     firewall-cmd --add-service=http
    # 去除service规则
     firewall-cmd --remove-service=http
    

    service和端口的对应关系,在/usr/lib/firewalld/services文件夹的xml文件里。

    # 示例 ssh是service名称 port="22"是对应的端口号
    [root@localhost ~]# cat ssh.xml
     <?xml version="1.0" encoding="utf-8"?>
     <service>
       <short>SSH</short>
       <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
       <port protocol="tcp" port="22"/>
    
     </service>
    

    port规则

    # 查看端口规则
    firewall-cmd --list-port
    # 添加端口规则
    firewall-cmd --add-port=3333/tcp
    

    rich规则(富规则)

    # 添加rich规则
    firewall-cmd  --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="6379" accept" --permanent 
    # 查看rich规则语法
    man firewalld.richlanguage
    

    SELinux

    SELinux可以限制进程可以访问的资源。

    SELinux的开启和关闭

    # 查看SELinux的状态
    # 默认SELinux是开启的,但是一般生产环境会将其禁用
    [root@localhost ~]# getenforce
    Enforcing
    
    # 临时关闭
    [root@localhost ~]# setenforce 0
    [root@localhost ~]# getenforce
    Permissive
    # 实际上Permissive状态还是开启的,只是不对访问进行控制,但是会记录到日志中
    # 日志文件位置:/var/log/audit/audit.log
    
    # 临时开启,只有在Permissive状态下可以开启,disabled状态不能直接开启
    [root@localhost ~]# setenforce 1
    [root@localhost ~]# getenforce
    Enforcing
    
    # 永久关闭
    # 更改配置文件后重启服务器
    # 必须重启才能改成disabled,
    # 从disabled更改为其他状态也要重启服务器,并且重启后系统会对所有文件重新成安全上下文,占用时间较长
    [root@localhost ~]# vim /etc/selinux/config 
    SELINUX=disabled
    

    安全上下文

    安全上下文是控制进程对文件的访问权限的

    查看SELinux安全上下文

    # 查看文件的安全上下文
    # 9位权限列后面有.表示存在SELinux上下文
    
    [root@localhost html]# ll -lZ
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 test
      
    # 查看进程的安全上下文
    [root@localhost html]# ps auxZ |grep httpd
    system_u:system_r:httpd_t:s0    root      42322  0.0  0.5 224056  5000 ?        Ss   00:25   0:00 /usr/sbin/httpd -DFOREGROUND
    
    # 关注安全上下文倒数第二列,httpd_t进程只能访问上下文是httpd_sys_content_t的文件
    

    默认安全上下文

    在不同位置创建的文件安全上下文是不同的

    查看默认安全上下文

    # 如果没有默认安全上下文,会定义为unconfined_t
    [root@localhost html]# semanage fcontext -l|grep httpd|head
    /usr/.*\.cgi                                       regular file       system_u:object_r:httpd_sys_script_exec_t:s0 
    /opt/.*\.cgi                                       regular file       system_u:object_r:httpd_sys_script_exec_t:s0 
    /srv/([^/]*/)?www(/.*)?                            all files          system_u:object_r:httpd_sys_content_t:s0 
    /srv/([^/]*/)?www/logs(/.*)?                       all files          system_u:object_r:httpd_log_t:s0 
    

    更改默认安全上下文

    # 添加默认安全上下文(永久生效)
    semanage fcontext -a -t http_sys_content_t '/web(/.*)?'
    
    # 临时更改安全上下文
    chcon -t  http_sys_content_t file
    
    # 默认创建文件的时候可能会没有匹配到详细的安全上下文
    # 重新生成安全上下文
    restorecon -Rv logs/
    # -v显示详细信息
    # -R递归
    
    # 在系统重启后重新生成所有安全上下文
     touch /.autorelable  
    

    对端口进行设置

    控制进程能否使用某些端口

    # 查看端口
    semanage port -l
    # 给进程添加端口权限
    semanage port -a -t http_port_t -p tcp 12345
    # -a 添加
    # -t 类型
    # -p tcp/udp 端口号
    

    SELinux的布尔值

    布尔值控制进程能否进行某些行为

    # 查看
    [root@localhost html]# semanage boolean -l |head
    SELinux boolean                State  Default Description
    
    privoxy_connect_any            (on   ,   on)  Allow privoxy to connect any
    smartmon_3ware                 (off  ,  off)  Allow smartmon to 3ware
    mpd_enable_homedirs            (off  ,  off)  Allow mpd to enable homedirs
    xdm_sysadm_login               (off  ,  off)  Allow xdm to sysadm login
    xen_use_nfs                    (off  ,  off)  Allow xen to use nfs
    mozilla_read_content           (off  ,  off)  Allow mozilla to read content
    ssh_chroot_rw_homedirs         (off  ,  off)  Allow ssh to chroot rw homedirs
    mount_anyfile                  (on   ,   on)  Allow mount to anyfile
    
    
    # 设置布尔值的开关
    # 开启
    setsebool -P smartmon_3ware on
    # 关闭
    setsebool -P smartmon_3ware off
    

    相关文章

      网友评论

          本文标题:Linux 防火墙:iptables、firewalld、SEL

          本文链接:https://www.haomeiwen.com/subject/mkbhgktx.html