AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 793192
Accepted
Marco Klein
Marco Klein
Asked: 2025-04-01 03:35:31 +0800 CST2025-04-01 03:35:31 +0800 CST 2025-04-01 03:35:31 +0800 CST

Firewalld 忽略针对端口转发的 rich-rule

  • 772

我在设置firewalld与docker和fail2ban完美连接时遇到问题。

首先,我想要实现的是以下流量路由设置:

[PUBLIC] -> 
  [FIREWALLD] -> (
    [143/tcp FORWARD PORT] -----> [DOCKER/143/tcp]
    [ 22/tcp]              -----> [openssh locally running]
  )

失败2ban

我设置了 fail2ban 来监听我的 docker 容器,检查身份验证错误并使用 设置禁令firewall-cmd。到目前为止,这很有效。只要我 3 次身份验证错误,它就会向防火墙发送命令。

端口转发

我还为 docker 设置了端口转发。我明确地设置了它,因为我不想让 docker 破坏我的网络。也许这是我将来不需要的东西,但它是通过StrictForwardPorts=yes配置配置的。https ://firewalld.org/2024/11/strict-forward-ports

目标

目标是每当触发 fail2ban 时,IP都不应再访问端口 143(转发端口),并且(可能)其他端口也不应再访问。但首先,我想逐个端口禁止。

问题

当前的问题是,如果创建了拒绝富规则,它将阻止该 IP 的端口 22,但不会阻止端口 143。

尝试 我还尝试将 IP 放入drop区域,并赋予其优先级-10。同样的错误结果。端口 22 被丢弃,但 143 仍然有效。

我做错了什么?这是我上次尝试的区域配置:

docker (active)
  target: ACCEPT
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: br-0aa8d4b5dde7 docker0
  sources: 
  services: 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
        rule priority="-999" family="ipv4" source address="192.168.178.44" reject

drop (active)
  target: DROP
  ingress-priority: -10
  egress-priority: -10
  icmp-block-inversion: no
  interfaces: 
  sources: 192.168.178.44
  services: 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

public (default, active)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
        port=143:proto=tcp:toport=143:toaddr=172.18.0.2
  source-ports: 
  icmp-blocks: 
  rich rules: 
        rule priority="-999" family="ipv4" source address="192.168.178.44" reject

如图所示:实际上,地址 192.168.178.44 应该完全阻止进入公共区域。但事实并非如此。此外,我还将 IP 添加到了丢弃区。丢弃区优先级似乎正在发挥作用,因为我的 SSH 连接被丢弃而不是被拒绝,但端口 143 仍然可以访问

更新 1:一些调试信息

$ sudo firewall-cmd --get-policies
allow-host-ipv6 docker-forwarding

更新 2:--info-policy=docker-forwarding

docker-forwarding (active)
  priority: -1
  target: ACCEPT
  ingress-zones: ANY
  egress-zones: docker
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: `

更新 3:

我想到另一个想法是创建另一个优先级为 -10 的策略,其中包含丰富的规则:

sudo firewall-cmd --permanent --new-policy ban-pre-routing
sudo firewall-cmd --permanent --policy ban-pre-routing --add-ingress-zone ANY
sudo firewall-cmd --permanent --policy ban-pre-routing --add-egress-zone HOST
sudo firewall-cmd --permanent --policy ban-pre-routing --set-priority -10
sudo firewall-cmd --permanent --policy ban-pre-routing --add-rich-rule="rule family=ipv4 source address=192.168.178.44 port port=143 protocol=tcp reject"

仍然没有效果。我的 *.44 主机仍然可以连接到机器。如果我省略该port port=143 protocol=tcp部分,它会阻止机器使用 ssh - 但仍然能够访问端口 143。

更新 4: 使用更新 3 并将策略配置为出口区域 docker,不会产生差异。我的配置现在如下所示:

$ sudo firewall-cmd --list-all-policies
allow-host-ipv6 (active)
  priority: -15000
  target: CONTINUE
  ingress-zones: ANY
  egress-zones: HOST
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
        rule family="ipv6" icmp-type name="neighbour-advertisement" accept
        rule family="ipv6" icmp-type name="neighbour-solicitation" accept
        rule family="ipv6" icmp-type name="redirect" accept
        rule family="ipv6" icmp-type name="router-advertisement" accept

ban-pre-routing (active)
  priority: -10
  target: CONTINUE
  ingress-zones: ANY
  egress-zones: docker
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
        rule family="ipv4" source address="192.168.178.44" port port="143" protocol="tcp" reject

docker-forwarding (active)
  priority: -1
  target: ACCEPT
  ingress-zones: ANY
  egress-zones: docker
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

对于区域:

$ sudo firewall-cmd --list-all --zone=public
public (default, active)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
        port=143:proto=tcp:toport=143:toaddr=172.18.0.2
  source-ports: 
  icmp-blocks: 
  rich rules: 

$ sudo firewall-cmd --list-all --zone=drop
drop
  target: DROP
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

$ sudo firewall-cmd --list-all --zone=docker
docker (active)
  target: ACCEPT
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: br-c5f172e4effe docker0
  sources: 
  services: 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
ubuntu
  • 1 1 个回答
  • 83 Views

1 个回答

  • Voted
  1. Best Answer
    Marco Klein
    2025-04-03T03:35:50+08:002025-04-03T03:35:50+08:00

    我还在firewalld github页面上发布了一个帖子。在那里,用户erig0向我指出了实际问题所在。请参阅GitHub讨论

    由于端口转发的优先级比 Linux 内核中的其他任何内容都要高,因此会考虑端口转发规则,而其后的所有其他内容都会被忽略。

    这就是为什么我使用默认方式阻止端口的尝试都失败了。

    下面介绍如何使用(特定于端口的)阻止选项设置整个端口转发firewalld:

    1. 获取一份干净的配置副本firewalld(如果需要)

    2. 缺点:关闭iptablesDocker。为此,请确保

      • /etc/docker/daemon.json存在
      • iptables属性设置为false
        $ cat /etc/docker/daemon.json
        {
           "iptables": false
        }
        
      • 重启机器 -是的,确实有必要清理 中的所有 docker 错误iptables。否则,你会发现无论防火墙配置如何,docker 都会允许流量通过。
    3. 现在,重新配置docker-container通信。

      • 将 Docker 容器重新定位到预定义docker区域firewalld:
        firewall-cmd --permanent --zone docker --add-source 172.17.0.1/16
        
        ⚠️ 确保使用上述命令添加所需的所有子网。就我而言,我还在 中运行了一个 docker-compose 环境172.18.0.1/16 subnet。
    4. 启用容器出站通信(如果需要)。这也涉及容器到容器的通信(内部托管):

      sudo firewall-cmd --permanent --new-policy docker-outbound
      sudo firewall-cmd --permanent --policy docker-outbound --add-ingress-zone docker
      sudo firewall-cmd --permanent --policy docker-outbound --add-egress-zone ANY
      sudo firewall-cmd --permanent --policy docker-outbound --set-target ACCEPT
      sudo firewall-cmd --permanent --policy docker-outbound --add-masquerade
      

      这些命令将

      • 检查与入口区域 docker 的连接(源)。
      • 观察从该源到任何地方的连接。
      • 允许连接并伪装它们。

      因此,您的容器应该能够成功curl google.com。

    5. 最后但同样重要的一点是,如果端口转发允许,则启用对 Docker 容器的外部访问:

      firewall-cmd --permanent --new-policy docker-inbound
      firewall-cmd --permanent --policy docker-inbound --add-ingress-zone ANY
      firewall-cmd --permanent --policy docker-inbound --add-egress-zone HOST
      

    现在,端口转发的所有设置都已完全由firewalld完成,docker 不再插手。设置端口转发本身现在非常简单。

    1. 设置 IPset(如果需要,每个端口 (-set) 一个专用 IPset - 您自行决定)。此 IPset 将包含该特定端口 (-set) 的所有已阻止 IP 地址

      firewall-cmd --permanent --new-ipset=banned-imap --type=hash:net
      
    2. 添加新的端口转发策略:

      sudo firewall-cmd --permanent --zone public --add-rich-rule 'rule family="ipv4" source NOT ipset="banned-imap" forward-port port="143" protocol="tcp" to-port="143" to-addr="172.18.0.2"'
      

      该规则的作用:

      • 当呼叫到达公共区域时,并且
      • 这是端口上的 IPv4 调用143/tcp,并且
      • 它的源 IP 地址不在我们的 IP 集“banned-imap”内,
      • 然后转发到给定 docker 容器的 143 端口(172.18.0.2)

    这是完整的防火墙设置。要添加 IP,请运行:

    sudo firewall-cmd --permanent --ipset=banned-imap --add-entry=192.168.178.70
    

    并再次启用它以进行访问:

    sudo firewall-cmd --permanent --ipset=banned-imap --remove-entry=192.168.178.70
    

    请记住,如果您提供--permanent,则必须重新加载防火墙。要使更改立即生效,请--permanent在运行命令时省略 - 但是,您必须记住,下次重新加载/重新启动后,此 ip 将从列表中消失。

    • 2

相关问题

  • 使 Apple 键盘设置在 ../hid_apple/parameters/ 中持久化

  • 用文件中的点绘制二维图形

  • 如何验证我使用 9.9.9.9 作为 DNS?

  • 并行安装多个 linux 发行版

  • 自编译 OpenVPN 不会从 systemd 启动

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve