百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

firewall-cmd 命令配置 firewall-cmd --permanent

sinye56 2024-12-17 16:08 9 浏览 0 评论

名词解释

在具体介绍 zone 之前,先给大家介绍几个相关的名词,因为如果不理解这几个名词 zone 就无从入手。

  • target:目标,可以理解为默认行为,有四个可选值:default、ACCEPT、REJECT、DROP,如果不设置默认为default
  • service:表示一个服务
  • port:端口,使用 port 可以不通过 service 而直接对端口进行设置
  • interface:接口,可以理解为网卡
  • source:源地址,可以是 ip 地址也可以是 ip 地址段
  • icmp-block:icmp 报文阻塞,可以按照 icmp 类型进行设置
  • masquerade:ip 地址伪装,也就是按照源网卡地址进行 NAT 转发
  • forward-port:端口转发
  • rule:自定义规则

哪个zone在起作用

我们知道每个 zone 就是一套规则集,但是有那么多 zone,对于一个具体的请求来说应该使用哪个zone(哪套规则)来处理呢?这个问题至关重要,如果这点不弄明白其他的都是空中楼阁,即使规则设置的再好,不知道怎样用、在哪里用也不行。

对于一个接受到的请求具体使用哪个 zone,firewalld 是通过三种方法来判断的:

1、source,也就是源地址

2、interface,接收请求的网卡

3、firewalld.conf 中配置的默认 zone

这三个的优先级按顺序依次降低,也就是说如果按照 source 可以找到就不会再按 interface去查找,如果前两个都找不到才会使用第三个,也就是讲过的在f irewalld.conf 中配置的默认 zone。

配置source

source 是在 zone 的 xml 文件中配置的,其格式为

<zone>
    <source address="address[/mask]"/>
</zone>

只要我们将 source 节点放入相应的 zone 配置文件中就可以了,节点的 address 属性就是源地址,不过我们要注意相同的 source 节点只可以在一个 zone 中进行配置,也就是说同一个源地址只能对于一个 zone,另外,直接编辑xml文件之后还需要reload才可以起作用。

另外,我们当然也可以使用 firewall-cmd 命令进行配置,这里主要有五个相关命令(参数)

firewall-cmd [--permanent] [--zone=zone] --list-sources
firewall-cmd [--permanent] [--zone=zone] --query-source=source[/mask]
firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask]
firewall-cmd [--zone=zone] --change-source=source[/mask]
firewall-cmd [--permanent] [--zone=zone] --remove-source=source[/mask]

分别来介绍一下

  • --list-sources:用于列出指定 zone 的所有绑定的 source 地址
  • --query-source:用于查询指定 zone 是否跟指定 source 地址进行了绑定
  • --add-source:用于将一个 source 地址绑定到指定的 zone
  • --change-source:用于改变 source 地址所绑定的 zone,如果原来没有绑定则进行绑定,这样就跟 --add-source 的作用一样了
  • --remove-source:用于删除 source 地址跟 zone 的绑定

可以看到上面的命令中有两个可选参数:--permanent 和 --zone,--permanent 表示是否存储到配置文件中(如果存储到配置文件中这不会立即生效),--zone 用于指定所要设置的zone,如果不指定则使用默认 zone。

[root@OpsNote ~]# firewall-cmd --zone=drop --list-all
drop
  interfaces: 
  sources: 
  services: 
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules:     
[root@OpsNote ~]# firewall-cmd --zone=drop --add-source=1.2.3.5
success
[root@OpsNote ~]# firewall-cmd --zone=drop --list-all
drop
  interfaces: 
  sources: 1.2.3.5
  services: 
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
[root@OpsNote ~]# 


将 1.2.3.5 绑定到 drop 这个 zone 中,所有来自 1.2.3.5 这个 ip 的连接将会被 drop 。

配置interface

相关的 firewall-cmd 命令为

firewall-cmd [--permanent] [--zone=zone] --list-interfaces
firewall-cmd [--permanent] [--zone=zone] --add-interface=interface
firewall-cmd [--zone=zone] --change-interface=interface
firewall-cmd [--permanent] [--zone=zone] --query-interface=interface
firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface

可以在网卡配置文件中进行配置,比如可以在/etc/sysconfig/network-scripts/ifcfg-eno16777728 文件中添加下面的配置

ZONE=public

这行配置就相当于下面的命令

[root@OpsNote ~]# firewall-cmd --zone=public --change-interface=eno16777728

这样配置之后来自 eno16777728 的连接就会使用 public 这个 zone 进行管理(如果source匹配了其他的 zone 除外)。

配置默认zone

默认 zon e的配置是通过 firewalld.conf 配置文件的 DefaultZone 配置项来配置的,当然也可以使用firewall-cmd命令来配置,通过 --get-default-zone 来获取默认zone的值

[root@OpsNote ~]# firewall-cmd --get-default-zone 
public
[root@OpsNote ~]# firewall-cmd --set-default-zone=internal 
success
[root@OpsNote ~]# firewall-cmd --get-default-zone 
internal
[root@OpsNote ~]# 

使用下面的命令来查看当前所有起作用的zone

[root@OpsNote ~]# firewall-cmd --get-active-zones 
drop
  sources: 1.2.3.5
internal
  interfaces: eno16777728
[root@OpsNote ~]# firewall-cmd --zone=drop --remove-source=1.2.3.5
success
[root@OpsNote ~]# firewall-cmd --get-active-zones 
internal
  interfaces: eno16777728
[root@OpsNote ~]# 

firewalld 还给我们提供了反向查询的命令,也就是根据 source 或者 interface 查询所对应的 zone,其命令如下

firewall-cmd --get-zone-of-interface=interface
firewall-cmd --get-zone-of-source=source[/mask]


zone 规则配置

target

zone 规则中首先最重要的是 target 的设置,他默认可以取四个值:default、ACCEPT、REJECT、DROP,firewall-cmd 命令如下

firewall-cmd --permanent [--zone=zone] --get-target
firewall-cmd --permanent [--zone=zone] --set-target=target

这里的--permanent不是可选的,也就是说使用firewall-cmd命令也不可以让他直接生效,也需要reload才可以。

service

配置命令为

firewall-cmd [--permanent] [--zone=zone] --list-services
firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-service=service
firewall-cmd [--permanent] [--zone=zone] --query-service=service

具体每个命令的含义大家对照上面的 source 很容易就理解了,--add 命令中多了一个--timeout选项

--add-service中的--timeout的含义是这样的:添加一个服务,但是不是一直生效而是生效一段时间,过期之后自动删除。

这个选项非常有用,比如我们想暂时开放一个端口进行一些特殊的操作(比如远程调试),等处理完成后再关闭,不过有时候我们处理完之后就忘记关闭了,而现在的 --timeout 选项就可以帮我们很好地解决这个问题,我们在打开的时候就可以直接设置一个时间,到时间之后他自动就可以关闭了。--timeout 和 --permanent 是不可以一起使用的。

port

配置命令为

firewall-cmd [--permanent] [--zone=zone] --list-ports
firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol
firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid]/protocol

icmp-block

icmp-block 是按照 icmp 的类型进行设置阻塞,比如我们不想接受 ping 报文就可以使用下面的命令来设置

[root@OpsNote ~]# firewall-cmd --add-icmp-block=echo-request

相应操作命令

firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks
firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype
firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype

masquerade

masquerade 大家应该都比较熟悉,其作用就是ip地址伪装,也就是NAT转发中的一种,具体处理方式是将接收到的请求的源地址设置为转发请求网卡的地址,这在路由器等相关设备中非常重要,比如大家很多都使用的是路由器连接的局域网,而想上互联网就得将我们的ip地址给修改一下,要不大家都是192.168.1.XXX的内网地址,那请求怎么能正确返回呢?所以在路由器中将请求实际发送到互联网的时候就会将请求的源地址设置为路由器的外网地址,这样请求就能正确地返回给路由器了,然后路由器再根据记录返回给我们发送请求的主机了,这就是 masquerade。

操作命令为

firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-masquerade
firewall-cmd [--permanent] [--zone=zone] --query-masquerade

forward-port

进行端口转发,比如我们要将在80端口接收到tcp请求转发到8080端口可以使用下面的命令

[root@OpsNote ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
success
[root@OpsNote ~]#

forward-port 还支持范围转发,比如我们还可以将80到85端口的所有请求都转发到8080端口,这时只需要将上面命令中的 port 修改为80-85即可。

相关操作命令如下

firewall-cmd [--permanent] [--zone=zone] --list-forward-ports
firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]][--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]

rule

rule 的操作命令如下

firewall-cmd [--permanent] [--zone=zone] --list-rich-rules
firewall-cmd [--permanent] [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-rich-rule='rule'
firewall-cmd [--permanent] [--zone=zone] --query-rich-rule='rule'

这里的参数 'rule' 代表一条规则语句,比如要设置地址为1.2.3.4的source就可以写成source address="1.2.3.4",也就是直接写标签名,然后跟着写属性就可以了,我们来看个例子

[root@OpsNote ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'


这条规则就会将1.2.3.4这个源地址的连接全部给drop掉。

使用rule结合--timeout我们可以实现一些非常好玩和有用的功能,比如我们可以写个自动化脚本,当发现有异常的连接时就可以添加一条rule将其相应的地址drop掉,而且还可以使用--timeout给设置个时间段,过了之后再自动开放!

实验

1.网站服务器环境的搭建

(1)验证firewalld在网站服务器上是否启动并且正常运行

[root@web ~]# systemctl status firewalld

(2)安装httpd和mod_ssl软件包

[root@web ~]# yum install -y httpd mod_ssl

(3)启用并启动httpd服务

[root@web ~]# systemctl start httpd

[root@web ~]# systemctl enable httpd

(4)创建网站首页测试页index.html

[root@web ~]# vi /var/www/html/index.html

test web

(5)更改ssh的监听端口,并重启服务,关闭SELinux

[root@web ~]# setenforce 0

[root@web ~]# vi /etc/ssh/sshd_config

Port 12345

[root@web ~]# systemctl restart sshd

2.在网站服务器上配置firewalld防火墙

(1)设置默认区域为dmz区域

[root@web ~]# firewall-cmd --set-default-zone=dmz

(2)为dmz区域打开https服务并添加TCP的12345端口

[root@web ~]# firewall-cmd --zone=dmz --add-service=https --permanent

[root@web ~]# firewall-cmd --zone=dmz --add-port=12345/tcp --permanent

(3)禁止ping

[root@web ~]# firewall-cmd --add-icmp-block=echo-request --zone=dmz --permanent

(4)因为预定于的ssh服务已经更改了端口,所以要将预定于ssh服务移除

[root@web ~]# firewall-cmd --zone=dmz --remove-service=ssh --permanent

(5)重新加载firewalld配置。并查看之前的配置

[root@web ~]# firewall-cmd --reload

[root@web ~]# firewall-cmd --list-all

dmz (active)

target: default

icmp-block-inversion: no

interfaces: eth0

sources:

services: https

ports: 12345/tcp

protocols:

masquerade: no

forward-ports:

sourceports:

icmp-blocks: echo-request

rich rules:

3.在网关服务器上配置firewalld防火墙

(1)验证firewalld在网关服务器上是否启动并且正在运行

[root@gateway-server ~]# systemctl status firewalld

(2)设置默认区域为external区域,并查看配置结果

[root@gateway-server ~]# firewall-cmd --set-default-zone=external

[root@gateway-server ~]# firewall-cmd --list-all

external (active)

target: default

icmp-block-inversion: no

interfaces: eth0 eth1 eth2

sources:

services: ssh

ports:

protocols:

masquerade: yes

forward-ports:

sourceports:

icmp-blocks:

rich rules:

(3)将eth1网卡配置到trusted区域,将eth2配置到dmz区域

[root@gateway-server ~]# firewall-cmd --change-interface=eth1 --zone=trusted

[root@gateway-server ~]# firewall-cmd --change-interface=eth2 --zone=dmz

(4)查看配置情况

[root@gateway-server ~]# firewall-cmd --get-active-zone

dmz

interfaces: eth2

external

interfaces: eth0

trusted

interfaces: eth1

(5)在企业内网测试计算机上访问网站服务器

https:192.168.2.10

(6)关闭SELinux,更改ssh的监听端口,并重启服务

[root@gateway-server ~]# setenforce 0

[root@gateway-server ~]# vi /etc/ssh/sshd_config

Port 12345

[root@gateway-server ~]# systemctl restart sshd

(7)配置external区域添加TCP的12345端口

[root@gateway-server ~]# firewall-cmd --zone=external --add-port=12345/tcp --permanent

(8)配置external区域移除ssh服务

[root@gateway-server ~]# firewall-cmd --zone=external --remove-service=ssh --permanent

(9)配置external区域禁止ping

[root@gateway-server ~]# firewall-cmd --zone=external --add-icmp-block=echo-request --permanent

(10)重新加载防火墙配置

[root@gateway-server ~]# firewall-cmd --reload

(11)在互联网测试机上通过ssh登录网关

[root@localhost ~]# ssh -p 12345 100.1.1.10

(12)在企业内网测试机上ssh登录web网站服务器的12345端口

[root@localhost ~]# ssh -p 12345 192.168.2.10

4.配置IP伪装与端口转发


内网用户通过网关服务器共享上网

(1)外网测试机搭建网站服务,并添加测试网页

[root@localhost ~]# hostname internet

[root@localhost ~]# bash

[root@internet ~]# yum install -y httpd

[root@internet ~]# vi /var/www/html/index.html

internet web

[root@internet ~]# systemctl enable httpd

[root@internet ~]# systemctl start httpd

(2)在企业内网测试机上访问外网网站,结果是可以访问的

http://100.1.1.20

(3)在dmz的网站服务器上测试,同样可以访问

http://100.1.1.20

(4)查看网关服务器的external区域是否开启了地址伪装

[root@internet ~]# firewall-cmd --list-all --zone=external

external

target: default

icmp-block-inversion: no

interfaces:

sources:

services: ssh

ports:

protocols:

masquerade: yes

forward-ports:

sourceports:

icmp-blocks:

rich rules:

(5)源地址192.168.1.0/24网段的地址开启IP伪装

在网关服务器上关闭external的地址伪装,添加富规则,要求external区域内源地址为192。168.1.0/24网段的地址开启地址IP伪装

[root@gateway-server ~]# firewall-cmd --remove-masquerade --zone=external

[root@gateway-server ~]# firewall-cmd --zone=external --add-rich='rule family=ipv4 source address=192.168.1.0/24 masquerade'

(6)在dmz的网站服务器上测试访问外网,应该不能访问外网

http://100.1.120

5.配置端口转发实现互联网用户访问内部web服务器

(1)在网关服务器上配置端口转发

[root@gateway-server ~]# firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toaddr=192.168.2.10

(2)在互联网测试机上访问内部web服务器,可以访问成功

http://100.1.1.10

(3)端口转发也可以使用富规则,这样就可以更大程度的控制端口转发规则,如给内网的web服务器申请类=了一个新的公网ip地址100.1.1.15,需要将新的公网地址100.1.1.15配置在网关服务器的外网接口eth0上,作为第二个Ip地址

firewall-cmd --zone=external --add-rich-rule="rule2 family="ipv4" source address="192.168.2.0/24" masquerade"

[root@gateway-server ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet

BOOTPROTO=static

NAME=eth0

DEVICE=eth0

ONBOOT=yes

IPADDR1=100.1.1.15

PREFIX1=24

IPADDR0=100.1.1.10

PREFIX=24

[root@gateway-server ~]# systemctl restart NetworkManager

[root@gateway-server ~]# ip add

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:ae:7f:64 brd ff:ff:ff:ff:ff:ff

inet 100.1.1.10/8 brd 100.255.255.255 scope global eth0

valid_lft forever preferred_lft forever

inet 100.1.1.15/24 brd 100.1.1.255 scope global eth0

valid_lft forever preferred_lft forever

使用富规则配置端口转发

[root@gateway-server ~]# firewall-cmd --zone=external --add-rich-rule='rule family=ipv4 destination address=100.1.1.15/32 forward-port port=443 protocol=tcp to-addr=192.168.2.10'

在互联网测试机上访问,可以访问成功

http://10.1.1.15

本文转自:https://www.cnblogs.com/-xuan/p/10640241.html

相关推荐

一个不错的软件版本命名规范!

之前写了一篇如何自动生成版本号的文章,《让你的C程序,自动打印版本信息》初衷是让自己的程序在运行时自动打印与版本相关的信息,避免测试时因为版本信息不确定导致的一些功能对应不上去的问题,当时留了一个坑,...

国产操作系统迎来发展风口 公务领域更能培育起Linux生态

谷歌和微软在俄罗斯市场的一番套路猛如虎,就让我们深刻地意识到了,只有自己的东西才能靠得住。也由此,国内操作系统发展迎来了发展风口。我就看到有朋友就秀出了他们单位采购的纯国产的主机,一款华为的主机,纯国...

5个大有“前途”的Linux桌面发行版本

ZD至顶网CIO与应用频道08月27日专栏:Linux无处不在。你的服务器里,你的电话、汽车、手表、烤面包机、冰箱……和台式机里都有Linux的身影。虽然在桌面上见到Linux的用户比在自动调温...

Linux 常用应用软件大全

编译自:https://www.fossmint.com/most-used-linux-applications/作者:MartinsD.Okoi译者:HankChow对于许多应用程序...

Linux 4.1 系列的最大版本 4.1.18 LTS发布,带来大量修改

(LCTT译注:这是一则过期的消息,但是为了披露更新内容,还是发布出来给大家参考)著名的内核维护者GregKroah-Hartman貌似正在度假中,因为SashaLevin2016年2月16日的...

Linux发行版需要杀软吗?卡巴斯基推出免费KVRT病毒扫描清理工具

IT之家6月4日消息,你认为使用Linux发行版,需要杀毒软件吗?或许很多用户认为Linux发行版偏小众,因此受到黑客攻击的风险也相对较小,不过卡巴斯基并不这么认为,近期推出了适用于...

适合开发人员的 5款 Linux 发行版

什么是Linux?Linux是基于Unix的操作系统。由LinusTorvalds开发于1991年首次发布其内核。因为Linux是开源软件,其发行版由不同组织发布,因此不同的发行版具有不同的风格...

VMware Workstation 17.0 Pro 发布:新增 TPM 2.0 完美兼容Win11

IT之家11月18日消息,VMwareWorkstation17.0Pro现已发布,它带来了许多新特性,例如微软Windows11硬性要求:虚拟可信平台模块(TPM)2.0。...

你是否需要一个容器专用的Linux发行版本?

单单使用容器是不够的,提供商们认为你需要一个容器专用的Linux发行版本。我们可以让容器在不同的操作系统上运行,不同的操作系统都有自己的虚拟化服务,如:SolarisZones、BSDJails、...

Tizen 3.0版本发布 采用Linux 4.1内核

2015-09-2111:31:39作者:马荣【中关村在线软件资讯】9月21日消息:尽管三星靠着Android系统设备在移动市场赚钱,但是仍然没有忘记自家的Tizen开发。现在Tizen3.0版...

欧拉操作系统演进:应用累计超130万套 支持鲲鹏、英特尔、飞腾等芯片

21世纪经济报道记者倪雨晴深圳报道4月15日,在欧拉开发者大会(openEulerDeveloperDay2022)的主论坛上,欧拉首个数字基础设施全场景长周期版openEuler22.03...

Papyros:以Material Design为灵感的Linux发行版本

项目团队并不希望只是采用传统的桌面主题,而是致敬谷歌Android系统的MaterialDesign设计语言想要打造出某些不同以往足够吸引用户的Linux发行版本,自然该版本还在不断的更新和改进中,...

比特网早报:全国空间计量技术委员会成立,银河麒麟操作系统上架微信Linux4.0.0版本

2024年11月6日消息,昨夜今晨,科技圈都发生了哪些大事?行业大咖抛出了哪些新的观点?比特网为您带来值得关注的科技资讯:全国空间计量技术委员会在北京成立近日,经市场监管总局批准,全国空间计量技术委员...

2024年最稳定的5个Linux发行版,赶紧收藏!

Linux是最流行的免费开源平台之一。Linux已被广泛使用,因为它安全、可扩展和灵活。Linux发行版收集开源代码,对其进行编译,并将其组合成一个可以轻松启动和安装的操作系统。它们还提供不同的...

彰显Linux生态繁华,Ubuntu、Fedora等四发行版同时发布新版本

上周对于开源社区来说是忙碌的一周。EndeavourOS和TrueNASScale于周二(4月16日)发布,Fedora于周三(4月17日)发布,Ubuntu于周四(4月18日)发布。四个新版本中都...

取消回复欢迎 发表评论: