zoukankan      html  css  js  c++  java
  • centos7 的systemctl 和 防火墙 firewalld 的应用

    一、systemctl是一个systemd工具

      systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。Systemd是一个系统管理守护进程、工具和库的集合,用于取代System V初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。在Linux生态系统中,Systemd被部署到了大多数的标准Linux发行版中,只有为数不多的几个发行版尚未部署。Systemd通常是所有其它守护进程的父进程,但并非总是如此。

    是否安装有systemd并确定当前安装的版本:systemctl --version
    启动一个服务:systemctl start firewalld.service
    关闭一个服务:systemctl stop firewalld.service
    重启一个服务:systemctl restart firewalld.service
    重载一个服务:systemctl reload firewalld.service
    注:当我们使用systemctl的start,restart,stop和reload命令时,我们不会从终端获取到任何输出内容,只有status命令可以打印输出。

    显示一个服务的运行状态:systemctl status firewalld.service
    在开机时启用一个服务:systemctl enable firewalld.service
    在开机时禁用一个服务:systemctl disable firewalld.service
    查看某个服务是否开机启动:systemctl is-enabled firewalld.service

    列出所有可用单元:systemctl list-unit-files
    列出所有运行中单元:systemctl list-units

    查看已启动的服务列表:systemctl list-unit-files | grep enabled
    查看启动失败的服务列表:systemctl --failed
    使用systemctl命令杀死服务:systemctl kill httpd

    分析systemd启动进程:systemd-analyze
    分析启动时各个进程花费的时间:systemd-analyze blame

    检查systemd和systemctl的二进制文件和库文件的安装位置:whereis systemd
    检查systemd是否运行:ps -eaf | grep [s]ystemd
    注:systemd是作为父进程(PID=1)运行的。在上面带(-e)参数的ps命令输出中,选择所有进程,(-a)选择除会话前导外的所有进程,并使用(-f)参数输出完整格式列表(即 -eaf)。上例中后随的方括号和例子中剩余部分。方括号表达式是grep的字符类表达式的一部分。

    分析启动时的关键链:systemd-analyze critical-chain
    注:Systemctl接受服务(.service),挂载点(.mount),套接口(.socket)和设备(.device)作为单元。

    获取当前某个服务的CPU分配额(如httpd):systemctl show -p CPUShares httpd.service
    检查某个服务的所有配置细节:systemctl show httpd
    分析某个服务(httpd)的关键链:systemd-analyze critical-chain httpd.service

    列出当前使用的运行等级:systemctl get-default
    注:
    运行等级说明如下
    Runlevel 0 : 关闭系统
    Runlevel 1 : 救援、维护模式
    Runlevel 3 : 多用户,无图形系统
    Runlevel 4 : 多用户,无图形系统
    Runlevel 5 : 多用户,图形化系统
    Runlevel 6 : 关闭并重启机器

    启动运行等级5,即图形模式:
    systemctl isolate runlevel5.target

    systemctl isolate graphical.target

    设置多用户模式或图形模式为默认运行等级:
    systemctl set-default runlevel3.target
    systemctl set-default runlevel5.target

    重启、停止、挂起、休眠系统或使系统进入混合睡眠:
    systemctl reboot
    systemctl halt
    systemctl suspend
    systemctl hibernate
    systemctl hybrid-sleep

    二、防火墙 firewalld 的安装

    1、在CentOS7中安装 firewalld 的命令如下:

    yum install firewalld

    2、如果需要图形界面,需再安装:

    yum install firewall-config

    3、使用tab键补全命令提示:

    yum install bash-completion

      防火墙守护 firewalld 服务引入了一个信任级别的概念来管理与之相关联的连接与接口。它支持 ipv4 与 ipv6,并支持网桥,采用 firewall-cmd (command) 或 firewall-config (gui) 来动态的管理 kernel netfilter 的临时或永久的接口规则,并实时生效而无需重启服务。

    Firewall 能将不同的网络连接归类到不同的信任级别,Zone 提供了以下几个级别:

    drop:丢弃所有进入的包,而不给出任何响应
    block:拒绝所有外部发起的连接,允许内部发起的连接
    public:允许指定的进入连接
    external:同上,对伪装的进入连接,一般用于路由转发
    dmz:允许受限制的进入连接
    work:允许受信任的计算机被限制的进入连接,类似 workgroup
    home:同上,类似 homegroup
    internal:同上,范围针对所有互联网用户
    trusted:信任所有连接

    三、防火墙 firewalld 的应用

    查看版本: firewall-cmd --version
    查看帮助: firewall-cmd --help
    查看状态: firewall-cmd --state
    查看防火墙规则:firewall-cmd --list-all
    查看所有打开的端口: firewall-cmd --list-ports
    查看指定区域打开的端口: firewall-cmd --zone=public --list-ports
    查询端口是否开放:firewall-cmd --query-port=8080/tcp
    更新防火墙规则: firewall-cmd --reload (修改配置后要更新防火墙)
    查看已被激活的 Zone 信息: firewall-cmd --get-active-zones
    查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0
    查看指定级别的接口:firewall-cmd --zone=public --list-interfaces
    查看指定级别的所有信息:firewall-cmd --zone=public --list-all
    查看所有级别被允许的信息:firewall-cmd --get-service
    查看重启后所有 Zones 级别中永久放行的服务:firewall-cmd --get-service --permanent

    查看区域:firewall-cmd --get-zones
    查看默认区域:firewall-cmd --get-default-zone

    一个区域可以绑定多个网卡,一个网卡只能绑定一个区域:
    查看网卡和区域绑定:
    firewall-cmd --get-zone-of-interface=ens33

    区域添加网卡接口:
    firewall-cmd --add-interface=ens34 --zone=public --permanent

    区域删除网卡:
    firewall-cmd --remove-interface=ens34 --zone=public --permanent

    修改网卡的区域:
    firewall-cmd --change-interface=ens33 --zone=public --permanent

    trusted区域的所有服务都被允许:

    网卡如果不属于任何区域,那么来自该接口的所有数据包将使用默认的区域规则:
    区域添加来源地址,如果接口不属于某个区域,那么来自于该接口的流量如果匹配来源地址,那么流量将从来源的区域通过:

    所有的配置操作如果想永久生效,则需要加--permanent选项,否则配置只会在当前运行环境生效。

    四、firewalld的工作过程

    firewalld将所有传入流量划分区域,每个区域都有自己的一套规则。为检查哪个区域用于传入连接。firewalld使用以下逻辑,第一个匹配规则胜出:
    1、传入包的源地址与区域的某个源规则设置匹配,该包将通过该区域进行路由。
    2、包的传入接口与区域的过滤器设置匹配,则将使用该区域。
    3、否则将使用默认区域。默认区域不是单独的区域,而是指向系统上定义的某个其他区域。
    除非管理员NetworkManager配置所覆盖,否则,任何新网络接口的默认区域都将设置为public区域。

    防火墙的网络区域定义了网络连接的可信等级(共9个区域),我们可以根据不同场景来调用不同的firewalld区域,区域规则如下:

    五、使用示例如下:

    1、添加tcp的80端口:
    firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
    firewall-cmd --add-port=80/tcp --permanent 
    2、删除tcp的80端口:
    firewall-cmd --remove-port=80/tcp --permanent
    firewall-cmd --zone= public --remove-port=80/tcp --permanent

    参数解释
    1、firwall-cmd:是Linux提供的操作firewall的一个工具;
    2、--permanent:表示设置为持久;
    3、--add-port:标识添加的端口;

    # firewall-cmd --panic-on # 丢弃
    # firewall-cmd --panic-off # 取消丢弃
    $ firewall-cmd --query-panic # 查看丢弃状态
    # firewall-cmd --reload # 更新规则,不重启服务
    # firewall-cmd --complete-reload # 更新规则,重启服务
    添加某接口至某信任等级,譬如添加 eth0 至 public,再永久生效

    # firewall-cmd --zone=public --add-interface=eth0 --permanent

    设置 public 为默认的信任级别

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

    a. 管理端口
    列出 dmz 级别的被允许的进入端口

    # firewall-cmd --zome=dmz --list-ports
    允许 tcp 端口 8080 至 dmz 级别

    # firewall-cmd --zone=dmz --add-port=8080/tcp
    允许某范围的 udp 端口至 public 级别,并永久生效

    # firewall-cmd --zome=public --add-port=5060-5059/udp --permanent
    b. 管理服务
    添加 smtp 服务至 work zone

    # firewall-cmd --zone=work --add-service=smtp
    移除 work zone 中的 smtp 服务

    # firewall-cmd --zone=work --remove-service=smtp
    c. 配置 ip 地址伪装
    查看

    # firewall-cmd --zone=external --query-masquerade
    打开伪装

    # firewall-cmd --zone=external --add-masquerade
    关闭伪装

    # firewall-cmd --zone=external --remove-masquerade
    d. 端口转发
    要打开端口转发,则需要先

    # firewall-cmd --zone=external --add-masquerade
    然后转发 tcp 22 端口至 3753

    # firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3753
    转发 22 端口数据至另一个 ip 的相同端口上

    # firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.100
    转发 22 端口数据至另一 ip 的 2055 端口上

    # firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.100

    六、firewalld 的 rich 规则

    1、rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率

    rich语法:
        rule
    [source]

    [destination]
    service|port|protocol|icmp-block|masquerade|forward-port
    [log]
    [audit]
    [accept|reject|drop]
    man 5 firewalld.richlanguage

    man 5 firewalld.richlanguage
    规则

    规则实施顺序:
    该区域的端口转发,伪装规则
    该区域的日志规则
    该区域的允许规则
    该区域的拒绝规则
    每个匹配的规则生效,所有规则都不匹配,该区域默认规则生效

    2、rich规则示例

    拒绝从192.168.0.11的所有流量,当address 选项使用source 或 destination时,必须用family= ipv4 |ipv6
      firewall-cmd --permanent --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject‘

    限制每分钟只有两个连接到ftp服务
      firewall-cmd --add-rich-rule=‘rule service name=ftp limit value=2/m accept’

    抛弃esp( IPsec 体系中的一种主要协议)协议的所有数据包
      firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'

    接受所有192.168.1.0/24子网端口5900-5905范围的TCP流量
      firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=5900-5905 protocol=tcp accept'

    rich日志规则

    log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]
    <LOGLEVEL> 可以是emerg,alert, crit, error, warning, notice, info, debug.
    <DURATION> s:秒, m:分钟, h:小时, d:天
    audit [limit value="<RATE/DURATION>"]

    rich日志规则实例

    接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
    firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept

    从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每小时最大记录一条信息
      firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300

    规则示例

    firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.X.10/32 service name="http" log level=notice prefix="NEW HTTP " limit value="3/s" accept'
    firewall-cmd --reload
    tail -f /var/log/messages
    curl http://serverX.example.com

    伪装和端口转发

    NAT网络地址转换,firewalld支持伪装和端口转发两种NAT方式

    伪装NAT
    firewall-cmd --permanent --zone=<ZONE>
    firewall-cmd --query-masquerade 检查是否允许伪装
    firewall-cmd --add-masquerade 允许防火墙伪装IP
    firewall-cmd --remove-masquerade 禁止防火墙伪装IP
    示例:
    firewall-cmd --add-rich-rule='rule family=ipv4 address=192.168.0.0/24 masquerade'

    端口转发

    端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址伪装才能实现
    firewall-cmd --permanent --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>] 说明:toport= 和toaddr= 至少要指定一个
    示例:
    转发传入的连接9527/TCP,到防火墙的80/TCP到public zone 的192.168.0.254
    firewall-cmd --add-masquerade 启用伪装
    firewall-cmd --zone=public --add-forward-
    port=port=9527:proto=tcp:toport=80:toaddr=192.168.0.254

    rich规则

    rich规则语法:
    forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
    示例:
    转发从192.168.0.0/24来的,发往80/TCP的流量到防火墙的端口8080/TCP
    firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080'

    rich规则示例

    firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=172.25.X.10/32 forward-port port=443 protocol=tcp to-port=22'
    firewall-cmd --reload
    ssh -p 443 serverX.example.com

    1、启动防火墙
    systemctl start firewalld.service

    2、指定IP与端口
    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="5432" accept"

    3、重新载入,使配置生效
    systemctl restart firewalld.service

    4、查看配置结果
    firewall-cmd --list-all

    5、删除规则
    firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="11300" accept"

    6、防火墙的FTP策略配置

    放行20、21端口还是不能连接FTP,因为在PASV模式下,建立数据传输会随机开放端口,这个端口显然是没有处于firewall的允许策略之下的,因为需要修改配置文件,指定端口范围。

    vi /etc/vsftpd/vsftpd.conf
    在最后加入以下内容,端口尽量选择高范围,提高安全性

    pasv_enable=YES #开启被动模式
    pasv_min_port=30000 #随机最小端口
    pasv_max_port=31000 #随机最大端口
    然后对指定的IP开放指定的端口段

    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="30000-31000" accept"
    然后重启ftp、firewall,即可正常连接

    七、服务和其他构件

    在区域中有一些基本的构件块,其中服务是最重要的。防火墙使用管理员创建在/usr/lib/firewalld/services(系统默认服务) 和/etc/firewalld/services文件下的XML文件,配置的自身服务集。XML文件时通过列表3中的例子创建的。

    firewall-cmd --add-service=ftp #开放 ftp 服务规则 
    firewall-cmd --add-service=mysql # 开放mysql端口规则 
    firewall-cmd --add-service=http # 开放http端口规则 
    firewall-cmd --add-service=ssh # 开放ssh端口规则 

      以上四个规则重启服务会消失,只能临时生效,也是立刻生效的,如果要永久保存的规则就要添加参数:--permanent,添加此参数后不会立刻生效。需要重载或重启服务才生效。

    八、其他

    特别注意:
    iptables服务与firewalld服务都不是真正的防火墙,他们都只是用来定义防火墙规则功能的“防火墙管理工具”。
    由netfilter即网络过滤器来读取,从而真正实现防火墙功能。
    firewalld与iptables是冲突。如果使用firewall-cmd,应该把iptables和其他防火墙服务屏蔽。

    可以通过三种方式来管理firewalld:
    1、使用命令行工具firewall-cmd
    2、使用图形工具firewall-config
    3、使用/etc/firewalld/中的配置文件
    在大部分情况下,不建议直接编辑配置文件,但是在使用配置管理工具时,以这种方法copy配置会很有用。

    请注意:
    1、除非另外指定,否则几乎所有命令都作用于运行时配置,当指定--permanent(永久配置)选项时除外(Runtime模式)。
    2、列出的许多命令都采用 --zone=选项来确定所影响的区域,如果在这些命令中省略--zone,则将使用默认区域。
    3、使用--permanent配置的所有更改,若要使其生效,必须使用firewall-cmd --reload(重新加载防火墙规则)
    4、推荐在测试新的并且可能有危险的规则时,可以使用额外选项以一定时间后自动删除某个规则,从而防止管理员意外锁定某个系统:--timemout

    firewalld的特点是拥有运行时配置(RunTime)与永久配置(Permanent)选项且能够支持动态更新以及“zone”的区域功能概念。相比iptables,firewalld的使用效能更高,处理速度更快,对用户透明,而且跟加稳定。firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。

    firewalld和iptables service 之间最本质的不同是:iptables service 在 /etc/sysconfig/iptables 中储存置,而firewalld将配置储存在/usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种XML文件里.

    以上都是一些常用方法,更多高级方法,请参考:
    https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html
    https://fedoraproject.org/wiki/FirewallD

    参考:
    https://firewalld.org/documentation/man-pages/firewalld.richlanguage.html
    https://www.cnblogs.com/moxiaoan/p/5683743.html
    https://www.cnblogs.com/zqifa/p/linux-firewall-1.html
    https://linux.cn/article-5926-1.html
    https://www.cnblogs.com/duanxin1/p/9860913.html
    https://www.cnblogs.com/qige2017/p/7710920.html
    https://www.58jb.com/html/187.html

  • 相关阅读:
    文档01_基础
    文档07_JavaScript_ajax
    文档02_JavaScript
    文档06_JavaScript_面相对象
    文档05_JavaScript_节点
    文档06_Asp.net2.0_01
    文档04_JavaScript_事件
    文档05_多线程
    文档03_JavaScript_函数
    根据日期计算星座
  • 原文地址:https://www.cnblogs.com/ylnic/p/10071283.html
Copyright © 2011-2022 走看看