V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LoeNet
V2EX  ›  程序员

不懂就问系列! 为什么 iptables 或者 firewalld 这类工具要作为服务运行?

  •  
  •   LoeNet · 2021-10-14 09:38:08 +08:00 · 3209 次点击
    这是一个创建于 1132 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个疑问,Netfilter 作为网络数据包过滤机制,iptables 和 firewalld 作为用户端管理工具,按照我的理解 只是下发策略,应该完全可以无需 systemctl 服务管理. 但是目前 Linux 发行版都有这个服务. 这个主要目的还有什么?

    11 条回复    2021-10-14 14:23:12 +08:00
    saytesnake
        1
    saytesnake  
       2021-10-14 09:48:02 +08:00
    iptables 跟 nftables 可以不用服务运行,没经历过 init 时代? firewalld 跟 ufw 只是 iptables 的封装。
    cweijan
        2
    cweijan  
       2021-10-14 10:04:16 +08:00
    配置的策略最终也是某些软件在用啊, iptables 就是最底层的软件.
    podel
        3
    podel  
       2021-10-14 10:28:47 +08:00
    @cweijan iptables 还不是最底层的。 最底层的是内核的 netfilter 。
    本质是。 作为防火墙。这种软件是没办法运行在 内核态的。 用户态和内核态之间会有 中断切换。开销很大。
    iptables 本质是 内核里面的现有加载模块的 控制器。
    2i2Re2PLMaDnghL
        4
    2i2Re2PLMaDnghL  
       2021-10-14 10:41:13 +08:00   ❤️ 10
    你 systemctl cat iptables.service 看看内容,它 RemainAfterExit=yes 说明这个服务不是一个进程。
    它只是作为 service 单元被 systemd 管理,它的启动过程即是载入 rules,然后就认为这个服务已经存在了。

    @cweijan 不是,最终是内核态处理,每个包都过一遍用户态太慢了。
    2i2Re2PLMaDnghL
        5
    2i2Re2PLMaDnghL  
       2021-10-14 10:45:21 +08:00   ❤️ 2
    @podel 准确地说 iptables 本质是运行在内核态的一个微型且功能特化的虚拟机式解释器。
    前沿似乎在转用 eBPF,准备用单一一个解释器运行大部分甚至所有需插入内核态运行的代码。
    GuuJiang
        6
    GuuJiang  
       2021-10-14 10:51:04 +08:00 via iPhone
    @2i2Re2PLMaDnghL 学到了,问题是个好问题,答案也是好答案
    yanqiyu
        7
    yanqiyu  
       2021-10-14 10:55:19 +08:00
    Firewalld 之类的需要监听网络环境的变化(比如某个网口插入网线并被分配 ip ),然后按照预配的或者是 NetworkManager 传递 zone 信息更新 nft
    cweijan
        8
    cweijan  
       2021-10-14 11:40:01 +08:00
    @2i2Re2PLMaDnghL 原来是这样, 感谢指教
    adoal
        9
    adoal  
       2021-10-14 12:27:41 +08:00
    开机启动做初始化啊亲
    adoal
        10
    adoal  
       2021-10-14 12:28:45 +08:00
    要不然你打算怎么做,在 rc.local 里加载写好的防火墙规则吗
    LoeNet
        11
    LoeNet  
    OP
       2021-10-14 14:23:12 +08:00
    @2i2Re2PLMaDnghL 感谢参与讨论.茅塞顿开. 目前 firewalld 已经改成 dbus.
    cat /usr/lib/systemd/system/firewalld.service
    [Unit]
    Description=firewalld - dynamic firewall daemon
    Before=network-pre.target
    Wants=network-pre.target
    After=dbus.service
    After=polkit.service
    Conflicts=iptables.service ip6tables.service ebtables.service ipset.service
    Documentation=man:firewalld(1)

    [Service]
    EnvironmentFile=-/etc/sysconfig/firewalld
    ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS
    ExecReload=/bin/kill -HUP $MAINPID
    # supress to log debug and error output also to /var/log/messages
    StandardOutput=null
    StandardError=null
    Type=dbus
    BusName=org.fedoraproject.FirewallD1
    KillMode=mixed

    [Install]
    WantedBy=multi-user.target
    Alias=dbus-org.fedoraproject.FirewallD1.service
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5346 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 07:25 · PVG 15:25 · LAX 23:25 · JFK 02:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.