openwrt如何关掉防火墙?

本文提供了一种简单的方法来禁用Linux系统上的防火墙服务。通过两个命令,您可以阻止防火墙服务在开机时自动启动,并立即停止正在运行的防火墙。这对于需要临时关闭防火墙进行系统维护或调试的场景非常有用。

答: 

  1.  阻止防火墙服务开机自动启动

  /etc/init.d/firewall disable

  2. 关闭防火墙

  /etc/init.d/firewall stop

转载于:https://www.cnblogs.com/dakewei/p/10784973.html

<think>我们正在处理一个具体问题:OpenWRT防火墙开启后,ping 127.0.0.1(即lo接口)时,只有第一个ping包能通过,后续包被阻塞。我们需要分析内核中涉及的模块和钩子处理逻辑。 根据之前的讨论,我们知道ping包在lo接口的传输路径会经过Netfilter的几个钩子点。现在问题表现为只有第一个包可以通过,后续包被阻塞,这通常与连接跟踪(conntrack)机制或状态防火墙规则有关。 ### 问题分析 1. **现象**:第一个ping包成功,后续包失败。 2. **可能原因**: - 连接跟踪(conntrack)表项建立异常,导致后续包被状态防火墙规则拒绝。 - 防火墙规则中针对ICMP的速率限制(如`limit`规则)导致后续包被丢弃。 - 内核参数设置问题,如`icmp_echo_ignore_all`或`icmp_echo_ignore_broadcasts`被错误设置(但通常不会只影响后续包)。 ### 关键内核模块和钩子 1. **连接跟踪(conntrack)**: - conntrack模块跟踪连接状态,在`PREROUTING`和`OUTPUT`钩子处注册,用于记录数据包的状态(如NEW, ESTABLISHED, RELATED)。 - 对于ICMP Echo Request(ping请求),第一个包会建立NEW状态,而后续的请求包(在同一个ping会话中)应该被标记为ESTABLISHED。但问题中后续包被阻塞,可能是状态转换异常。 2. **Netfilter钩子点**: - `NF_INET_PRE_ROUTING`:第一个进入的钩子,conntrack在此注册,用于处理进入的数据包(包括lo接口)。 - `NF_INET_LOCAL_OUT`:处理本机发出的数据包,conntrack同样在此注册,用于处理本机生成的包(如ping 127.0.0.1)。 - `NF_INET_LOCAL_IN`:处理进入本机的数据包(即目标地址是本机的包)。 3. **防火墙规则处理顺序**: - 防火墙规则(如nftables或iptables)在钩子点生效。OpenWRT默认使用fw4(nftables)作为防火墙。 ### 具体路径分析 对于`ping 127.0.0.1`: 1. **出方向**(本机生成ICMP Echo Request): - 经过`OUTPUT`钩子(对应nftables的`output`链)。 - conntrack在此将包标记为`NEW`状态(如果是第一个包)或`ESTABLISHED`(如果是同一个会话的后续包)。 - 防火墙规则检查:如果规则要求状态为`NEW`的包才允许通过,则后续包(状态为`ESTABLISHED`)可能被拒绝?但通常规则会允许`ESTABLISHED`状态。 2. **入方向**(lo接口收到ICMP Echo Request): - 经过`PREROUTING`钩子(conntrack更新状态)。 - 然后路由判断,进入`INPUT`钩子(对应nftables的`input`链)。 - 在这里,如果防火墙规则配置不当,可能会阻塞状态为`ESTABLISHED`的包。 ### 常见配置错误 - 在OpenWRT的默认防火墙配置中,通常允许`input`链中状态为`established,related`的包通过,也允许`icmp`类型`echo-request`(即ping请求)通过。但问题可能出在: - 用户自定义规则可能错误地限制了`lo`接口的流量。 - 连接跟踪状态异常,导致后续包不被识别为`ESTABLISHED`。 ### 排查步骤 1. **检查防火墙规则**: ```bash nft list ruleset ``` 重点检查`input`链和`output`链中针对`lo`接口和ICMP的规则,以及状态匹配规则。 2. **检查连接跟踪状态**: ```bash conntrack -L ``` 在ping过程中,观察是否有ICMP连接条目,以及状态变化(第一个包后应该会建立ESTABLISHED状态)。 3. **临时禁用连接跟踪测试**: 为了确认是否是conntrack的问题,可以尝试在`lo`接口上禁用连接跟踪: ```bash nft add table raw nft add chain raw prerouting { type filter hook prerouting priority -300\; } nft add chain raw output { type filter hook output priority -300\; } nft add rule raw prerouting iif lo ct state invalid,untracked counter accept nft add rule raw output oif lo ct state invalid,untracked counter accept ``` 然后再次测试ping。如果问题消失,则说明是conntrack相关问题。 4. **检查速率限制规则**: 在防火墙规则中,查找是否有类似`limit rate`的规则,例如: ```bash nft list chain inet firewall input | grep limit ``` 如果有,尝试移除或调整。 ### 解决方案 1. **确保`lo`接口完全放行**: 在OpenWRT防火墙配置中,通常建议放行所有`lo`接口的流量。在`/etc/config/firewall`中添加: ```bash config rule option name 'Allow-Loopback' option src 'loopback' option target 'ACCEPT' ``` 然后重启防火墙: ```bash /etc/init.d/firewall restart ``` 2. **调整连接跟踪设置**(如果怀疑conntrack问题): 可以尝试增加conntrack表的大小,或者检查是否有其他模块导致conntrack表项被提前清除。 3. **检查内核参数**: ```bash sysctl net.netfilter.nf_conntrack_icmp_timeout ``` 这个值(默认30秒)决定了ICMP连接跟踪条目的超时时间。如果设置过小,可能导致后续包不被识别。 ### 总结 问题可能出在: - 防火墙规则未正确允许`lo`接口的`ESTABLISHED`状态流量。 - 连接跟踪模块在处理本地回环ICMP流量时出现异常。 通过检查防火墙规则和连接跟踪状态,可以定位具体原因。 §§相关问题§§ 1. OpenWRT 中如何配置防火墙规则以允许本地回环(lo)接口的所有流量? 2. 如何诊断 OpenWRT 中的连接跟踪(conntrack)问题? 3. Netfilter 框架中连接跟踪(conntrack)的工作原理是什么? [^1]: 引用自用户提供的材料,描述了Netfilter钩子的作用。 [^2]: 引用自用户提供的材料,但内容不相关,故不采用。</think>### 问题分析:OpenWRT 防火墙开启后仅允许一个 ping lo 包通过 该问题通常由 **连接跟踪(conntrack)机制** 和 **状态防火墙规则** 的交互引发。核心逻辑涉及内核网络协议栈的以下模块和钩子: --- ### 关键内核模块与钩子处理逻辑 #### 1. **连接跟踪模块(nf_conntrack)** - **作用**:跟踪网络连接状态(NEW/ESTABLISHED/RELATED) - **影响路径**: $$ \text{ping进程} \xrightarrow{\text{生成ICMP包}} \text{OUTPUT钩子} \xrightarrow{\text{conntrack标记}} \text{lo接口} $$ - **问题原因**: 第一个 ICMP Echo Request 被标记为 `NEW` 状态,但后续包在 conntrack 表中被识别为 `ESTABLISHED` 状态。若防火墙规则未正确处理此状态转换,后续包将被丢弃[^1]。 #### 2. **Netfilter 钩子点** | 钩子位置 | 内核常量 | 作用 | 影响现象 | |-------------------|----------------------|-------------------------------|------------------------------| | `OUTPUT` | `NF_INET_LOCAL_OUT` | 处理本机发出的包 | 第一个包通过,后续包被丢弃 | | `INPUT` | `NF_INET_LOCAL_IN` | 处理进入本机的包 | 影响 lo 接口的入站响应 | | `PRE_ROUTING` | `NF_INET_PRE_ROUTING`| 路由前处理(含 conntrack) | 状态标记关键点 | #### 3. **防火墙规则处理流程(以 nftables 为例)** ```mermaid graph LR A[ping 127.0.0.1] --> B{OUTPUT 链} B -->|状态:NEW| C[允许通过] B -->|状态:ESTABLISHED| D[规则不匹配? 丢弃] C --> E[lo接口] E --> F{INPUT 链} F -->|状态:ESTABLISHED| G[规则不匹配? 丢弃] ``` --- ### 根本原因诊断 1. **状态规则缺失** - 默认规则可能仅允许 `ct state new` 的 ICMP 包,但未放行 `established` 状态: ```bash nft list chain inet fw4 input | grep icmp # 常见问题规则:icmp type echo-request ct state new accept ``` 2. **连接跟踪表异常** - ICMP 会话状态未正确更新: ```bash conntrack -L -p icmp # 查看ICMP连接状态 # 正常应显示:icmp 1 30 src=127.0.0.1 dst=127.0.0.1 [ESTABLISHED] ``` 3. **内核参数冲突** - 本地回环特殊处理参数被覆盖: ```bash sysctl net.ipv4.conf.all.route_localnet # 应为1 ``` --- ### 解决方案 #### 步骤 1:修正防火墙规则 在 `/etc/config/firewall` 中添加: ```bash config rule option name 'Allow-Loopback-ICMP' option src 'loopback' option proto 'icmp' option target 'ACCEPT' ``` 或在 nftables 直接添加: ```bash nft add rule inet fw4 input iif "lo" ct state established accept nft add rule inet fw4 output oif "lo" ct state established accept ``` #### 步骤 2:验证连接跟踪状态 ```bash # 监控conntrack事件 conntrack -E -p icmp # 正常输出应包含: [NEW] icmp 1 30 src=127.0.0.1 dst=127.0.0.1 [UPDATE] icmp 1 30 src=127.0.0.1 ... [ASSURED] ``` #### 步骤 3:调整内核参数 ```bash echo 1 > /proc/sys/net/ipv4/conf/all/route_localnet sysctl -w net.netfilter.nf_conntrack_icmp_timeout=30 # 确保超时>ping间隔 ``` --- ### 技术原理验证 通过内核跟踪点验证数据包路径: ```bash # 监控OUTPUT钩子 trace-cmd record -e netfilter -e skb # 执行 ping -c 2 127.0.0.1 trace-cmd report | grep -i "icmp.*OUTPUT" ``` 正常应显示两条 ICMP 输出事件,若仅一条则证明后续包在钩子点被丢弃。 > **最终效果**:修正后,`ping 127.0.0.1` 将持续通联,因 `ESTABLISHED` 状态包被正确放行[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值