在安装docker配置端口时 centos7 防火墙规则失效

一、问题

1、做端口映射管理的时候,自己关闭了防火墙,或者开启防火墙,或者指定开关端口,但是都不影响端口的使用,这就很奇怪,也就是本文的内容!

2、思路,确认是请求到了防火墙的那个zone(centos7之后默认使用firewalld,里面提出了zone),可能存在较大的原因是:设置的zone和网口的不一致,对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:

  • source,也就是源地址
  • interface,接收请求的网卡
  • firewalld.conf中配置的默认zone

这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,具体内容可以看 用活firewalld防火墙中的zone

iptables 与 firewalld 都不是真正的防火墙, 它们都只是用来定义防火墙策略的防火墙管理工具。

二、解决

1、如果你没有使用docker,那么只需要了解自己正在使用的网口的zone规则是否设置的一致即可。比如你增加zone=public的规则开放 8083端口,如下

firewall-cmd --zone=public --add-port=3306/tcp --permanent

但是你的网口使用的zone是 abc,而不是public ,那么你修改public的端口规则,永远都无法使网口生效

2、首先安装好docker后会多出来一块网卡叫做docker0,与容器进行互联,运行一个镜像都会开启一个容器,一个镜像可以运行多次,每当运行后都会产生新的ip地址新的配置参数,生成ip地址后,宿主机会多一块vethxxx的网卡,vethxxx的网卡连接docker容器中的ip地址和docker网桥,docker网桥再连接宿主的docker0网卡,当docker容器需要上网时,docker0网卡就会与宿主机网卡ens33或者其他的网卡接口进行内核转发实现nat地址转换,最终由eth网卡去访问互联网,最后依次返回

其中的 br-e90ca82059c1 是内网地址,你可以看成后续图片中的 eth0

在这里插入图片描述
在这里插入图片描述

3、如果设置内核转发参数为0,则docker容器无法上网,即/proc/sys/net/ipv4/ip_forward的内容为1才可以上网

/proc/sys/net/ipv4/ip_forward

在这里插入图片描述

2.1、第一步,查看正在使用的是那个网口

1、先使用 ip addr 查看自己有那些网口,再挨个确认,但是一般名称都是好找到,而且自己接的那个网口,自己应该知道,再使用 ethtool 网口名称命令确认

# ethtool 网口名称
ethtool ens33

在这里插入图片描述

2.2、查看上一步的网卡指定了防火墙的那个 zone

有两种方式查看命令和配置文件

2.2.1、通过命令 firewall-cmd --get-active-zones

  • 通过命令 firewall-cmd --get-active-zones 可以查询到 所有活动的zone,但是如果你的网口没有指定zone,则public就是默认的
    在这里插入图片描述

2.2.2、通过配置文件

  • 比如,我这里就是 ifcfg-ens33,可以查看到,我在配置文件中没有指定
    在这里插入图片描述
    在这里插入图片描述

2.2.3、如果不在配置文件中指定zone,会出现的问题

1、而这样不在配置文件中指定,会导致后续的问题 ,比如 docker 会再起一个,网口,使用名称为 docker 的配置防火墙规则,你如果一直在zone为public上面设置,则永远不会生效。这也是我遇到的问题

在这里插入图片描述
2、并且docker会无视防火墙firewalld ,其原因是:其实docker并不是绕过了防火墙,只是因为它往iptables里写了规则,你在firewalld里看不到而已。(centos7系统既有iptables,也有firewalld)

3、在docker安装完后,会接管iptables,只要你docker run的时候加入参数,他会自动向iptables里面添加规则。所以使用 -p 容器端口:主机端口,最终会在iptables中添加上容器的端口

4、所以一旦docker没有使用public的zone,使用的是自己生成的docker名称的zone,那么你在 firewalld中是看不到的,比如我已经跑了很多容器,但是查看docker的zone还是没有端口暴露出来

在这里插入图片描述
5、使用 iptables 的命令可以查看到docker 容器的端口,因为docker是通过iptable 来修改防火墙规则的,我们每创建一个容器,docker 都会修改iptable,使其生效

iptables -L DOCKER

在这里插入图片描述

三、防火墙基础知识 (转载)

1、原文地址 如何在 Linux 中配置 firewalld 规则

“firewalld” 是 firewall daemon。它提供了一个动态管理的防火墙,带有一个非常强大的过滤系统,称为 Netfilter,由 Linux 内核…

3.1、什么是 FirewallD

“firewalld” 是 firewall daemon。它提供了一个动态管理的防火墙,带有一个非常强大的过滤系统,称为 Netfilter,由 Linux 内核提供。

FirewallD 使用 zones 和 services 的概念,而 iptables 使用 chain 和 rules。与 iptables 相比,“FirewallD” 提供了一种非常灵活的方式来处理防火墙管理。

每个 zones 都可以按照指定的标准进行配置,以根据你的要求接受或拒绝某些服务或端口,并且它可以与一个或多个网络接口相关联。默认区域为 public 区域。 以下命令列出 FirewallD 提供的 zones。运行以下命令以列出 zones:

[root@server1 ~] firewall-cmd --get-zones
block dmz drop external home internal public trusted work
  • block: 对于 IPv4,任何传入连接都会被 icmp-host-prohibited 消息拒绝,对于 IPv6 则是 icmp6-adm-prohibited。
  • dmz: 应用于你的 DMZ 区域的计算机,这些计算机可公开访问,但对内部网络的访问受到限制。仅接受选定的传入连接。
  • drop: 任何传入连接都将在没有任何通知的情况下被丢弃。只允许传出连接。
  • external: 用于在系统中充当路由器时启用 NAT 伪装的外部网络。只允许选定的传入连接。
  • home: 用于家庭网络。仅接受选定的传入连接。
  • internal: 用于内部网络,网络上的其他系统通常是可信任的。仅接受选定的传入连接。
  • public: 用于公共区域,仅接受选定的传入连接。
  • trusted: 接受所有网络连接。
  • work: 用于工作区域,同一网络上的其他计算机大多受信任。仅接受选定的传入连接。

3.2、Firewalld services

Firewalld 的 service 配置是预定义的服务。要列出可用的服务模块,请运行以下命令:

[root@server1 ~] firewall-cmd --get-services

3.3、Firewalld 的临时设置和永久设置

Firewalld 使用两个独立的配置,即临时设置和永久设置:

  • 临时设置: 临时设置不会在系统重启时保持不变。这意味着临时设置不会自动保存到永久设置中。
  • 永久设置: 永久设置会存储在配置文件中,将在每次重新启动时加载并成为新的临时设置。

3.4、启用、禁用 Firewalld

Firewalld 默认安装在 Centos7/8 中,下面命令时如何启用或者停用 firewalld:

# 启用Firewalld
[root@server1 ~] systemctl start firewalld
# 禁用Firewalld
[root@server1 ~] systemctl stop firewalld
# 开机启动
[root@server1 ~] systemctl enable firewlald
# 禁止开机启动
[root@server1 ~] systemctl disable firewalld

查看 firewlald 的状态:

[root@server1 ~] systemctl status firewalld
或者
[root@server1 ~] firewall-cmd --state
running

3.5、zone 管理

Firewalld 为每个区域提供不同级别的安全性,公共区域设置为默认区域。下面命令查看默认区域:

[root@server1 ~] firewall-cmd --get-default-zone 
public

下面命令查看默认区域的配置:

[root@server1 ~] firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client ntp ssh
  ports: 2222/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

通过使用选项 "–zone”和 “–change-interface” 的组合,可以轻松更改 zone 中的接口。例如,要将 “ens33” 接口分配给 “home” 区域,请运行以下命令:

[root@server1 ~] firewall-cmd --zone=home --change-interface=ens33
success
[root@server1 ~] firewall-cmd --zone=home --list-all
home (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: cockpit dhcpv6-client mdns samba-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

要查看所有活动的 zone,请运行以下命令:

[root@server1 ~] firewall-cmd --get-active-zones 
home
  interfaces: ens33
public
  interfaces: ens160

要更改默认 zone,请使用以下命令。例如,要将默认区域更改为 home,请运行以下命令:

[root@server1 ~] firewall-cmd --set-default-zone=home

要找出与 ens160 接口关联的区域,请运行以下命令:

[root@server1 ~] firewall-cmd --get-zone-of-interface=ens160
public

要创建新 zone,请使用以下命令。例如,要创建一个名为 “test” 的新区域,并永久生效,请运行:

[root@server1 ~] firewall-cmd --permanent --new-zone=test
success
[root@server1 ~] firewall-cmd --reload
success

3.6、开放和关闭端口

打开特定端口允许用户从外部访问系统,这代表了安全风险。因此,仅在必要时为某些服务打开所需的端口。

要获取当前区域中开放的端口列表,请运行以下命令:

[root@server1 ~] firewall-cmd --list-ports 
2222/tcp

下面实例将特定端口永久添加到列表中:

[root@server1 ~] firewall-cmd --permanent --add-port=8080/tcp
success
[root@server1 ~] firewall-cmd --reload
success

同样,要删除特定端口,请运行以下命令:

[root@server1 ~] firewall-cmd --remove-port=8080/tcp
success

可以使用以下命令每次确认端口是否已添加或删除:

[root@server1 ~] firewall-cmd --list-ports

如果要为特定区域开放端口,例如,以下命令将为 home 区域打开端口 80:

[root@server1 ~] firewall-cmd --permanent --zone=home --add-port=80/tcp
success
[root@server1 ~] firewall-cmd --reload
success

同样,要从开放的端口中删除特定区域的特定端口,请运行:

[root@server1 ~] firewall-cmd --zone=home --remove-port=80/tcp
success

3.7、添加和移除服务类型

Firewalld 服务配置是预定义的服务,如果启用了服务,则会自动加载。使用预定义服务使用户可以更轻松地启用和禁用对服务的访问。

预定义的服务配置文件位于/usr/lib/firewalld/services目录中。

Firewalld 的服务,你不需要记住任何端口,并且可以一次性允许所有端口。

例如,执行以下命令允许 samba 服务。samba 服务需要启用以下一组端口:“139/tcp 和 445/tcp” 以及 “137/udp 和 138/udp”。

添加’samba’服务后,所有端口都会同时激活,因为所有端口信息都在 samba 服务配置中。下面是 Firewalld 中预定义的 samba 的服务配置文件:

[root@server1 ~] cat /usr/lib/firewalld/services/samba.xml

下面是在 home 区域放行 samba 服务:

[root@server1 ~] firewall-cmd --permanent --zone=home --add-service=samba
success
[root@server1 ~] firewall-cmd --reload
success

要获取有关 samba 服务的更多信息,请运行以下命令:

[root@server1 ~] firewall-cmd --info-service=samba
samba
  ports: 137/udp 138/udp 139/tcp 445/tcp
  protocols: 
  source-ports: 
  modules: netbios-ns
  destination:

要一次添加多个服务,请执行以下命令。例如,要添加 http 和 https 服务,请运行以下命令:

[root@server1 ~] firewall-cmd --permanent --zone=home --add-service={http,https}
success
[root@server1 ~] firewall-cmd --reload
success

3.8、设置端口转发

端口转发是一种将任何传入网络流量从一个端口转发到另一个内部端口或另一台机器上的外部端口的方法。

注意:端口转发必须开启 IP 伪装。使用下面显示的命令为external区域启用伪装。

[root@server1 ~] firewall-cmd --permanent --zone=external --add-masquerade

要检查是否为区域启用了 IP 伪装,请运行以下命令:

[root@server1 ~] firewall-cmd --zone=external --query-masquerade 
yes

显示 yes,表示已经开启伪装。

要将端口重定向到同一系统上的另一个端口,例如:将 80 端口的所有数据包重定向到 8080 端口:

[root@server1 ~] firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
success

如果要将流量转发到另一台服务器,例如:将所有 80 端口的数据包重定向到 IP 为 10.0.0.75 的服务器上的 8080 端口:

[root@server1 ~] firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.0.75
success

例如,要允许来自特定源地址的流量,仅允许从特定子网连接到服务器,请运行以下命令:

[root@server1 ~] firewall-cmd --permanent --zone=home --add-source=192.168.1.0/24
success

3.9、富规则设置

富规则允许使用易于理解的命令创建更复杂的防火墙规则,但丰富的规则很难记住,可以查看手册man firewalld.richlanguage并找到示例。

富规则的一般规则结构如下:

要允许来自地址 192.168.0.0/24 的访问,请运行以下命令:

rule
  [source]
  [destination]
  service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
  [log]
  [audit]
  [accept|reject|drop|mark]

要允许来自地址 192.168.0.0/24 的连接访问 ssh 服务,请运行以下命令:

[root@server1 ~] firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" accept'
success

要拒绝来自 192.168.10.0/24 的流量访问 ssh 服务,请运行以下命令:

[root@server1 ~] firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service  accept'
success

要删除任何富规则,请使用--remove-rich-rule选项,下面使用--list-rich-rules列出富规则,然后删除掉富规则:

[root@server1 ~] firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port=22 protocol=tcp reject'
success

3.10、Firewalld 的 Direct 规则

Direct 规则类似于 iptables 命令,对于熟悉 iptables 命令的用户很有用。或者,您可以编辑/etc/firewalld/direct.xml文件中的规则并重新加载防火墙以激活这些规则。Direct 规则主要由服务或应用程序用来添加特定的防火墙规则。

以下 Direct 规则将在服务器上打开端口 8080:

[root@server1 ~] firewall-cmd --zone=public --list-rich-rules 
rule family="ipv4" source address="192.168.0.0/24" accept
rule family="ipv4" source address="192.168.0.0/24" service  accept
rule family="ipv4" source address="192.168.10.0/24" port port="22" protocol="tcp" reject
[root@server1 ~] firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.0.0/24" accept'
success
[root@server1 ~] firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service  accept'
success
[root@server1 ~] firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="22" protocol="tcp" reject'
success

要列出当前区域中的 Direct 规则,请运行:

[root@server1 ~] firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 8081 -j ACCEPT
success
[root@server1 ~] firewall-cmd --reload
success

使用下面命令删除 Direct 规则:

[root@server1 ~] firewall-cmd --direct --get-all-rules 
ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
ipv4 filter INPUT 0 -p tcp --dport 8081 -j ACCEPT

如何清空一个表的链?下面是语法和实例:

[root@server1 ~] firewall-cmd --direct --get-all-rules 
ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
ipv4 filter INPUT 0 -p tcp --dport 8081 -j ACCEPT
[root@server1 ~] firewall-cmd --permanent --direct --remove-rule ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
success
[root@server1 ~] firewall-cmd --reload
success
firewall-cmd --direct --remove-rules ipv4 [table] [chain]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/14802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

老板们搞怪营业,品牌好感度upup真有梗

老板下场营业最经典的莫过于“老乡鸡”了。在手撕联名信事件出圈后,老乡鸡围绕束从轩创始人IP,开展了一系列社交传播宣传,比如“咯咯哒糊弄学”等。 50多岁的老乡鸡董事长束从轩,一改传统企业家严肃正经的形象,跟着老乡…

Windows下virtualbox相关软件安装设置全过程

一、下载 virtual box 程序 virtual box扩展程序-Oracle_VM_VirtualBox_Extension_Pack-7.0.8.vbox-extpack Virtualbox GuestAdditions 程序-解决分辨率,主机虚拟机之间共享文件、剪贴板等问题 http://download.virtualbox.org/virtualbox/7.0.8/ 或者 virtual b…

【shell脚本】条件语句

一、条件测试操作 1.1test命令与 [ ] 符号 测试表达试是否成立,若成立返回0,否则返回其它数值 1.1.1文件测试常用的测试操作符 符号作用-d测试是否为目录-e测试是否为目录或文件-f测试是否为文件-r测试当前用户是否有读取权限-w测试当前用户是否有写…

你掌握了stream流的全部新特性吗?

我们知道很早之前java8对于之前的版本更新了许多 新的支持,比如lamda函数式接口的支持,支持更多函数式接口的使用,对链表,数组,队列,集合等实现了Collectio接口的数据结构提供了StreamSupport.stream()支持…

运维监控工具PIGOSS BSM扩展指标介绍

PIGOSS BSM运维监控工具,除系统自带指标外,还支持添加SNMP扩展指标、脚本扩展指标、JMX扩展指标、自定义JDBC指标等,今天本文将介绍如何添加SNMP扩展指标和脚本扩展指标。 添加SNMP扩展指标 前提:需要知道指标的oid 例子&#xff…

如何实现Spring AOP以及Spring AOP的实现原理

AOP:面向切面编程,它和OOP(面向对象编程)类似。 AOP组成: 1、切面:定义AOP是针对那个统一的功能的,这个功能就叫做一个切面,比如用户登录功能或方法的统计日志,他们就各种是一个切面。切面是有切点加通知组成的。 2、连接点:所有可…

Redis入门学习笔记【一】

目录 一、Redis是什么 二、Redis数据结构 2.1 Redis 的五种基本数据类型 2.1.1String(字符串) 2.1.2字符串列表(lists) 2.1.3字符串集合(sets) 2.1.5哈希(hashes) 2.2 Red…

MQTT协议 详解

文章目录 一、啥是MQTT?1. MQTT协议特点2. 发布和订阅3. QoS(Quality of Service levels)QoS 0 —— 最多1次QoS 1 —— 最少1次QoS 2 —— 只有1次 二、MQTT 数据包结构1. MQTT固定头2. MQTT可变头 / Variable header3. Payload消息体 三、M…

Ceph入门到精通- storcli安装

storcli 是LSI公司官方提供的Raid卡管理工具,storcli已经基本代替了megacli,是一款比较简单易用的小工具。将命令写成一个个的小脚本,会将使用变得更方便。 安装简单,Windows系统下解压出来以后可以直接运行。 Linux系统默认位置…

Android程序员向音视频进阶,有前景吗

随着移动互联网的普及和发展,Android开发成为了很多人的就业选择,希望在这个行业能获得自己的一席之地。然而,随着时间的推移,越来越多的人进入到了Android开发行业,就导致目前Android开发的工作越来越难找&#xff0c…

7.Shuffle详解

1.分区规则 ps."&"指的是按位与运算,可以强制转换为正数 ps."%",假设reduceTask的个数为3,则余数为0,1,2正好指代了三个分区 以上代码的含义就是对key的hash值强制取正之后,对reduce的个数取…

大数据技术之Kafka集成

一、集成Flume 1.1 Flume生产者 (1)启动Kafka集群 zkServer.sh startnohup kafka-server-start.sh /opt/soft/kafka212/config/server.properties & (2)启动Kafka消费者 kafka-console-consumer.sh --bootstrap-server 192…

动态内存管理

文章目录 1.动态内存函数1.1free1.2malloc1.3calloc1.4realloc 2.动态内存错误2.1解引用空指针--非法访问内存2.2越界访问动态空间2.3free释放非动态空间2.4free释放部分动态空间2.5free多次释放动态空间2.6未释放动态内存 3.动态内存题目3.1形参不影响实参3.2地址返回&#xf…

APP渗透—查脱壳、反编译、重打包签名

APP渗透—查脱壳、反编译、重打包签名 1. 前言1.1. 其它 2. 安装工具2.1. 下载jadx工具2.1.1. 下载链接2.1.2. 执行文件 2.2. 下载apktool工具2.2.1. 下载链接2.2.2. 测试 2.3. 下载dex2jar工具2.3.1. 下载链接 3. 查壳脱壳3.1. 查壳3.1.1. 探探查壳3.1.2. 棋牌查壳 3.2. 脱壳3…

FVM初启,Filecoin生态爆发着力点在哪?

Filecoin 小高潮 2023年初,Filecoin发文分享了今年的三项重大变更,分别是FVM、数据计算和检索市场的更新,这些更新消息在发布后迅速吸引了市场的广泛关注。 特别是在3月14日,Filecoin正式推出了FVM,这一变革使得Filec…

多维时序 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多变量时间序列预测

多维时序 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多变量时间序列预测 目录 多维时序 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多变量时间序列预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于贝叶斯(bayes)优化卷积神经网络-门控循环…

python 基础语法

标准库 语言参考手册 abstract base class – 抽象基类 abc annotation – 标注 类型注解 argument – 函数参数 关键字参数 xxx / **{xxx: , xx: }位置参数 3, 5 / *(3, 5) 基础语法 使用严格缩进 代替 大括号{} 框定代码块 使用反斜杠 \ 将一行的语句分为多行显示 三引…

ENVI 国产高分2号(GF-2)卫星数据辐射定标 大气校正 影像融合

1.数据 高分2号卫星数据,包含: MSS-1\2多光谱数据,4m分辨率; Pan-1\2全色波段数据,0.8m分辨率。 2.处理软件 ENVI5.3 国产插件下载地址:ENVI App Store (geoscene.cn) 首先下载插件文件; …

【STL十四】函数对象(function object)_仿函数(functor)——lambda表达式

【STL十四】函数对象(function object)_仿函数(functor)——lambda表达式 一、函数对象(function object)二、函数对象优点三、分类四、头文件五、用户定义函数对象demo六、std::内建函数对象1、 算术运算函…

【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的Redis延时队列的功能组件

手把手教你如何开发一个属于自己的延时队列的功能组件 前提介绍解决痛点延时队列组件的架构延时队列组件的初始化流程延时队列组件的整体核心类架构延时队列组件的整体核心类功能 延时队列的开发组件延迟队列的机制配置初始化类源码 - DelayedQueueConfigurationRedission客户端…