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
    • 最新
    • 标签
主页 / server / 问题 / 1046179
Accepted
Kevin Keane
Kevin Keane
Asked: 2020-12-15 17:40:36 +0800 CST2020-12-15 17:40:36 +0800 CST 2020-12-15 17:40:36 +0800 CST

RHEL/CentOS 现在要在系统启动时向 firewalld 添加 nftable 规则吗?

  • 772

我在 RHEL 8 上使用 firewalld,并且还需要添加一些 nftable 规则。

(nftable 规则基于对CentOS 8 作为 NAT 路由器的回答,带有 nft 和 firewalld - 如何让它通过 TFTP?)

在正在运行的防火墙中,这与 nft -f 命令配合得很好。

但是,这会在重新启动时丢失。

RedHat 文档(在付费墙后面)建议使用 nftables.service 服务在重新启动时加载规则,但这不能与 firewalld 一起使用。这两个服务被列为冲突,即使它们不是,firewalld 也可能会刷新 nftable 规则。

是否有另一种方法可以让 nftable 规则在重新启动时加载?

nftables firewalld
  • 1 1 个回答
  • 1014 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2020-12-16T03:45:04+08:002020-12-16T03:45:04+08:00

    使用nftables后端时,firewalld实用程序不会刷新不属于它的表:

    只刷新firewalld的规则

    由于 nftables 允许命名空间(通过表),firewalld 不再完全刷新防火墙规则。它只会刷新 firewalld表中的规则。这可以避免在重新启动或重新加载 firewalld 时意外清除自定义用户规则或其他工具安装的规则的情况。

    在管理其他表时也必须这样做。

    实际上在前面的答案中,它已经完成了:nftables规则幂等地只删除他们自己的 table: handletftp。

    可悲的是,nftables.service停止操作并非如此:

    ExecStop=/sbin/nft flush ruleset
    

    必须确保 systemd 服务的停止部分在仍在执行工作时不会直接刷新所有规则。该作业将被委派给停止操作的专用nftables规则。

    所以这是一个实用的方法:复制(例如:)systemctl cat nftables.services并更改为要放入nftables.service的实例化版本:[email protected]/etc/systemd/system/[email protected]

    [Unit]
    Description=Idempotent nftables rules for %I
    Wants=network-pre.target
    Before=network-pre.target
    
    [Service]
    Type=oneshot
    ProtectSystem=full
    ProtectHome=true
    ExecStart=/sbin/nft -f /etc/nftables/idempotent/%I.nft
    # As the rules are idempotent, ExecReload is same as ExecStart
    ExecReload=/sbin/nft -f /etc/nftables/idempotent/%I.nft
    # The stop rules should only have the first boilerplate parts
    ExecStop=/sbin/nft -f /etc/nftables/idempotent/stop-%I.nft
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    

    创建上面使用的专用配置目录:

    mkdir -p /etc/nftables/idempotent
    

    放置规则,对于定义的每个表,总是这样开始,因此加载规则独立于其他表和幂等(例如表ip foo和bridge bar):

    table ip foo
    delete table ip foo
    
    table bridge bar
    delete table bridge bar
    
    table ip foo {
        ...
    }
    
    table bridge bar {
        ....
    }
    

    或者每个文件只使用一个表。该flush ruleset声明被禁止,因为它是全球性的。

    创建,删除和重新创建表的原因是为了获得结果幂等性:虽然删除不存在的表是一个错误,并且会原子地使整个加载失败,声明一个现有的表而不定义它(通过添加一个空表)如果它以前不存在,则永远不会失败并且除了将其创建为空之外什么都不做。在这两种情况下(在启动时不存在,在重新加载时存在)删除现在可以工作,留下真正定义表的地方。所有这些都发生在同一个事务中并且仍然是原子的:如果在此期间之前存在丢失的 ip foo 表,则不会使用丢失的ip foo表来评估任何数据包。

    准备上面的停止版本,它只会删除(这里的空声明不是严格需要的,如果只有一个表可以删除,但如果有多个表则应该保留:失败是针对整个事务的):

    table ip foo
    delete table ip foo
    
    table bridge bar
    delete table bridge bar
    

    并将所有内容放在他们的位置:

    /etc/nftables/idempotent/foobar.nft
    /etc/nftables/idempotent/stop-foobar.nft
    

    现在可以通过以下方式激活:

    systemctl enable --now local-idempotent-nft@foobar
    

    先前OP问题的示例:

    在/etc/nftables/idempotent/handletftp.nft:

    table ip handletftp
    delete table ip handletftp
    
    table ip handletftp {
        ct helper helper-tftp {
            type "tftp" protocol udp
        }
    
        chain sethelper {
            type filter hook forward priority 0; policy accept;
            ip saddr 192.168.1.0/24 ip daddr 10.0.10.10 udp dport 69 ct helper set "helper-tftp"
        }
    }
    

    在/etc/nftables/idempotent/stop-handletftp.nft

    table ip handletftp
    delete table ip handletftp
    

    启用并启动它:

    systemctl enable --now local-idempotent-nft@handletftp
    

    停止它:

    systemctl stop local-idempotent-nft@handletftp
    

    这将保留firewalld的规则。同样,停止或重新启动firewalld将保留这些规则。

    可能需要改进:

    • nftables有一个include语句,可以以某种方式使用它来避免样板文件的重复。
    • 关于 TFTP 的具体示例依赖于nf_nat_tftp不会自动完成的加载(与nf_conntrack_tftp规则中的引用自动加载相反,或者与将显式加载的firewalldnf_nat_tftp相反)。所以相关但非严格的nftables配置应该牢记在心(这个设置可以简单地放入/etc/modules-load.d/)。
    • 3

相关问题

  • nftable 规则在重新连接时失效(VDSL,ppp0)

  • 我的 nftables 规则阻止 IPv6

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve