zoukankan      html  css  js  c++  java
  • Linux 中使用 firewalld

    firewalld 是一种动态防火墙管理解决方案。Centos 7 默认使用 firewalld。firewalld 是对 iptables 的一个封装,可以让你更容易地管理 iptables 规则。它并不是 iptables 的替代品,虽然 iptables 命令仍可用于 firewalld,但建议 firewalld 时仅使用 firewalld 命令。 与 iptables 相比,我觉得 firewalld 更好用

    用一个例子说明下。比如要开放 8080 端口。

    • firewalld
    firewalld-cmd  --zone=public --add-port=5000/tcp --permanent
    firewalld-cmd --reload
    
    • iptables
    iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
    service iptables save
    systemctl iptables restart
    

    相比之下 firewalld 更容易看懂,且步骤更少,又不用重启服务。 另外 firewalld 还有分区的概念容易整理一系列的端口。Centos 7 默认防火墙使用 Firewalld 还觉得挺好的。

    安装 firewalld

    Centos 7 会默认安装 firewalld,若卸载了要重新安装

    yum -y install firewalld
    

    基本管理

    • 启动 systemctl start firewalld
    • 设置开机启动 systemctl enable firewalld
    • 重启 systemctl restart firewalld
    • 关闭开机启动 systemctl disable firewalld
    • 查看状态 systemctl status firewalld 或者 firewall-cmd --state

    区域(zones)

    Firewalld 有区域(zones)的概念。这有什么用呢?比如说,公共 WIFI 是不可信任的网络类型,而家庭网络几乎是完全可信任。如果这两者都采取相同的安全策略,就会有很多策略是冗余的。根据网络的类型,将防火墙分成不同的区域有它存在的价值。而在firewalld中会,会预先为你设定了很多个区域。 用下面的语句可以看到所有的区域

    firewall-cmd --get-zones
    
    block dmz drop external home internal public trusted work
    

    其中从不信任到信任的排序是:

    • drop(丢弃):最低级别的信任。任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
    • block(限制):和上面相似,任何接收的网络连接都被 IPv4 的 icmp-host-prohibited (ping 不到) 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝
    • public(公共):在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
    • external(外部):特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
    • dmz(非军事区用):于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
    • work(工作):用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
    • home(家庭):用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
    • internal(内部):用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
    • trusted(信任):可接受所有的网络连接

    区域命令

    获取默认区域

    sudo firewall-cmd --get-default-zone
    
    public
    

    查看所有区域的信息

    sudo firewall-cmd --list-all-zones
    
    block
          target: %%REJECT%%
          icmp-block-inversion: no
          interfaces:
          sources:
          services:
          ports:
          protocols:
          masquerade: no
          forward-ports:
          source-ports:
          icmp-blocks:
          rich rules:
        
        dmz
          target: default
        ...
    

    获取与 public 区域相关的信息

    sudo firewall-cmd --list-all
    

    sudo firewall-cmd --zone=public --list-all
    
      public
          target: default
          icmp-block-inversion: no
          interfaces:
          sources:
          services: ssh dhcpv6-client
          ports:
          protocols:
          masquerade: no
          forward-ports:
          source-ports:
          icmp-blocks:
          rich rules:
    

    当前活动区域

    sudo firewall-cmd --get-active-zones
    

    默认是没有活动区域的,主要原因是没有为该区域设置网络接口,设置了网络接口后就可以了

    为区域设置网络接口

    sudo firewall-cmd  --change-interface=eth0 --zone=public --permanent 
    sudo firewall-cmd --reload
    

    其中 firewall-cmd --reload 可以在不用重启的情况重新加载配置 而 --permanent 的意思是持久化的配置, 机器重启后规则依然能生效 至于如果看网络接口,可以用 ip addr 命令去看,其中lo是本地回环接口,其余的不是。 提示:要注意切换接口的区域,如果网络接口切入到一个drop区域什么的,会马上连 ssh 都连不上,谨慎切换 然后再

    sudo firewall-cmd --get-active-zones
    
        public
          interfaces: eth0
    

    设置默认区域

    如果你所有接口都用单区域去处理,那么只需选择默认区域就可以,而设置默认区域的命令是

    sudo firewall-cmd --set-default-zone=public
    

    通过网络接口找区域

    firewall-cmd --get-zone-of-interface=eth0
    
    public
    

    通过区域找接口

    firewall-cmd --zone=public --list-interfaces
    
        eth0
    

    区域的服务

    获取能添加的所有服务

    服务挺多的

    sudo firewall-cmd --get-services
    
    RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine ...
    

    对应的文件在 /usr/lib/firewalld/services/ 的文件夹中,每个服务都有一个 xml 文件来定义。比如 :https.xml 的文件

        <?xml version="1.0" encoding="utf-8"?>
        <service>
          <short>Secure WWW (HTTPS)</short>
          <description>HTTPS is a modified HTTP used to serve Web pages when security is important. Examples are sites that require logins like stores or web mail. This option is not required for viewing pages locally or developing Web pages. You need the httpd package installed for this option to be useful.</description>
          <port protocol="tcp" port="443"/>
        </service>
    

    添加服务

    sudo firewall-cmd  --permanent --zone=public --add-service=http
    sudo firewall-cmd  --reload
    

    查看区域服务

    sudo firewall-cmd --zone=public --list-services    
    
    ssh dhcpv6-client http
    

    移除服务

    sudo firewall-cmd  --permanent --zone=public --remove-service=http
    sudo firewall-cmd  --reload
    

    区域的端口

    添加端口

    sudo firewall-cmd --zone=public  --permanent --add-port=80/tcp
    sudo firewall-cmd --reload
    

    端口后的协议可以是tcp或者udp

    添一段端口

    sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
    

    查看端口

    sudo firewall-cmd --zone=public --list-port
    
    80/tcp
    

    移除端口

    sudo firewall-cmd --permanent  --zone=public --remove-port=80/tcp
    sudo firewall-cmd  --reload
    

    最后

    我常用的命令就是以上几种、另外 firewall 也有端口转发、白名单、黑名单的功能,只是这些功能都有更好的替代品了,nginx 之类的。如果你想了解更多你可以看 firewall的官方文档_firewalld)

  • 相关阅读:
    信息系统项目管理师沟通的四个好习惯
    Android 线程
    替换exe程序图标DLL
    Python 邮件类
    android自适应屏幕方向和大小
    sqlserver 存储过程
    FinalData 数据恢复工具[绿色版]
    Python Python 正则 取中括号值
    在Button任意位置加图片效果
    android GPRS
  • 原文地址:https://www.cnblogs.com/jojo-feed/p/10182986.html
Copyright © 2011-2022 走看看