阅读视图

firewalld防火墙工具的使用

firewalld防火墙工具的使用

firewalld 是一种动态的防火墙管理工具,广泛用于 Linux 操作系统(如 CentOS、Fedora 和 RHEL)。它提供了一个用户友好的接口,用于配置和管理防火墙规则,支持 IPv4、IPv6、ARP 和网络桥接。

firewalld 的基本概念

  • 区域(Zones)firewalld 使用区域来定义不同的信任级别。每个区域包含一组规则,用于允许或拒绝网络流量。常见的区域包括 publicprivateinternaldmztrusted

  • 服务(Services)firewalld 支持以服务的方式管理常见的网络服务(如 SSH、HTTP、HTTPS)。你可以使用服务名来快速配置相关的端口和协议。

  • 规则(Rules):可以为每个区域定义规则,包括允许的端口、IP 地址、协议等。

安装 firewalld

在大多数 Linux 发行版上,firewalld 通常默认安装。如果没有安装,可以使用以下命令进行安装:

# CentOS/RHELsudo yum install firewalld# Ubuntu/Debiansudo apt install firewalld

启动和管理 firewalld

  1. 启动 firewalld

    sudo systemctl start firewalld
  2. 设置开机自启

    sudo systemctl enable firewalld
  3. 检查 firewalld 状态

    sudo systemctl status firewalld

常用命令和配置方法

以下是一些常用的 firewalld 命令和配置方法:

1. 查看当前区域和规则

  • 查看活跃的区域

    sudo firewall-cmd --get-active-zones
  • 查看某个区域的详细信息

    sudo firewall-cmd --zone=public --list-all

2. 区域管理

  • 设置默认区域

    sudo firewall-cmd --set-default-zone=public
  • 添加新区域

    sudo firewall-cmd --permanent --new-zone=myzone
  • 删除区域

    sudo firewall-cmd --permanent --delete-zone=myzone

3. 端口管理

  • 开放端口

    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
  • 关闭端口

    sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
  • 开启端口转发

    ## 打开端口转发,监听9736端口,并将请求转发到10.53.234.104的16379端口(转发到本机时,需要写本机地址,而不能是127.0.0.1)firewall-cmd --zone=public \--add-forward-port=port=9736:proto=tcp:toport=16379:toaddr=10.53.234.104 \--permanent 
  • 关闭端口转发

    ## 移除端口转发firewall-cmd --zone=public \--remove-forward-port=port=9736:proto=tcp:toport=16379:toaddr=10.53.234.104 \--permanent
  • 重新加载配置(使修改生效):

    sudo firewall-cmd --reload

4. 服务管理

  • 开放服务

    sudo firewall-cmd --zone=public --add-service=http --permanent
  • 关闭服务

    sudo firewall-cmd --zone=public --remove-service=http --permanent
  • 查看已开启的服务

    sudo firewall-cmd --zone=public --list-services

5. IP 地址和地址段管理

  • 允许特定 IP 地址

    sudo firewall-cmd --zone=public --add-source=192.168.1.100 --permanent
  • 删除特定 IP 地址

    sudo firewall-cmd --zone=public --remove-source=192.168.1.100 --permanent
  • 允许 IP 地址段

    sudo firewall-cmd --zone=public --add-source=192.168.1.0/24 --permanent

6. 规则管理

  • 添加富规则(Rich Rules):

    sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept' --permanent
  • 删除富规则

    sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" accept' --permanent

总结

firewalld 是一个灵活且强大的防火墙管理工具,能够通过区域、服务和富规则等方式来简化防火墙配置。通过上述命令和配置方法,您可以轻松地管理 Linux 系统的网络流量,增强系统的安全性。

  •  

Linux信号(signal)机制

信号(signal)是一种软中断,信号机制是进程间通信的一种方式,采用异步通信方式

一、信号类型

Linux系统共定义了64种信号,分为两大类:可靠信号与不可靠信号,前32种信号为不可靠信号,后32种为可靠信号。

1.1 概念

  • 不可靠信号: 也称为非实时信号,不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值取值区间为1~31;

  • 可靠信号: 也称为实时信号,支持排队, 信号不会丢失, 发多少次, 就可以收到多少次. 信号值取值区间为32~64

1.2 信号表

在终端,可通过kill -l查看所有的signal信号

取值名称解释默认动作
1SIGHUP挂起
2SIGINT中断
3SIGQUIT退出
4SIGILL非法指令
5SIGTRAP断点或陷阱指令
6SIGABRTabort发出的信号
7SIGBUS非法内存访问
8SIGFPE浮点异常
9SIGKILLkill信号不能被忽略、处理和阻塞
10SIGUSR1用户信号1
11SIGSEGV无效内存访问
12SIGUSR2用户信号2
13SIGPIPE管道破损,没有读端的管道写数据
14SIGALRMalarm发出的信号
15SIGTERM终止信号
16SIGSTKFLT栈溢出
17SIGCHLD子进程退出默认忽略
18SIGCONT进程继续
19SIGSTOP进程停止不能被忽略、处理和阻塞
20SIGTSTP进程停止
21SIGTTIN进程停止,后台进程从终端读数据时
22SIGTTOU进程停止,后台进程想终端写数据时
23SIGURGI/O有紧急数据到达当前进程默认忽略
24SIGXCPU进程的CPU时间片到期
25SIGXFSZ文件大小的超出上限
26SIGVTALRM虚拟时钟超时
27SIGPROFprofile时钟超时
28SIGWINCH窗口大小改变默认忽略
29SIGIOI/O相关
30SIGPWR关机默认忽略
31SIGSYS系统调用异常

对于signal信号,绝大部分的默认处理都是终止进程或停止进程,或dump内核映像转储。 上述的31的信号为非实时信号,其他的信号32-64 都是实时信号。

二、信号产生

信号来源分为硬件类和软件类:

2.1 硬件方式

  • 用户输入:比如在终端上按下组合键ctrl+C,产生SIGINT信号;
  • 硬件异常:CPU检测到内存非法访问等异常,通知内核生成相应信号,并发送给发生事件的进程;

2.2 软件方式

通过系统调用,发送signal信号:kill(),raise(),sigqueue(),alarm(),setitimer(),abort()

  • kernel,使用 kill_proc_info()等
  • native,使用 kill() 或者raise()等
  • java,使用 Procees.sendSignal()等

三、信号注册和注销

3.1 注册

在进程task_struct结构体中有一个未决信号的成员变量 struct sigpending pending。每个信号在进程中注册都会把信号值加入到进程的未决信号集。

  • 非实时信号发送给进程时,如果该信息已经在进程中注册过,不会再次注册,故信号会丢失;
  • 实时信号发送给进程时,不管该信号是否在进程中注册过,都会再次注册。故信号不会丢失;

3.2 注销

  • 非实时信号:不可重复注册,最多只有一个sigqueue结构;当该结构被释放后,把该信号从进程未决信号集中删除,则信号注销完毕;
  • 实时信号:可重复注册,可能存在多个sigqueue结构;当该信号的所有sigqueue处理完毕后,把该信号从进程未决信号集中删除,则信号注销完毕;

四、信号处理

内核处理进程收到的signal是在当前进程的上下文,故进程必须是Running状态。当进程唤醒或者调度后获取CPU,则会从内核态转到用户态时检测是否有signal等待处理,处理完,进程会把相应的未决信号从链表中去掉。

4.1 处理时机

signal信号处理时机: 内核态 -> signal信号处理 -> 用户态:

  • 在内核态,signal信号不起作用;
  • 在用户态,signal所有未被屏蔽的信号都处理完毕;
  • 当屏蔽信号,取消屏蔽时,会在下一次内核转用户态的过程中执行;

4.2 处理方式

进程对信号的处理方式: 有3种

  • 默认 接收到信号后按默认的行为处理该信号。 这是多数应用采取的处理方式。
  • 自定义 用自定义的信号处理函数来执行特定的动作
  • 忽略 接收到信号后不做任何反应。

4.3 信号安装

进程处理某个信号前,需要先在进程中安装此信号。安装过程主要是建立信号值和进程对相应信息值的动作。

信号安装函数

  • signal():不支持信号传递信息,主要用于非实时信号安装;

  • sigaction():支持信号传递信息,可用于所有信号安装;
    其中 sigaction结构体

  • sa_handler:信号处理函数

  • sa_mask:指定信号处理程序执行过程中需要阻塞的信号;

  • sa_flags:标示位

    • SA_RESTART:使被信号打断的syscall重新发起。
    • SA_NOCLDSTOP:使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。
    • SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到SIGCHLD信号,这时子进程如果退出也不会成为僵 尸进程。
    • SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。
    • SA_RESETHAND:信号处理之后重新设置为默认的处理方式。
    • SA_SIGINFO:使用sa_sigaction成员而不是sa_handler作为信号处理函数。

函数原型:

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

  • signum:要操作的signal信号。
  • act:设置对signal信号的新处理方式。
  • oldact:原来对信号的处理方式。
  • 返回值:0 表示成功,-1 表示有错误发生。

4.4 信号发送

  • kill():用于向进程或进程组发送信号;
  • sigqueue():只能向一个进程发送信号,不能像进程组发送信号;主要针对实时信号提出,与sigaction()组合使用,当然也支持非实时信号的发送;
  • alarm():用于调用进程指定时间后发出SIGALARM信号;
  • setitimer():设置定时器,计时达到后给进程发送SIGALRM信号,功能比alarm更强大;
  • abort():向进程发送SIGABORT信号,默认进程会异常退出。
  • raise():用于向进程自身发送信号;

4.5 信号相关函数

信号集操作函数

  • sigemptyset(sigset_t *set):信号集全部清0;
  • sigfillset(sigset_t *set): 信号集全部置1,则信号集包含linux支持的64种信号;
  • sigaddset(sigset_t *set, int signum):向信号集中加入signum信号;
  • sigdelset(sigset_t *set, int signum):向信号集中删除signum信号;
  • sigismember(const sigset_t *set, int signum):判定信号signum是否存在信号集中。

信号阻塞函数

  • sigprocmask(int how, const sigset_t *set, sigset_t *oldset)); 不同how参数,实现不同功能
    • SIG_BLOCK:将set指向信号集中的信号,添加到进程阻塞信号集;
    • SIG_UNBLOCK:将set指向信号集中的信号,从进程阻塞信号集删除;
    • SIG_SETMASK:将set指向信号集中的信号,设置成进程阻塞信号集;
  • sigpending(sigset_t *set)):获取已发送到进程,却被阻塞的所有信号;
  • sigsuspend(const sigset_t *mask)):用mask代替进程的原有掩码,并暂停进程执行,直到收到信号再恢复原有掩码并继续执行进程。

想更进一步了解关于信号,可查看 http://akaedu.github.io/book/ch33.html

  •  

浅谈Linux(Unix)的I/O模型

一、引言

IO指的是输入输出,在Linux操作系统中,共有5种IO模型,分别是:

  • Blocking I/O (同步,阻塞I/O)
  • Nonblocking I/O (同步,非阻塞I/O)
  • I/O multiplexing (select and poll,多路复用,同步)
  • Signal driven I/O (SIGIO,信号驱动,同步)
  • Asynchronous IO (the POSIX aio functions,异步I/O模型)

Linux I/O的数据处理,存在两个阶段:

  1. 等待阶段:DMA控制器从磁盘或网卡等,读取数据,将数据读取到内核空间。
  2. 拷贝阶段:将数据从内核空间拷贝到用户空间。

二、五种模型

2.1 Blocking I/O

阻塞I/O模型,等待数据和拷贝数据的过程,都是阻塞的

2.2 Nonblocking I/O

非阻塞I/O模型,会采用while不断尝试数据读取,没有读到数据立刻返回false,读到了就结束while,将读到的数据从内核缓冲区拷贝到用户空间中,其中while过程非常快,因此不会阻塞

2.3 I/O multiplexing

多路复用I/O模型,类似阻塞I/O,不同的是用了两次系统调用,也是尝试读取数据,等准备好后再拷贝到用户空间,不同于Blocking I/O,I/O multiplexing基于Linux的select调用,多个线程的IO可以注册在一个管道上,统一和内核交互,哪个数据准备好了,就把哪一个的数据复制到用户空间。

2.4 Signal driven I/O

信号驱动的I/O模型,是非阻塞的,发起sigaction系统调用后,立刻返回,等数据读取完成后,Linux系统会主动发送一个sigio的信号给进程,进程监听到信号后,再去调用系统调用获取数据。

2.5 Asynchronous IO

异步I/O模型,和Signal driven I/O很像,不同的是将IO请求发送给内核后,完全由内核完成拷贝,内核完成操作后,会告诉进程拷贝已完成。

  •