Linux 服务器使用 firewalld 与 iptables 命令管理防火墙规则

Linux 服务器使用 firewalld 与 iptables 命令管理防火墙规则:通俗来讲,用于管理开放相应端口,甚至可以通过管理工具进行限流。

许多不了解的人,认为 RHEL7 中的防火墙从 iptables 变成了 firewalld。其实不然,无论是 iptables 还是 firewalld 都无法提供防火墙功能。他们都只是 linux 系统中的一个防火墙管理工具,负责生成防火墙规则与内核模块 netfilter 进行 “交流”,真正实现防火墙功能的是内核模块 netfilter。

https://s1.ax1x.com/2023/04/04/pp448cq.png

iptables 与 firewalld 防火墙管理工具在 linux 发行版 Redhat7 系列使用较为广泛。UFW 则是在 linux 发行版 Ubuntu 下进行管理防火墙的一款管理工具。在选用防火墙工具的时候,运维或者是开发人员往往会纠结使用哪个。这里给出建议,使用 iptables 工具管理就禁用 firewalld,使用 firewalld 工具管理就禁用 iptables,二者选其一即可,避免产生混乱。

此篇文章不会在原理上做深究,主要以实用性为主,原理可以阅读相关书籍慢慢品味。

一、Netfilter 内核模块

无论是使用 iptables 还是 firewalld,不妨先了解一下 Netfilter 内核模块

什么是 Netfilter:linux 操作系统核心层内部的一个数据包处理模块。

Hook point:数据包在 Netfilter 中的挂载点。(PRE_ROUTING INPUT OUTPUT FORWORD POST_ROUTING)

1、netfilter 的体系结构

网络数据包的的统信主要通过以下相关步骤,对应 netfilter 定义的钩子函数,具体可以参考源码介绍。

  • NF_IP_PRE_ROUTING

    网络数据包进入系统,经过简单检测后,数据包转交给改函数进行处理,然后根据系统设置的规则对数据包进行处理,如果数据包不被丢弃则交给路由函数进行处理。在该函数中可以替换 IP 包的目的地址,及 DNAT

  • NF_IP_LOCAL_IN:

    所有发送给本机的数据包都要通过该函数进行处理,该函数根据系统设置的系统规则对数据包进行处理,如果数据包不被丢弃则交给本地的应用程序。

  • NF_IP_FORWARD:

    所有不是发送给本机的数据包都要通过该函数进行处理,该函数会根据系统设置的规则对数据包进行处理,如数据包不被丢弃则转给

    NF_IP_POST_ROUTING 处理。

  • NF_IP_LOCAL_OUT:

    所有从本地应用程序出来的数据包必须通过该函数进行处理,该函数会根据系统设置的规则对数据包进行处理,如数据包不被丢弃则交给路由函数进行处理。

  • NF_IP_POST_ROUTING

    所有数据包在发送给其它主机之前需要通过该函数进行处理,该函数会根据系统设置的规则对数据包进行处理,如数据包不被丢弃,将数据包发给数据链路层。在该函数中可以替换 IP 包的源地址,即 SNAT

数据包通过 linux 防火墙的处理过程如下图:

https://s1.ax1x.com/2023/04/04/pp448cq.png

2、包过滤

每个函数都可以对数据包进行处理,最基本的操作是对数据包进行过滤。系统管理员可以通过 iptables 工具来向内核模块注册多个过滤规则,并且指明过滤规则的优先权。设置完以后每个钩子按照规则进行匹配。如果规则匹配,函数就会进行一些过滤操作,这些操作主要如下:

  • NF_ACCEPT:继续正常的传递包。
  • NF_DROP:丢弃包,阻止传送。
  • SF_STOLEN:已经接管了包,不需要继续传送。
  • NF_QUEUE:排列包。
  • NF_REPEAT:再次使用钩子。

篇幅受限,介绍过多反而不好。关于包过滤就介绍这么多。

二、firewalld 防火墙工具

以 Redhat 系列为例子做简单的介绍,熟悉 CentOS 的基本上可以套用。

firewalld 简介

在 RHEL7 之前的版本中,iptables 和 ip6tables 作为防火墙配置管理工具。在 RHEL7 中防火墙管理工具变成了 firewalld,它是一个支持自定义网络区域(zone)及接口安全等级的动态防火墙管理工具。利用 firewalld,用户可以实现许多强大的网络功能,例如防火墙、代理服务器以及网络地址转换。

之前版本的 system-config-firewall 和 lokkit 防火墙模型是静态的,每次修改防火墙规则都需要完全重启。在此过程中包括提供防火墙的内核模块 netfilter 需要卸载和重新加载。而卸载会破坏已建立的连接和状态防火墙。与之前的静态模型有区别,firewalld 将动态地管理防火墙,不需要重新启动防火墙,也不需重新加载内核模块。但 firewalld 服务要求所有关于防火墙的变更都要通过守护进程来完成,从而确保守护进程中的状态与内核防火墙之间的一致性。

许多不了解的人,认为 RHEL7 中的防火墙从 iptables 变成了 firewalld。其实不然,无论是 iptables 还是 firewalld 都无法提供防火墙功能。他们都只是 linux 系统中的一个防火墙管理工具,负责生成防火墙规则与内核模块 netfilter 进行 “交流”,真正实现防火墙功能的是内核模块 netfilter。

firewalld 提供了两种管理模式:其一是 firewall-cmd 命令管理工具,其二是 firewall-config 图形化管理工具。在之前版本中的 iptables 将规则保存在文件 /etc/sysconfig/iptables 中,现在 firewalld 将配置文件保存在 /usr/lib/firewalld 和 /etc/firewalld 目录的 xml 文件中。

虽然 RHEL7 中将默认的防火墙管理工具从 iptables 换成了 firewalld,但在 RHEL7 中仍然可以使用 iptables 的,只需要通过 yum 命令进行安装启用 iptables 服务即可。换句话说,红帽将这个选择权交给了用户。

下面给出 RHEL7 的防火墙堆栈:

https://s1.ax1x.com/2023/04/04/pp44mB8.png

1、firewalld 命令行模式

区域选择

当前操作系统安装完成后,防火墙会设置一个默认区域,将接口加入到默认区域中。用户配置防火墙的第一步是获取默认区域并修改,关于操作如下:

查看当前系统中所有区域

1
firewall-cmd --get-zones

查看当前默认的区域

1
firewall-cmd --get-default-zone

查看当前已激活的区域

1
firewall-cmd --get-active-zones

获取接口 ens33 所属区域

1
firewall-cmd --get-zone-of-interface=ens33

修改接口所属区域

1
firewall-cmd --permanent --zone=internal --change-interface=ens33

firewalld 服务重载、重启、停止

重新加载防火墙配置

1
firewall-cmd --reload

重启防火墙 (redhat 系列)

1
systemctl restart firewalld.service

临时关闭防火墙

1
systemctl stop firewalld.service

开机启用防火墙

1
systemctl enable firewalld.service

开机禁止防火墙

1
systemctl disable firewalld.service

查看 firewalld 的运行状态

1
firewall-cmd --state

firewalld 开放端口(public)

公共区域设置开放 21 端口永久生效并写入配置文件(参数:–permanent)

1
2
#参数:--permanent,设置即立刻生效并且写入配置文件
firewall-cmd --zone=public --add-port=21/tcp --permanent

查询防火墙端口 21 是否开放

1
firewall-cmd --zone=public --query-port=21/tcp

移除开放的端口 21

1
firewall-cmd --zone=public --remove-port=21/tcp --permanent

区域规则修改

查询防火墙规则列表

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

新增一条区域规则 httpd 服务

1
firewall-cmd --permanent --zone=internal --add-service=http

验证规则

1
firewall-cmd  --zone=internal --list-all

2、firewalld 图形化界面

上面的简介也介绍到了 firewalld 提供了两种管理模式:其一是 firewall-cmd 命令管理工具,其二是 firewall-config 图形化管理工具。在之前版本中的 iptables 将规则保存在文件 /etc/sysconfig/iptables 中,现在 firewalld 将配置文件保存在 /usr/lib/firewalld/etc/firewalld 目录的 xml 文件中。

图形化界面中修改接口区域可以使用 NetworkManager,也可以使用 firewall-config 工具。NetworkManager 使用方法:打开终端执行命令 nm-connection-editor,如下图弹出对话框:

2.1、图形化界面 NetworkManager

终端执行:nm-connection-editor

2.2、图形化界面 firewall-config

终端执行:firewall-config

三、iptables 防火墙工具

1、安装 iptables

假如是 centos6,默认是安装了 iptables。
如果是 centos7 或者 Redhat7 系列,默认没有安装 iptables。你需要关闭默认启动的 firewalld,二选一即可。

临时关闭 firewalld

1
systemctl stop firewalld

开机禁用 firewalld

1
systemctl disable firewalld

开机启用 firewalld

1
systemctl enable firewalld

通过 yum 在线安装 iptables,检查是否安装了 iptables

1
2
systemctl status iptables.service
service iptables status

安装 iptables

1
yum -y install iptables

升级 iptables

1
yum update iptables

安装 iptables-services

1
yum -y install iptables-services.x86_64

设置 iptables 为开机自启

1
systemctl enable iptables.service

iptables 规则组成

  • ACCEPT (接收,允许通过)
  • DROP (丢弃数据包不做任何反馈)
  • REJECT (丢弃数据包,客户端有对应消息返回)

查询已经设置的规则:-L 命令

1
2
3
4
#一般配合-n命令使用
iptables -L
#不显示主机地址
iptables -nL

清除原来设置的规则:-F 命令

1
iptables -F

删除某一条已经设置的规则:-D 命令

1
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

2、应用场景

插入一些规则:-I 命令,放通 80、22、10~21(一段)这些端口

1
iptables -I INPUT -p tcp --dport 80 -j ACCEPT

设置某一个固定的 IP 访问 80 端口:-s 192.168.xxx.xxx

1
iptables -I INPUT -p tcp -s (你的IP地址) --dport 80 -j ACCEPT

ssh 远程连接本地服务器或者云服务器需要默认启用的端口

1
iptables -I INPUT -p tcp --dport 22 -j ACCEPT

设置 10~21 端口开放访问

1
iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT

设置 icmp 规则允许访问

1
iptables -I INPUT -p icmp -j ACCEPT

注意:允许本机可以访问本机,本机访问外网
解决本机可以访问本机(telnet 127.0.0.1 22),添加 - i lo(网卡)规则。

设置规则

1
iptables -I INPUT -i lo -p tcp  -j ACCEPT

本机测试访问外网

1
curl https://www.baidu.com

设置规则

1
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

在设置的最后追加一条规则:-A 命令
拒绝 xx 规则

1
iptables -A INPUT -j REJECT

场景二

ftp 主动模式下 iptables 的规则配置(不建议)
ftp 被动模式下 iptables 的规则配置(实际应用,推荐)

场景三

工作中的一些常用配置,设置好规则后保存到配置文件。chkconfig iptables on 设置开机启动规则。
snat(对原地址,发起地址)规则设置,dnat(目标地址,发往的地址)规则设置。

3、iptables 防攻击企业应用

iptables 防攻击企业应用 (根据实际业务设置)

  1. 利用 iptables 防 CC 攻击
  2. connlimit 模块
  3. 作用:用于限制每一个客户端 IP 的并发连接数。
  4. 参数: --connlimit-above n(次数),限制并发数

例如,限制次数为 100

1
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT

测试,限制某一固定 IP 并发次数

1
iptables -I INPUT -p tcp --dport 80 -s [ip地址] -m connlimit --connlimit-above 10 -j REJECT

4、limit 模块

作用: 限速,控制流量
例如

1
iptable -A INPUT -m limit --limit 3/hour

–limit-burst 5,默认值为 5

在设置最后追加一条过滤规则

1
iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT 

拒绝其它规则访问

1
iptables -A INPUT -p icmp -j DROP

设置完,测试接限制的 IP 地址:

1
2
#测试受限IP地址
ping 192.168.245.139

5、配置文件新增规则

文中介绍过 iptables 安装后的配置文件所在目录。

1
/etc/sysconfig/iptables

修改配置文件

1
vim  /etc/sysconfig/iptables

四、UFW 防火墙工具

Uncomplicated Firewall

简称 UFW,是 Ubuntu 系统上默认的防火墙组件。UFW 是为轻量化配置 iptables 而开发的一款工具。
UFW 提供一个非常友好的界面用于创建基于 IPV4,IPV6 的防火墙规则。UFW 在 Ubuntu 8.04 LTS 后的所有发行版中默认可用。
UFW 的图形用户界面叫 Gufw。

开启与关闭防火墙

开启防火墙

1
ufw enable

关闭防火墙

1
ufw disable

2、显示防火墙状态

1
ufw status

3、查看防火墙详细状态

1
ufw status verbose

4、允许与阻止

1
ufw allow

5、允许通过 21 连接端口使用 tcp 和 udp 协议连线本机

1
ufw allow 21

6、增加一条表示阻止的规则

1
ufw deny

阻止通过 21 连接端口使用 tcp 协议连线本机

1
ufw deny 21/tcp

7、增加一条表示拒绝的规则

1
ufw reject

8、以服务名称代表连接端口,可以采用

1
less /etc/services

——END——