slacr_

Just to record my life and thoughts.
笔记/编程/杂乱/极简

[Linux]Iptables与Firewalld防火墙

Oct 6, 2023Linux4092 words in 27 min

防火墙管理工具

防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。这样一来,就能够保证仅有合法的流量在企业内网和外部公网之间流动了。

从RHEL7系统开始,firewalld防火墙正式取代了iptables防火墙

ptables与firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,或者说,它们只是一种服务。iptables服务会把配置好的防火墙策略交由内核层面的netfiter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。换句话说,当前在Linux系统中其实存在多个防火墙管理工具,旨在方便运维人员管理Linux系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。

Iptables

在早期的Linux系统中,默认使用的是iptables防火墙管理服务来配置防火墙。尽管新型的firewalld防火墙管理服务已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因
而继续使用iptables。

策略与规则链

防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。
iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类:

  • 在进行路由选择前处理数据包(PREROUTING)
  • 处理流入的数据包(INPUT);
  • 处理流出的数据包(OUTPUT);
  • 处理转发的数据包(FORWARD);
  • 在进行路由选择后处理数据包(POSTROUTING)。

基本命令参数

iptables是一款基于命令行的防火墙策略管理工具,具有大量参数
根据OSI七层模型的定义,iptables属于是数据链路层的服务,所以可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功,iptables就会根据策略规则所预设的动作来处理这些流量。
防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。
防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
iptables -F # 清空防火墙规则链

iptables -L # 查看

# 把INPUT 规则链的默认策略设置为 DROP 拒绝, ping将永远接受不到返回报文
iptables -P INPUT DROP

# 向INPUT 链中添加允许ICMP 流量进入的策略规则
iptables -I INPUT -p icmp -j ACCEPT
ping -c 4 192.168.68.198
# 可以正常使用

iptables -D INPUT 1 # 删除INPUT规则链第一条
iptables -P INPUT ACCEPT # INPUT 策略改为ACCEPT

  • 将INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝来自其他所有主机的流量。

我们先清空Iptables, 此时win11, centos7 都能正常ssh连接, 因为默认策略是全部ACCEPT
centos: 192.168.248.151
rhel: 192.168.248.153
win11: 192.168.248.1

注意VMware网络NAT模式主机得到的是虚拟网卡8的内网IP

三个设备组成逻辑上的局域网, 都是同一虚拟的DHCP服务器分配的地址.

添加两条防火墙规则

1
2
3
iptables -I INPUT -s 192.168.248.1. -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.248.151 -p tcp --dport 22 -j REJECT
# 允许win, 拒绝centos


1
2
# 允许所有源地址192.168.248网段, -I insert会放在最上, 优先级更高
iptables -I INPUT -s 192.168.248.0/24 -p tcp --dport 22 -j ACCEPT

bogon是本网络

此时centos又可以正常送达ssh报文了

1
2
3
4
5
6
7
8
9
10
11
12
# 向INPUT 规则链中添加拒绝所有人访问本机12345端口的策略规划
iptables -I INPUT -p tcp --dport 12345 -j REJECT
iptables -I INPUT -p udp --dport 12345 -j REJECT


# 拒绝访问本机80 端口
iptables -I INPUT -p tcp -s 192.168.248.1 --dport 80 -j REJECT

# 拒绝访问 1000-1024端口
iptables -A INPUT tcp --dport 1000:1024 -j REJECT
iptables -A INPIT udp --dport 1000:1024 -j REJECT

使用iptables命令配置的防火墙规则默认会在系统下一次重启时失效,如果想让配置的防火墙策略永久生效,还要执行保存命令

1
2
3
4
iptables-save

# RHEL5/6/7版本
# service iptables save

Firewalld

RHEL8系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems)服务是默认的防火墙配置管理工具,也叫Linux系统的动态防火墙管理器,它拥有基于CUI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。
相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。

终端管理工具

命令行终端是一种极富效率的工作方式,firewall-cmd是firewalld防火墙配置管理工具的CLI命令行界面版本。它的参数一般都是以“长格式”来提供的, REHL8 支持部分命令参数补齐.

用firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。如果想让配置策略一直存在,需要使用永久(Permanent)模式,在用firewall-cmd命令正常设置防火墙策略时添加-permanent参数,它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立即生效,需要手动执行firewall-cmd --reload命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 查看 firewalld 服务当前所使用的 zone
firewall-cmd --get-default-zone

# 查询指定网卡在firewalld 服务中绑定的区域
firewall-cmd --get-zone-of-interface=ens160

# 网卡默认区域修改为external, 重启后生效.
firewall-cmd --permanent --zone=external --change-interface=ens160
firewall-cmd --permanent --get-zone-of-interface=ens160

# 把firewalld 服务的默认区域设置为public
# 默认区域也叫全局配置,指的是对所有网卡都生效的配置,优先级较低.
firewall-cmd --set-default-zone=public

# 启动和关闭firewalld 防火墙服务的应急状况模式
firewall-cmd --panic-on
firewall-cmd --panic-off

# 查询ssh和https 协议的流量是否允许放行
firewall-cmd --zone=public --query-service=ssh
firewall-cmd --zone=public --query-service=https
# 虽然工作中可以不使用“-zone”参数指定区域名称,firewall-cmd命令会自动依据默认区域进行查询,减少用户输入量。但如果默认区域与网卡所绑定的不一致时,就会发生冲突的情况,因此规范写法一定要加.

# 把https 协议的流量设置为永久允许放行, 并立即生效
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --zone=public --query-service=https # no
firewall-cnd --reload
firewall-cmd --zone=public --query-service=https # yes

# 把http 协议的流量设置为永久拒绝, 并立即生效
firewall-cmd --permanent --zone=public --remove-service=http
firewall-cmd --reload
firewall-cmd --zone=public --query-service=http

# 把访问 8080 和 8081 端口的流量策略设置为允许, 仅限当前生效
firewall-cmd --zone=public --add-port=8080-8081/tcp
firewall-cmd --zone=public --list-ports

# 显示所有规则
firewall-cmd --list-all
  • 把原本访问本机888 端口的流量转发到22 端口, 且要求当前和长期有效
1
2
3
4
5
6
7
8
# 查看当前系统上所有接口和它们所属的防火墙区域的列表。每个接口都可能属于一个或多个区域。
firewall-cmd --get-active-zones
# 把之前配置ens160 external 的zone改回来
firewall-cmd --permanent --zone=public --change-interface=ens160

firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.134.128
firewall-cmd --reload
firewall-cmd --list-all

  • 富规则的设置
    富规则也叫复规则。表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高.
1
2
3
4
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='192.168.134.0/24' service name='ssh' reject"
firewall-cmd --reload
firewall-cmd --list-all

图形管理工具

1
dnf install firewall-config

  • 当前区域允许放行http流量

  • 永久放行tcp 8080-8888

reload 立即生效

SNAT(Source Network Address Translation)源网络地址转换, 是一种为了解决IP地址匮乏而设计的技术,它可以使得多个内网中的用户通过同一个外网IP接入Internet。

  • 开启防火墙SNAT

等同于

1
sudo firewall-cmd --permanent --zone=public --add-masquerade

虚拟机开启这个没什么用, 用来给网关服务器实现NAT

  • 本地端口转发(Port Forwarding)

  • 富规则(Rich Rule)

  • 把网卡与防火墙策略区域进行绑定

服务的访问控制列表

TCP Wrappers是RHEL 6/7系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作,当前8版本中已经被Firewalld正式替代。换句话说,Linux系统中其实有两个层面的防火墙,第一种是前面讲到的基于TCP/IP协议的流量过滤工具,而TCP Wrappers服务则是能允许或禁止Linux系统提供服务防火墙,从而在更高层面保护了Linux系统的安全运行。

TCP Wrappers服务的防火墙策略由两个控制列表文件所控制,用户可以编辑允许控制列表文件来放行对服务的请求流量,也可以编辑拒绝控制列表文件来阻止对服务的请求流量。控制列表文件修改后会立即生效,系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量.

Cockpit驾驶舱管理工具

Cockpit是一个基于网页的图形化工具,天然具备很好的跨平台性,被广泛使用于服务器、容器、虚拟机等等多种管理场景,即便是新手都可以直接上手操作。红帽公司对Cockpit十分的看重,从最开始就默认安装到了RHEL8系统中,衍生的CentOS和Fedora也都是标配它。

1
2
3
4
5
dnf install cockpit
# 开启并添加启动项
systemctl start cockpit
systemctl enable cockpit.socket

访问localhost:9090

其他

WMware网络配置的三种模式

在 VMware 中,有三种常见的网络配置模式:NAT(网络地址转换)、桥接和主机模式。下面是它们的区别:

  1. NAT(网络地址转换)模式:
  • 在 NAT 模式下,虚拟机使用主机的 IP 地址进行网络访问。
  • 主机充当网络的 NAT(网络地址转换)设备,将虚拟机的网络流量转发到外部网络。
  • 虚拟机可以访问外部网络,但外部网络无法直接访问虚拟机。
  • 这种模式适用于需要虚拟机访问外部网络,但不需要外部网络直接访问虚拟机的情况,如浏览器测试环境。
  1. 桥接模式:
  • 在桥接模式下,虚拟机与主机和其他物理设备连接到同一网络中。
  • 虚拟机会获得一个与主机在同一物理网络中的 IP 地址。
  • 虚拟机可以直接与外部网络以及其他与主机连接到同一网络的设备进行通信。
  • 桥接模式提供了虚拟机与外部网络间的透明连接,就像虚拟机是直接连接到外部网络中一样。
  1. 主机模式:
  • 在主机模式下,虚拟机与主机之间建立一个专用的内部网络。
  • 虚拟机和主机之间可以进行双向通信,但虚拟机无法与外部网络或其他主机进行通信。
  • 这种模式适用于在虚拟机和主机之间进行内部测试或开发的情况。

总结来说,NAT 模式使虚拟机可以通过主机访问外部网络,但外部网络无法直接访问虚拟机。桥接模式将虚拟机连接到与主机相同的物理网络,并允许虚拟机直接与外部网络和其他设备通信。主机模式创建一个专用的内部网络,只允许虚拟机与主机进行通信。

VMware四种虚拟磁盘

有四种常见的虚拟磁盘类型可供选择:

IDE磁盘:IDE(Integrated Drive Electronics)磁盘是一种传统的虚拟磁盘类型,模拟了IDE接口的硬盘。它是旧版VMware虚拟机的默认磁盘类型。

SCSI磁盘:SCSI(Small Computer System Interface)磁盘是一种高性能的虚拟磁盘类型。它使用虚拟的SCSI控制器与虚拟机进行通信,并提供更好的性能和可靠性。SCSI磁盘通常用于需要更高磁盘性能的虚拟机。

SATA磁盘:SATA(Serial Advanced Technology Attachment)磁盘是一种低成本的虚拟磁盘类型,模拟了SATA接口的硬盘。它在性能上不如SCSI磁盘,但适用于需要大容量存储而不需要高性能的虚拟机。

NVMe磁盘:NVMe(Non-Volatile Memory Express)磁盘是一种高性能的虚拟磁盘类型,用于虚拟机中对存储性能有极高要求的工作负载。NVMe磁盘利用了新一代的非易失性存储技术,提供了更低的延迟和更高的吞吐量。

参考

  1. Linux就该这么学
  2. [鸟哥linux基础学习篇4th]
  3. linux命令
  4. 开源许可证总览
  5. LSB标准
  6. 硬盘结构
  7. RHCSA学习
  8. RHEL订阅
  9. 如何在 RHEL 9 上创建本地 Yum/DNF 仓库
  10. VDO github地址
  11. RHEL9 VDO文档
  12. Fedora官方下载
  13. FedoraProject镜像
  14. initroot
  • Author:

    slacr_

  • Copyright:

  • Published:

    October 6, 2023

  • Updated:

    October 6, 2023

Buy me a cup of coffee ☕.

1000000