一种解决 OpenWrt 安装 docker 之后局域网的设备之间无法互相访问通信的方法

文章目录

  • 一、问题背景
  • 二、解决方案
    • (方法一)修改全局设置的 转发( forward) 为 接受(ACCEPT)
    • (方法二)设置 net.bridge.bridge-nf-call-iptables=0 并将 docker 的容器网络设置为host
  • 三、原因探析
    • (一)确认无法访问
    • (二)使用 tcpdump 检查流量
    • (三)检查防火墙配置
  • 四、为什么安装 docker 之后才会出现这样的问题呢

一、问题背景

参考 OpenWrt as Docker container host 官方的教程,可以知道只要安装了 luci-app-dockerman luci包,即可在 OpenWrt 上运行 docker,随后就可以安装各类镜像,并部署运行各类容器。

在这里插入图片描述
luci-app-dockerman 包的位置位于:LuCI > 3. Applications > luci-app-dockerman,勾选编译即可。

在这里插入图片描述
但是,安装新镜像之后发现,局域网下的设备之间不能互相访问通信了,而取消勾选luci-app-dockerman 包之后重新编译安装,即可互相访问。因此可以推测,这个问题是因为安装 docker 之后引起的问题。

本文将详细探寻 OpenWrt 安装 docker 之后局域网的设备之间无法互相访问通信 的原因,并提出一种简单的解决方案。

二、解决方案

限于笔者目前对 OpenWrt 了解还不够深入,暂且用这些方式进行解决。

先直接说解决方案:

(方法一)修改全局设置的 转发( forward) 为 接受(ACCEPT)

在 luci 管理界面,网络 > 防火墙 > 防火墙 - 区域设置 > 常规设置 中,将 转发 设置为 接受 即可,配置如下:
在这里插入图片描述
也可以直接修改配置文件,在 /etc/config/firewall 文件中,在 defaults 的配置中修改 forward 属性为 ACCEPT,相关代码如下:

config defaultsoption input 'REJECT'option output 'ACCEPT'option forward 'ACCEPT'

(方法二)设置 net.bridge.bridge-nf-call-iptables=0 并将 docker 的容器网络设置为host

由后文介绍可以知道,发生此问题是由于 docker 配置了 net.bridge.bridge-nf-call-iptables=1,导致原本隐式允许的 LAN 通信被显示拒绝。因此我们可以修改 docker 创建出来的配置文件 /etc/sysctl.d/12-br-netfilter-ip.conf,将net.bridge.bridge-nf-call-ip6tables=1 和 net.bridge.bridge-nf-call-iptables=1 注释掉即可,代码如下:

# Do not edit, changes to this file will be lost on upgrades
# /etc/sysctl.conf can be used to customize sysctl settings# enable bridge firewalling for docker
# net.bridge.bridge-nf-call-ip6tables=1
# net.bridge.bridge-nf-call-iptables=1

但此方法会导致 docker 中的 容器 不能使用 bridge 的网络模式,因此需要将 docker 中的 容器 的网路模式都修改为 host。

三、原因探析

(一)确认无法访问

首先我们需要先找到一个合适的方法确认是否无法互相访问,并确定出特征流量,方便通过流量去追踪,因此我们选用 ping 命令,去 ping 另一个设备的 IP,检查是否可以连通。可确定其是 ICMP 流量。

通过 ping DeviceIP 可以确定这两个设备无法 ping 通,也即无法互相访问
在这里插入图片描述

(二)使用 tcpdump 检查流量

tcpdump 是一个强大的命令行网络抓包工具,可以获取 OpenWrt 的指定接口的 流量。可以安装 tcpdump 包,去获取流量并进行分析。也可以在编译的时候勾选 tcpdump 包,其路径为 Network > tcpdump,如下:

在这里插入图片描述
当安装完 tcpdump 包之后,即可使用 tcpdump 命令进行抓包分析。

首先需要确认局域网的接口名,其需要在 tcpdump 被指定,用于抓取指定接口的网络流量,例如 br.lan。随后在命令之后再带上 icmp 可以过滤 icmp 流量,进行分析。命令格式如下:

tcpdump -i br-lan icmp

通过此命令,可以看到有如下的打印:

21:04:30.316761 IP Device1.lan > OpenWrt.lan: ICMP echo request, id 21972, seq 227, length 11
21:04:30.316887 IP OpenWrt.lan > Device1.lan: ICMP echo reply, id 21972, seq 227, length 1121:04:30.738076 IP Device2.lan > OpenWrt.lan: ICMP echo request, id 4441, seq 308, length 11
21:04:30.738136 IP OpenWrt.lan > Device2.lan: ICMP echo reply, id 4441, seq 308, length 1121:04:35.799464 IP Device1.lan > Device2.lan: ICMP echo request, id 1, seq 93, length 40
21:04:35.803724 IP OpenWrt.lan > Device2.lan: ICMP Device1.lan protocol 1 port 21758 unreachable, length 68
21:04:35.803613 IP Device2.lan > Device1.lan: ICMP echo reply, id 1, seq 93, length 40

这段日志来可以被分成三部分:

第一部分是 Device1 与 OpenWrt 的 ICMP 的流量,从 Device1.lan > OpenWrt.lan: ICMP echo request 和 OpenWrt.lan > Device1.lan: ICMP echo reply 可以看出 Device1 与 OpenWrt 是可以正常访问, ICMP 的流量可以正常通行。

第二部分是 Device2 与 OpenWrt 的 ICMP 的流量,从 Device2.lan > OpenWrt.lan: ICMP echo request 和 OpenWrt.lan > Device2.lan: ICMP echo reply 可以看出 Device2 与 OpenWrt 是可以正常访问, ICMP 的流量可以正常通行。

而第三部分是 Device1.lan 到 Device2.lan 的 ICMP 的流量,可以看到 Device1.lan protocol 1 port 21758 unreachable,此时流量无法到达 Device2.lan,而是直接被路由器拦截了直接通信并返回了 unreachable 消息。

因此,这表明 OpenWrt 正在阻止 LAN 设备间的直接通信,而这点极有可能是因为 LAN 区域的转发( Forward )策略可能被设置为拒绝( REJECT/DROP )

(三)检查防火墙配置

通过命令 cat /etc/config/firewall 输出防火墙的相关配置,可以得到如下结果:

config defaultsoption input 'REJECT'option output 'ACCEPT'option forward 'REJECT'config zoneoption name 'lan'option input 'ACCEPT'option output 'ACCEPT'option forward 'ACCEPT'list network 'lan'

可以看到,lan 的 zone的 forward 已经被设置为 ACCEPT (即 option forward 'ACCEPT'),但是全局配置中的 forward 被设置为了 REJECT(即 option forward 'REJECT'),因此可以推测出这里是无法相互访问的原因。

四、为什么安装 docker 之后才会出现这样的问题呢

  1. Docker 自动创建的防火墙规则
    Docker 默认会修改 iptables 规则,在 /etc/firewall.user 或自定义链中插入规则,可能导致了覆盖原有的 LAN 转发规则 或者 创建新的 DOCKER-USER 链并设置默认策略为 DROP

  2. Docker 网络接口的隔离特性
    Docker 创建的 docker0 网桥默认会:启用 net.bridge.bridge-nf-call-iptables=1(让桥接流量经过 iptables),此时触发 OpenWrt 的默认 REJECT 策略,导致原本隐式允许的 LAN 通信被显示拒绝。(参考:https://github.com/openwrt/packages/blob/master/utils/dockerd/files/etc/sysctl.d/sysctl-br-netfilter-ip.conf)
    而原始配置中,因 net.bridge.bridge-nf-call-iptables=0,虽然全局默认是 REJECT,但 br-lan 桥接流量绕过了 iptables

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/pingmian/86662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode百题斩-贪心

贪心也是一个很有意思的专题,能遇到很多神奇的思路。 但这个专题,leetcode也没放Hard,果然是怕这种玄学专题上点难度大家罩不住。那就很快了,直接过 763. Partition Labels[Medium] 思路:将字母串分组,相…

基于多径信道的分集接收技术性能优化与仿真分析

基于多径信道的分集接收技术性能优化与仿真分析 一、多径信道建模与仿真 1. 多径信道建模(MATLAB实现) classdef MultipathChannel < handlepropertiesSampleRate = 1e6; % 采样率 (Hz)MaxDoppler = 100; % 最大多普勒频移 (Hz)DelayVector = [0

LeetCode 713.乘积小于K的子数组

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。 示例 1&#xff1a; 输入&#xff1a;nums [10,5,2,6], k 100 输出&#xff1a;8 解释&#xff1a;8 个乘积小于 100 的子数组分别为&#xff1a;[10]、[5…

打破网络安全孤岛:实现防御数据协作

作者&#xff1a;来自 Elastic Crossley McEwen, Oksana Abramovych 现代网络战场不再受组织边界的限制。在各类防御网络中&#xff0c;关键的结构化、非结构化和半结构化数据分布在不同的专业环境中&#xff0c;形成孤岛 —— 从机密情报系统到作战指挥平台&#xff0c;再到战…

给定一个没有重复元素的数组,写出生成这个数组的MaxTree的函数

题目&#xff1a; 给定一个没有重复元素的数组arr&#xff0c;写出生成这个数组的MaxTree的 函数&#xff0c;要求如果数组长度为N&#xff0c;则时间复杂度为O(N)、额外空间复杂度 为O(N)。 一个数组的MaxTree定义如下。 ● 数组必须没有重复元素。 ● MaxTree是一棵二叉…

iOS 抓包实战:时间戳偏差导致的数据同步异常排查记录

“这条数据不是我填的”“我的更新被覆盖了”“两个设备显示不一致”——这些是产品上线后最令人头疼的反馈。 最近我们在一次用户同步问题排查中&#xff0c;发现表面是“数据丢失”问题&#xff0c;实则是多端数据提交时间戳处理不一致&#xff0c;导致后台认为老数据为新&a…

一款支持多日志器、多级别、多落地方式的同异步日志系统

文章目录 简介项目特点项目实现基础功能模块实现文件操作以及日期时间获取日志等级日志信息描述 异步功能模块实现缓冲区实现异步线程实现 核心功能模块实现日志格式解析落地操作实现日志器实现 测试测试环境测试参数测试结果性能分析 附件 简介 在现代软件开发与系统运维领域…

加固笔记本在户外勘探行业的应用:探索与科技的融合

在自然资源勘探、地质调查、石油天然气开发、矿产资源测绘等户外勘探行业中&#xff0c;作业环境常常复杂多变&#xff1a;风沙漫天的戈壁、雨雪交加的山区、湿热潮湿的丛林&#xff0c;甚至是极寒与高温并存的极端气候条件。面对这些挑战&#xff0c;普通的办公设备早已无法胜…

MySQL 连接指定端口后,为什么实际仍是 3306?

文章目录 MySQL 连接指定端口后&#xff0c;为什么实际仍是 3306&#xff1f;问题现象复现原因分析没有指定 -h&#xff0c;默认走的是本地 Unix Socket多实例环境中未显式指定目标地址 正确的连接方法方法一&#xff1a;添加 -h 127.0.0.1方法二&#xff1a;添加 --protocolTC…

【Android当用户两次打断息屏操作后,屏幕将会在10分钟内无法熄灭并持续点亮(关闭Android13新增的dim功能)】

UndimDetectorWakeLock持锁导致屏幕不灭问题处理SOP 问题描述 在Android T版本中&#xff0c;系统新增了SCREEN_BRIGHT_WAKE_LOCK&#xff08;UndimDetectorWakeLock&#xff09;机制。当设备处于低亮度&#xff08;dim&#xff09;状态时&#xff0c;用户两次打断屏幕熄灭操…

Tailwind CSS自定义用法

文章目录 前言✅ 一、集成 Tailwind CSS 到 React 项目1. 安装依赖2. 配置 tailwind.config.js3. 创建全局样式文件&#xff08;如 src/index.css&#xff09;tailwind base;tailwind components;tailwind utilities; 4. 在 main.tsx 或 main.jsx 中引入样式 ✅ 二、自定义样式…

linux面试常考

常用指令 常见题

Spring Boot 2.2.6调用DeepSeek API并通过SSE将流式响应推送给前端的完整实现

1. 添加依赖 (pom.xml) <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SSE 支持 --><depe…

LM1117-ADJ 简单介绍

LM1117-ADJ是一款可调输出电压的低压差线性稳压器&#xff08;LDO&#xff09;&#xff0c;具有以下关键特性和应用要点&#xff1a; 核心特性 可调输出电压 通过外部分压电阻&#xff08;R1和R2&#xff09;调节输出电压&#xff0c;范围为1.25V至13.8V。输出电压公式&#…

知名流体控制解决方案供应商“永盛科技”与商派ShopeX达成B2B商城项目合作

2025年6月&#xff0c;全球知名的工业流体控制解决方案服务商——永盛科技&#xff08;股票&#xff1a;874497&#xff09;&#xff0c;与商派ShopeX正式达成B2B商城项目合作。 此次合作将共同推动永盛科技B2B业务的数字化变革&#xff0c;提高B2B业务运营效率&#xff0c;同…

jvm简单八股

1、jvm中内存分为那几个区域&#xff0c;1.7和1.8 jvm 中主要有 程序计数器、虚拟机栈、本地方法栈、堆、方法区、直接内存。 线程私有的有&#xff1a;程序计数器、虚拟机栈、本地方法栈 线程共有的有&#xff1a;堆、方法区、直接内存 堆空间又可以分为&#xff1a;新时代、…

contOS7安装docker命令及yum源更换为国内源

docker介绍 Docker是一个开源的容器化平台,通过将应用程序及其依赖打包成轻量级、可移植的容器,确保开发、测试和部署环境的一致性。Docker的核心概念包括容器、镜像、Dockerfile和镜像仓库。容器是轻量级的虚拟化技术,共享宿主机内核但保持独立运行环境,启动快且资源占用少…

SpringBoot集成Redis-6.x版本流程

SpringBoot集成Redis是我们常见的功能&#xff0c;今天我们分享一下&#xff1a; 前言&#xff1a; 1、pom包引用 <!-- Redis Starter (默认使用 Lettuce) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…

zookeeper Curator(3):Watch事件监听

文章目录 Curator API 常用操作 Watch事件监听NodeCachePathChildrenCacheTreeCache 本章代码已分享至Gitee: https://gitee.com/lengcz/curator01 Curator API 常用操作 Watch事件监听 zookeeper 允许用户在指定节点上注册一些Watcher &#xff0c;并且在一些特定事件触发的时…

多模态融合相机L3CAM

多模态融合相机L3CAM L3CAM是Beamagine公司推出的多模态传感器融合技术&#xff0c;结合了激光雷达&#xff08;LiDAR&#xff09;和可见光摄像头&#xff0c;旨在为自动驾驶、工业机器人和其他需要精确环境感知的应用场景提供高效、安全的解决方案。 L3CAM技术参数 L3CAM结合…