CentOS7下Firewalld批量放行端口:直接编辑配置文件实战

centos7之firewalld规则详解(二) 文章主要写了firewalld的管理、富规则的概念、伪装及端口转发。同时也有对firewalld的概述及其工作拓扑,也就是firewalld的理论基础的深入学习。 阅读详情

接手过 CentOS7 服务器的人对 firewalld 应该都不陌生,日常放行单个端口很简单,一条 firewall-cmd --permanent --add-port=8080/tcp 就结束了。可一旦需求变成“这批服务要开几十上百个端口”,逐条敲命令就成了灾难。我前段时间就遇到一次给某数据平台中间件集群批量放行端口的需求,前前后后试了几种方式,最后发现直接操作 firewalld 的规则配置文件,才是最稳妥、最好审计、也最容易批量化的做法。这篇文章就围绕 CentOS7 下 Firewalld 规则配置文件批量放行端口这件事,把配置文件的组织方式、批量操作的几种写法、验证回滚流程和常见坑一次性讲清楚,适合正在做服务器初始化、中间件部署、以及手工维护防火墙规则的人参考。

1. 为什么我选择直接改规则文件而不是一条条敲命令

先说那次经历。某天下午接到需求:一个新环境要接入一套消息中间件集群,三个节点,每个节点需要放行 TCP 20000 到 20100、UDP 5300 到 5400,外加 8080 和 8443。看起来端口段不多,但同一套配置要原样复制到 6 台服务器上。如果用 firewall-cmd 一条条敲,每台机器少说十几条命令,还得小心 20000-20100 这种范围在命令行里的写法,出一点错就得从头检查。

命令行方案在批量场景下有三个明显的痛点。第一是慢,端口越多命令越多,一台机器敲完还要换下一台;第二是难审计,几十条命令执行下去,事后根本说不清到底放开了哪些端口,想对比两台机器配置是否一致只能肉眼碰运气;第三是不好回滚,临时反悔了要一条条删,删漏一条就是安全隐患。

直接改配置文件完全是另一套体验。 /etc/firewalld/ 下的规则文件是纯文本,可以放在 Git 里做版本管理,可以复制到所有机器保持一致性,改之前 cp 一份就是天然的回滚点。而且很多人不知道一点: firewall-cmd --permanent --add-port 这个命令的本质就是在改写这些 XML 文件,只是通过 CLI 做了一层校验而已。所以直接编辑规则文件并不是什么旁门左道,只是绕过了逐条校验,需要对 XML 格式有把握。

下面这张表是我自己选型时的对比,场景就是“批量、多端口、多机器”:

对比项 firewall-cmd 逐条执行 直接编辑规则文件
操作效率 端口多时极低 一次性写入,高
可审计性 差,靠日志或屏幕记录 好,文件可 diff
多机一致 容易遗漏或手滑 文件原样分发即可
回滚 删除命令逐条执行 恢复备份文件
上手门槛 低 需要理解 XML 结构
适用场景 临时调试、少量端口 正式需求、批量部署

需要说明的是,CLI 方式也有它的价值,特别是临时开个端口调试问题, firewall-cmd --add-port 改运行时配置非常方便。我这里的建议是:临时操作用命令,正式、批量、要长期生效的规则用配置文件。两者不冲突,很多服务器上长期规则和临时规则是并存的。

2. 动手前先搞懂 Firewalld 的配置文件体系

直接改文件之前,必须先把 /etc/firewalld/ 下那几类文件的分工搞清楚。改错文件是最冤枉的踩坑方式,我见过有人把规则写进 direct.xml ,结果完全没生效,原因就是放错了地方。

2.1 zone 文件:常规端口放行的主战场

正常情况下,批量放行端口的主战场是 /etc/firewalld/zones/ 目录下的 XML 文件。每一台 CentOS7 机器都有一组 zone(区域),比如 public、internal、dmz、work,每个 zone 代表一种信任级别。系统会有一个默认 zone,通常就是 public,所有没有特别指定的网卡流量都走这个 zone。

/etc/firewalld/zones/public.xml 对应 public 区域。系统自带的初始文件大概长这样:

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
</zone>

这个文件里 <service name="ssh"/> 表示放行 SSH 服务(对应 22 端口), <service name="dhcpv6-client"/> 放行 DHCPv6 客户端所需端口。我们要做的批量放行,就是在这个文件里增加 <port> 元素,指定端口号和协议:

<port port="8080" protocol="tcp"/>
<port port="20000-20100" protocol="tcp"/>

这里有一个容易忽略的点: /usr/lib/firewalld/zones/ 下还有一份系统默认模板,而 /etc/firewalld/zones/ 下的文件会覆盖模板。如果你在 /usr/lib 底下改文件,重启后可能被覆盖,一定要改 /etc/firewalld/zones/ 这一份。

2.2 direct.xml:直接写 iptables 参数的旁路通道

/etc/firewalld/direct.xml 是另一个入口,允许你绕过 zone 的抽象,直接塞 iptables 命令行参数。文件长这样:

<?xml version="1.0" encoding="utf-8"?>
<direct>
  <rule ipv="ipv4" table="filter" chain="IN_public_allow" priority="0">-p tcp -m multiport --dports 30000:30050 -j ACCEPT</rule>
</direct>

IN_public_allow 是 public zone 内部实际使用的自定义链,直接往这个链里塞规则,语义上跟 zone 文件放行端口是一致的。但我一般不会首选 direct.xml ,原因后面在选型对比里细说。它更适合常规 zone 语法表达不了的场景,比如需要自定义匹配条件、多条件组合的规则。

2.3 rich rule:藏在 zone 文件里的复杂规则

rich rule 不是单独的文件,而是 zone XML 文件内部的 <rule> 元素。它支持更复杂的条件,比如限定来源 IP 再放行端口:

<rule family="ipv4">
  <source address="192.168.1.0/24"/>
  <port port="8443" protocol="tcp"/>
  <accept/>
</rule>

这条规则的意思是:只有来自 192.168.1.0/24 的流量才允许访问 8443 端口。rich rule 功能强大,但语法比 <port> 复杂,批量堆端口时阅读性也差,所以大批量放行场景中我不太用它,后面会展开对比。

2.4 运行时配置与永久配置的区别

理解 firewalld 的关键是它有两套配置:运行时(runtime)和永久(permanent)。运行时配置是当前生效的规则, firewall-cmd --add-port 不加 --permanent 时只改运行时,重启即失效。永久配置存在 /etc/firewalld/ 的 XML 文件里,我们手动编辑文件改的就是永久配置。

改完文件后要让规则立即生效,必须执行重载:

firewall-cmd --reload

--reload 会把永久配置重新应用到运行时,并且尽量保留已建立的连接,是最常用的方式。另一个是 --complete-reload ,它的动作更彻底,会重新初始化整个防火墙,已经建立的连接也会被重置,一般只有规则完全乱掉的时候才用。值得提醒的是,部分版本的 firewalld 会通过文件监听自动感知 zone 文件变化并触发重载,但不同版本行为不一致,发布流程里不要依赖这种自动行为,手动执行 reload 才有确定性。

3. 批量放行的四种姿势及选型对比

搞清楚文件体系之后,就可以聊批量放行的具体写法了。根据端口数量和场景,我通常会在四种方式里选。

3.1 Zone 文件里堆端口条目

最直观的方式就是在 zone 文件里一条条堆 <port> 元素:

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <port port="8080" protocol="tcp"/>
  <port port="8443" protocol="tcp"/>
  <port port="10000" protocol="tcp"/>
  <port port="10001" protocol="tcp"/>
  <port port="10002" protocol="tcp"/>
</zone>

优点是结构清晰、任何会看 XML 的人都能一眼看懂;缺点是端口多的时候文件很长。如果只有几十个端口,我推荐这种方式,配合版本管理非常直观。

3.2 端口段 range 写法

对于连续端口,firewalld 支持直接写范围,中间用短横线连接:

<port port="20000-20100" protocol="tcp"/>
<port port="5300-5400" protocol="udp"/>

这是批量放行中最该优先使用的写法。一条规则就能覆盖 101 个端口,iptables 底层会自动把它翻译成一个 -m multiport --dports 20000:20100 的匹配项。要注意的是协议必须写对,TCP 服务写 tcp ,UDP 服务写 udp ,混用会导致服务仍然不通。

这里有个性能相关的细节:firewalld 会把 zone 文件里每个 <port> 元素展开成一条 iptables 规则。如果几百个不连续端口全部逐条列出来,防火墙规则链会变得很长,每次报文匹配都要走一遍链表。iptables 的 multiport 模块单条规则最多支持 15 个端口,超过就得拆多条规则。所以能用范围就用范围,实在是不连续端口,也尽量合并成尽量少的范围段。

3.3 用脚本批量生成 XML 片段

当端口清单来自需求文档、数量上百而且不连续时,手写 XML 不现实,这时候用脚本生成片段是最靠谱的。我常用一个简单的 Python 脚本,把端口列表自动合并成范围:

def to_ranges(ports):
    ports = sorted(set(ports))
    res = []
    start = prev = ports[0]
    for p in ports[1:]:
        if p == prev + 1:
            prev = p
        else:
            res.append((start, prev))
            start = prev = p
    res.append((start, prev))
    return res

# 示例:8080、8443 以及 10000 到 10100 连续段
ports = [8080, 8443] + list(range(10000, 10101))
for a, b in to_ranges(ports):
    tag = str(a) if a == b else f"{a}-{b}"
    print(f'  <port port="{tag}" protocol="tcp"/>')

输出结果:

  <port port="8080" protocol="tcp"/>
  <port port="8443" protocol="tcp"/>
  <port port="10000-10100" protocol="tcp"/>

如果机器上没有 Python,用 bash 也能做,只是合并范围的逻辑要自己多写几行:

for p in $(seq 30000 30100); do
    printf '  <port port="%s" protocol="tcp"/>\n' "$p"
done

脚本生成的好处是端口清单可以放在一个纯文本文件里维护,脚本负责生成 XML,格式永远统一,不会出现手写时少个斜杠、多个空格的问题。

3.4 direct.xml 处理极端场景

少数极端情况我会用到 direct.xml :比如需要同时对多个不连续端口做一条规则,或者需要自定义链的复杂跳转。例如:

<direct>
  <rule ipv="ipv4" table="filter" chain="IN_public_allow" priority="0">-p tcp -m multiport --dports 30000,30002,30004-30010 -j ACCEPT</rule>
</direct>

用 direct 规则可以直接利用 multiport 的逗号组合语法,在不连续端口场景下能控制规则条数。但代价是失去了 zone 的抽象,firewalld 自动生成的规则和手动塞进去的规则混在一起,排查问题时心智负担更重。我的建议是:能用 <port> 解决就不用 direct,direct 留给真正需要的时候。

3.5 四种方式的选型逻辑

我把选型逻辑总结成一个表格,实际工作里基本照着这个判断:

场景 推荐方式 理由
少量端口(≤20) zone 文件堆条目 直观、可读性好
端口有规律、连续 zone 文件 range 写法 规则条数少,性能好
端口多且不连续 脚本生成 zone 条目 避免手写错漏
需要来源 IP 限制等复杂条件 rich rule 只能用它
需要复杂匹配、自定义链 direct.xml 兜底选项

4. 完整实战:一次 160 个端口的批量放行全过程

理论讲完,来看一次完整的实际操作。我以某数据平台中间件接入为例,需求是这样的:新部署的中间件集群需要对外提供 TCP 10000-10100 共 101 个端口,UDP 5000-5100 共 101 个端口,另外还有 8080 和 8443 两个 Web 端口。所有服务器都是 CentOS7,默认 public zone。

4.1 第一步:确认当前生效的 zone

改文件之前先弄清楚流量到底走哪个 zone。很多意外都是因为想当然认为默认是 public,结果服务器的接口绑到了别的 zone 上。

# 查看默认 zone
firewall-cmd --get-default-zone

# 查看所有活跃 zone 以及绑定的网卡
firewall-cmd --get-active-zones

如果 --get-active-zones 显示 public 绑定在 eth0 上,那我们的目标文件就是 /etc/firewalld/zones/public.xml 。如果绑定的是 internal 或者自定义 zone,就要改对应的文件。

4.2 第二步:备份规则文件

任何一次修改前都做备份,这是成本最低的保险。我用带日期的备份文件名,方便回滚时辨认:

cp /etc/firewalld/zones/public.xml /etc/firewalld/zones/public.xml.bak.$(date +%F)

4.3 第三步:用脚本生成端口 XML 片段

按照上面的 Python 脚本思路,把需求端口喂进去:

ports = list(range(10000, 10101)) + [8080, 8443]
# 按协议区分
tcp_ports = sorted(set(ports))
udp_ports = list(range(5000, 5101))

def to_ranges(ports):
    ports = sorted(set(ports))
    res = []
    start = prev = ports[0]
    for p in ports[1:]:
        if p == prev + 1:
            prev = p
        else:
            res.append((start, prev))
            start = prev = p
    res.append((start, prev))
    return res

for a, b in to_ranges(tcp_ports):
    tag = str(a) if a == b else f"{a}-{b}"
    print(f'  <port port="{tag}" protocol="tcp"/>')
for a, b in to_ranges(udp_ports):
    tag = str(a) if a == b else f"{a}-{b}"
    print(f'  <port port="{tag}" protocol="udp"/>')

运行后输出:

  <port port="8080" protocol="tcp"/>
  <port port="8443" protocol="tcp"/>
  <port port="10000-10100" protocol="tcp"/>
  <port port="5000-5100" protocol="udp"/>

80 个手工条目被自动压缩成了 4 条范围规则,这就是批量放行的精髓。

4.4 第四步:把片段写入 zone 文件并校验 XML

用编辑器打开 /etc/firewalld/zones/public.xml ,把生成的片段插到 </zone> 之前,保存:

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <port port="8080" protocol="tcp"/>
  <port port="8443" protocol="tcp"/>
  <port port="10000-10100" protocol="tcp"/>
  <port port="5000-5100" protocol="udp"/>
</zone>

保存之前先做 XML 语法校验,避免一个标签写错导致整个 zone 加载失败:

# 方法一:xmllint(需要安装 libxml2)
xmllint --noout /etc/firewalld/zones/public.xml

# 方法二:没有 xmllint 时用 Python
python -c "import xml.dom.minidom,sys; xml.dom.minidom.parse('/etc/firewalld/zones/public.xml'); print('xml ok')"

输出没有报错,文件就算过了语法关。还要顺手确认一下文件属主和权限,避免后面 firewalld 回写时出问题:

chown root:root /etc/firewalld/zones/public.xml
chmod 640 /etc/firewalld/zones/public.xml

4.5 第五步:重载并确认规则

firewall-cmd --reload

# 确认没有报错,然后查看 public zone 的完整配置
firewall-cmd --zone=public --list-all

正常输出里会看到:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh dhcpv6-client
  ports: 8080/tcp 8443/tcp 10000-10100/tcp 5000-5100/udp
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

看到 ports 一行列出了我们添加的全部端口和范围,这一步就算成功了。

5. 改完之后的验证与回滚

配置写对只是第一步,端口到底通不通,必须验证。而且安全的变更流程一定要有回滚预案,不然改完上不了线,连恢复的手段都没有。

5.1 用 firewall-cmd 查看规则状态

除了 --list-all ,还有几个常用查询命令:

# 只查看已放行的端口
firewall-cmd --zone=public --list-ports

# 查询单个端口是否已放行
firewall-cmd --zone=public --query-port=8080/tcp

--query-port 返回 yes 表示端口已在放行列表中。对于 range 端口,直接用 10000-10100/tcp 查询。

5.2 用 iptables-save 核对底层规则

firewall-cmd 显示的是它自己维护的逻辑视图,我更习惯再用 iptables-save 看一眼底层真实规则,确认 firewalld 确实把规则下到了 iptables:

iptables-save | grep IN_public_allow

输出里能看到类似:

-A IN_public_allow -p tcp -m tcp --dport 8443 -m conntrack --ctstate NEW -j ACCEPT
-A IN_public_allow -p tcp -m multiport --dports 10000:10100 -m conntrack --ctstate NEW -j ACCEPT
-A IN_public_allow -p udp -m multiport --dports 5000:5100 -m conntrack --ctstate NEW -j ACCEPT

看到 multiport 范围匹配正确出现,说明规则已经真正生效。这一步还能发现一个常见问题:范围没有被合并成一条 multiport,而是展开成了几百条单端口规则,那就说明 XML 里的 range 写法没有生效,需要回头检查端口段格式。

5.3 用实际连接测试做端到端验证

规则层面没问题,不代表服务本身通了。我一般会分两层验证:先确认服务在监听,再从外部确认端口可访问。

# 在服务器本机查看监听端口
ss -lntup | grep -E ':(8080|8443|10000|5000)\b'

# 用 nc 从本机探测
nc -vz 127.0.0.1 8080
nc -vz 127.0.0.1 10000

如果服务还没启动,或者监听的端口跟放行的端口不一致, ss 的输出对不上,就要先查服务配置而不是查防火墙。从外部机器测试时,把 127.0.0.1 换成服务器实际 IP,ping 通不代表端口通,一定要用 TCP 层的探测工具。

5.4 回滚操作

万一改完之后发现端口放行范围有误,或者中间件集群换方案了,回滚只要两步:

# 用备份覆盖修改后的文件
cp /etc/firewalld/zones/public.xml.bak.2025-01-01 /etc/firewalld/zones/public.xml

# 重新加载
firewall-cmd --reload

回滚后再次执行 firewall-cmd --zone=public --list-ports 确认端口列表已经恢复。这里要强调的是:不要手忙脚乱去删 XML 里的条目,直接恢复备份文件最可靠,因为备份文件里一定是一个曾经正常工作的状态。

6. 配置文件方案踩坑记录

直接编辑配置文件这件事,我前后踩过不少坑,挑几个最典型的分享出来,这些细节在官方文档里往往不会写。

6.1 改错了 zone,规则没生效

最大的一次失误是改完 public.xml 后 reload,端口就是不生效。排查了半天才发现那台服务器默认 zone 被改成了 dmz ,网卡绑定在 dmz 上,我一直改 public 当然没用。现在我的流程固定了:先 firewall-cmd --get-active-zones ,再决定改哪个文件,绝不跳过这一步。

6.2 XML 语法错误导致整个 zone 失效

XML 对语法零容忍,少一个闭合标签、多用半个引号,整个文件解析失败。最麻烦的是,有些版本在解析失败时会保留旧配置继续运行,有些版本可能直接不加载新配置,表现差异很大。我的解决办法是:写完后一定先跑一遍 xmllint --noout 再 reload,绝不跳过校验。另外注意别用中文引号、全角空格,编辑器自动替换最容易埋这种雷。

6.3 reload 用错了级别

有一次我在执行变更时用了 --complete-reload ,结果正在跑的业务连接全部断了一遍。那台机器上有长连接任务,本来只改个端口用 --reload 就够了,一不留神用了更粗暴的完整重载,代价是业务抖动。现在我的原则是:默认只用 --reload ,只有防火墙状态已经完全混乱、需要彻底重置时才考虑 --complete-reload 。

6.4 文件权限和属主被改乱

我遇到过一次手动编辑后文件属主变成了当前登录用户,firewalld 在回写文件时直接报权限错误。建议对 /etc/firewalld/zones/ 下的文件统一执行一次 chown root:root 和 chmod 640 ,并养成修改后检查权限的习惯。

6.5 端口范围太大导致规则异常

用过一次从 1 写到 65535 的极端范围,虽然语法上没问题,但 firewalld 处理起来并不愉快,而且这种全开行为本身就有很大安全风险。iptables 的 multiport 单条规则最多 15 个端口,范围按 2 个端口计。范围太大时要么拆段,要么考虑用 rich rule 限定来源 IP,而不是把整个防火墙打开。

6.6 忘了区分 TCP 和 UDP

同样的端口号,TCP 和 UDP 是两套完全独立的规则。中间件有些服务用 UDP 做服务发现,我只放了 TCP,结果客户端一直注册不上。查问题的时候一度以为是应用配置出错,最后看到 XML 里 UDP 端口根本没写。批量放行时建议脚本里按协议分别输出,人眼检查时也先数数量再对协议。

6.7 SELinux 在防火墙之外又拦了一道

防火墙放行只是第一层。CentOS7 默认开启 SELinux,如果服务要监听一个非标准端口,而系统的 SELinux 端口策略里没有这个端口,即使防火墙放行了,服务也可能起不来。典型场景是自定义端口上的 HTTP 服务。这种情况需要给端口打上对应的 SELinux 标签,这跟 firewalld 是两码事,排查端口不通时如果防火墙规则看着都对,记得往这个方向想。

7. 几个让批量放行更省心的管理习惯

文章最后分享几个我实际工作中沉淀下来的管理习惯,算不上什么高深技巧,但确实能省不少事。

第一,把端口清单当作跟代码一样的资产来维护。我习惯在项目仓库里放一个 ports.txt ,一行一个端口加协议加用途说明,比如 10000/tcp # 消息中间件主端口 。需要放行时直接用脚本从这个文件生成 XML,规则始终跟需求文档一一对应,不会出现“这个端口到底谁让加的”这种历史谜案。

第二,配置文件尽量少写注释。firewalld 自己会回写这些 XML 文件,每次回写都可能把注释丢掉,你精心写的注释可能过几天就没了。有需要说明的内容,写在 Git 提交信息或者变更单里,比写在配置文件里靠谱。

第三,批量部署到多台机器时,优先用模板化的配置管理工具。把 public.xml 做成模板,通过自动化工具分发到各节点,再在任务里统一执行 reload。相比手动逐台修改,模板化能保证所有机器规则完全一致,后续加端口只要改一处模板重跑一遍,几台、几十台的效率差距非常明显。

回到最初那个中间件集群需求,用配置文件方案后,6 台服务器的规则在十几分钟内全部就位,每台机器的 XML 文件内容完全一致,备份和上线记录都留在 Git 里。后来运维同事要查某台机器到底开了哪些端口,直接看仓库里的文件就行,比登录服务器敲命令翻输出舒服得多。批量放行端口这件事,核心其实不是“放行”本身,而是让规则的变更变得可见、可复现、可回滚,配置文件正是把这三件事做到位的最直接途径。

CentOS 7 从 firewalld 迁移 iptables 的四步实战指南 iptables 是 Linux 内核 netfilter 框架的原生命令行接口,其基于四表五链(filter/nat/mangle/raw;INPUT/OUTPUT/FORWARD 等)的规则模型,提供确定性、可审计性与毫秒级响应能力。相比 firewalld 的 zone/service 抽象层,iptables 直接操作内核规则,规避了 runtime 与 permanent 配置不一致、D-Bus 通信超时、自定义链隐式依赖等运维风险。它广泛应用于生产环境的容器网络治理(如修复 docker0 链缺 阅读详情

相关推荐

安路科技FPSoC开发实战:从芯片特性到边缘计算应用

本文深入解析安路科技FPSoC芯片在边缘计算领域的开发实战,重点介绍SALDRAGON系列芯片的异构计算架构优势,包括RISC-V/ARM处理器与FPGA的协同工作。通过工业控制和智能视觉应用案例,展示硬件加速实现与低功耗设计技巧,帮助开发者高效利用FPSoC进行边缘计算应用开发。

weixin_29248611的博客 366

CentOS7 Firewalld 高效批量管理:XML配置文件实现多端口一键放行

本文详细介绍了在CentOS7中使用Firewalld的XML配置文件实现高效批量管理端口的方法。通过解析配置文件结构、对比命令行操作与文件修改的优劣,提供sed批量插入端口范围的实用技巧,并分享多区域配置、性能优化及自动化运维等高级实践,帮助运维人员提升防火墙管理效率。

weixin_28327051的博客 509

AI量化学习入门指南:从零开始掌握人工智能投资策略

量化投资:利用数学模型和计算机算法进行投资决策的方法算法交易:自动执行预定义交易规则的系统机器学习:让计算机从数据中学习并改进的技术回测:用历史数据检验交易策略表现的过程特征工程:将原始数据转化为模型可理解的输入过拟合:模型过度适应历史数据,导致未来表现不佳夏普比率:衡量单位风险所获得的超额收益AI量化投资不仅仅是技术的应用,更是一种理性、系统化的投资哲学。它不追求预测市场的每一个拐点,而是通过概率思维和风险管理,在不确定性的市场中寻找统计优势。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1115

MyBatis之log4j使用及结合接口方式实现crud

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。 使用步骤 1、...

zhouym_的博客 454

Esp32蓝牙Hid调用方案 http执行设备、鼠标、键盘相关操作

本文主要介绍 Esp32 蓝牙 Hid 相关的多种操作方式,详细的设备、鼠标、键盘相关操作的 http 调用方法。下面是整理出的所有 http 调用方法和 rhino 引擎方式。本机调用的话直接使用http://localhost:8080 如果是局域网调用则使用软件里的地址 比如我的是http://192.168.1.5:8080。文件地址: https://www.123865.com/s/Qtm4jv-xyZbd?使用前需要一块烧录好的ESP32板子并在手机安装好embedded软件用于蓝牙通信。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 560

基于STM32、HAL库的MCP4013T-103E/CH 数字电位器驱动程序设计

define MCP4013_I2C_ADDR (0x5F << 1) // HAL库使用7位地址左移1位,或直接使用0xBE/0xBF。#include "i2c.h" // 包含你的I2C初始化相关的头文件,例如由CubeMX生成的 i2c.h。大于127的值会被截断。// MCP4013的读操作:主机发起读取请求,从机返回当前滑片位置的一个字节。// 使用HAL_I2C_Master_Transmit直接发送数据。// 使用HAL_I2C_Master_Receive读取一个字节。

corlin6688的博客 117

java基础-log4j关键接口和类

我们以1.X版本为例 // 使用非显式配置文件  TTCCLayout layout = new TTCCLayout(); FileAppender appender = new FileAppender(layout,"e://testxxx.log"); BasicConfigurator.configure(appender); Logger logger = Log...

一个普通程序员的碎碎念 437

【博文汇总】I2C总线学习

将这一周学习I2C总线的文章汇总一下。 基础知识学习 触发器的建立时间和保持时间 如何学习总线技术 TTL电平和CMOS电平 深入理解 关于I2C和SPI总线协议 I2C总线深入浅出 I2C总线信号时序总结 对I2C总线协议的一些理解 对I2C总线的时钟同步和总线仲裁的深入理解 I2C总线学习终结,开始SPI总线的学习 深入理解IIC总线时序

ce123的技术博客 6208

log4j指定的接口输出到指定的目标

  spring-mvc.xml     &lt;!-- extends HandlerInterceptorAdapter --&gt; &lt;mvc:interceptors&gt; &lt;bean class="com.snailteam.game.controller.TrackHandler"&gt;&lt;/bean&gt; &lt;/mvc:intercep...

xiaofancn的专栏 387

DeepSeek 赋能智慧消防:以 AI 之力筑牢城市安全 “防火墙”

在数字化浪潮下,智慧消防系统亟需先进技术提升效能。DeepSeek 凭借 Transformer 架构与混合专家架构等核心技术,具备强大的多模态数据处理与智能决策能力,且支持本地化部署,保障数据安全。其在智慧消防领域的应用成效显著,从实现火灾风险动态感知与早期精准预警,到优化智能接警调度、设备健康管理,再到辅助应急指挥与疏散,有效降低火灾风险与事故损失。未来,DeepSeek 有望在智慧消防领域持续拓展,同时也需应对技术、数据等多方面挑战。

邓邓子的博客 1679

rk3568 点亮双LVDS 屏

承接文章《rk3568点亮LCD(lvds)》中仅仅只能使用亮单LVDS;经过厂商的努力,陆续发布新补丁。目前支持双lvds显示,缺憾是需要自己额外移植相关补丁。受限于通信频率和VOP编码能力,支持最大分辨仍然是1920x1080、60fps。

weixin_35723192的博客 2991

log4j2 实际使用详解

一、目录简介 基础部分 日志框架简单比较(slf4j、log4j、logback、log4j2 ) log4j2基础知识 log4j2实用配置 实战部分 slf4j + log4j2 实际使用 二、日志框架比较(slf4j、log4j、logback、log4j2 ) 日志接口(slf4j) slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使

人不风流枉少年 14万+

智能硬件产品:做好一款电子硬件产品,工具必不可少

上到战略规划,中至运营策略,下至人性洞察,。最初做产品时,笔者从一开始就陷入到了对工具的痴迷,包括:PS、AutoCAD、PROE、犀牛、Axure、Keyshot、Altium……大概将 2 个多月的时间和精力都消耗在了学习使用工具上。通过工具的运用也确实提高了工作效率,在仅有创意的前提下通过灵活运用工具,一年内便成功申请了多个实用新型专利、设计了多款产品的高保真原型图等。正在上传…重新上传取消。

产品线负责人 1432

Log4j扩展使用--自定义输出

写在前面的话 log4j支持自定义的输出。所有的输出都实现了自Appender接口。一般来说,自定义输出值需要继承AppenderSkeleton类,并实现几个方法就可以了。 写这篇博客,我主要也是想说,框架之所有被成为是一个框架,是在帮我们完成大部分的通用代码,这就有一个前提就是说它必须要有具有良好的扩张性。方便每一个使用者来扩展,当然我们也可以根据自己的喜好...

weixin_34191845的博客 544

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

CentOS7 防火墙 Firewalld 规则配置文件批量放行端口

CentOS7防火墙 firewall 终极版

想练武,就得下功夫 4911

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

CentOS7 Firewalld批量放行端口:配置文件与命令行实战全解析

防火墙是服务器安全的第一道防线,而端口开放则是对外提供服务的必要前提。传统手工逐条添加规则的方式不仅效率低,而且容易出错,尤其在面对多节点、多端口的批量场景时更为突出。CentOS7 默认的 Firewalld 提供了动态的配置管理与灵活的 XML 配置文件,通过理解运行时配置与持久化配置的差异,掌握命令行循环、直接编辑配置文件、富规则以及端口范围等批量放行手段,可以精准且高效地完成规则下发。本文从 Firewalld 的目录结构和 public.xml 典型配置讲起,对比不同批量操作方案的适用场景,并通过

weixin_34194359的博客 944

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

firewalld批量端口放行实战:彻底搞懂XML配置文件与富规则

在Linux系统运维中,防火墙规则管理是保障服务安全与可用性的核心环节。从早期的iptables链式命令到CentOS7默认的firewalld区域模型,规则配置思路发生了根本变化:通过zone定义信任级别,以service、port和rich-rule描述放行策略。当面对批量放行数十上百个端口、按来源IP精细化管控等需求时,逐条执行 firewall-cmd 命令不仅效率低下,还难以维护与回滚。直接编辑 /etc/firewalld/zones/ 下的XML配置文件,成为大规模端口放行的最优解。结合富规则

weixin_34205826的博客 338

CentOS 7 firewalld 配置详解

1.在CentOS 7里有几种防火墙共存:firewalld、iptables、ebtables。默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。 firewalld与iptables的关系firewalld跟iptables比起来至少有两大好处:1)firewalld可以动态修改单条规则,

永&恒的博客 3449

centos7使用firewalld限制ip登陆22端口

安装firewall后(LINUX7系统一般情况下默认已安装),防火墙默认配置是只打开SSH端口的,也就是22端口,就是默认放行ssh服务,不受firewalld-cmd的规则限制。如果SSH的端口已更改成别的端口了,请切记一定在启动firewall前先修改对应服务策略中SSH的端口为你的SSH端口,文件路径:/usr/lib/firewalld/services/ssh.xml 把22改成你的远...

爷来辣的博客 1万+

CentOS 7之FirewallD与iptables的区别

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33935777的博客 1万+

CentOS 7 firewalld 配置详解 (转)

1.在CentOS 7里有几种防火墙共存:firewalld、iptables、ebtables。 默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。 firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。 而iptables里默认是每个服务是允许,需要拒绝的才去限制。 firewalld与iptables的关系 firewalld跟iptables比起来至少有两大好处: 1)firewalld可以动态修改

独乐乐不如众乐乐 5597

linux firewalld配置文件,Linux CentOS7防火墙firewalld使用说明

文章目录[隐藏]firewalld配置文件firewalld规则firewalld的9个zone介绍firewalld zone相关命令的用法firewalld service介绍CentOS7防火墙已经不是iptables了而是有一个新名字了Firewalld。firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念fi...

weixin_31090403的博客 2498

在CentOS 7上如何从FirewallD迁移至Iptables

与大多数其他 Linux 发行版一样,CentOS 7 使用 Linux 内核中的netfilter框架来访问通过网络堆栈流动的数据包。这提供了必要的接口来检查和操作数据包,以实现防火墙系统。大多数发行版使用iptables防火墙,它使用netfilter钩子来执行防火墙规则。CentOS 7 配备了一个名为firewalld的替代服务,它实现了相同的功能。虽然firewalld是一个非常强大的防火墙解决方案,具有出色的功能,但对于一些用户来说,如果他们熟悉iptables。

rubys007的博客 1182

CentOS7 firewalld 打开关闭端口

CentOS7 firewalld 打开关闭端口 1. firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : systemctl d...

Saladbobo的专栏 300

CentOS 7 firewalld 配置相关教程

一、CentOS 7的防火墙 1.1、firewalld 在CentOS 7默认是使用firewalld为防火墙。不过CentOS 7里有几种防火墙共存:firewalld、iptables、ebtables。虽然CentOS 7默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。 1

IT- 研究者 1577
上一篇: 插着网线却上不了网?DHCP排错与优化实战指南
下一篇: MongoDB 8.0 可视化工具选型与实操:从连接到查询优化
weixin_34009794
博客等级 码龄11年 3851粉丝 1132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值