Android便携式WLAN热点分析
Android便携式WLAN热点分析
Platform: RK3368
OS: Android 6.0
Kernel: 3.10.0
文章目录
- Android便携式WLAN热点分析
- 分析Android开启WLAN热点的路由策略和防火墙
- 便携式WLAN热点开启流程
- 路由表
- 路由策略
- iptables(防火墙)
- 用hostapd命令手动开启WLAN热点
- 1.加载驱动
- 2.配置wlan0 IP地址
- 3.运行hostapd
- 4.配置IP路由
- 5.使能ip forward
- 6.配置iptables
分析Android开启WLAN热点的路由策略和防火墙
在Android系统中,开启便携式WLAN热点(也称为Wi-Fi热点)涉及多个组件和层之间的交互。
便携式WLAN热点开启流程
-
应用层请求:
- 用户通过系统设置或其他应用请求开启Wi-Fi热点。
- 应用通过
WifiManager的setWifiApEnabled()方法发送请求。
-
Framework层处理:
WifiManager接收请求后,调用WifiServiceImpl的setWifiApEnabled()方法。WifiServiceImpl进一步将请求传递给WifiController。WifiController通过WifiStateMachine(状态机)来处理热点开启的逻辑。WifiStateMachine决定需要进行的操作,包括配置热点参数(SSID、密码等)并调用NetworkManagementService来执行具体的网络操作。
-
与Native层的交互:
NetworkManagementService通过NativeDaemonConnector与本地守护进程netd进行通信。- NativeDaemonConnector通过UNIX socket(例如
/dev/socket/netd)向netd发送命令和数据。 netd接收命令后,解析并执行相应的操作。
-
配置文件生成:
netd将接收到的热点配置(SSID、密码、加密方式等)写入到/data/misc/wifi/hostapd.conf文件中。- 这个配置文件是hostapd服务启动时用于配置Wi-Fi热点的关键文件。
-
启动hostapd服务:
netd通过执行/system/bin/hostapd命令来启动hostapd守护进程。- hostapd是一个开源的、用户空间的IEEE 802.11接入点(AP)和认证服务器。
- hostapd读取
/data/misc/wifi/hostapd.conf配置文件,并根据其中的配置来启动和管理Wi-Fi热点。
-
状态更新和反馈:
- 一旦hostapd成功启动并配置好热点,
netd会通过socket将状态更新回传给Framework层。 - Framework层更新其内部状态,并通过系统通知或其他方式告知用户热点已成功开启。
- 一旦hostapd成功启动并配置好热点,
路由表
用ip route show table all命令查看显示所有路由表中的路由信息,对比打开热点前新增了以下:
10.0.0.0/16 dev wlan0 table local_network proto static scope link
10.0.0.0/16 dev wlan0 proto kernel scope link src 10.0.254.1
broadcast 10.0.0.0 dev wlan0 table local proto kernel scope link src 10.0.254.1
local 10.0.254.1 dev wlan0 table local proto kernel scope host src 10.0.254.1
broadcast 10.0.255.255 dev wlan0 table local proto kernel scope link src 10.0.254.1
fe80::/64 dev wlan0 table 1004 proto kernel metric 256
unreachable default dev lo table 0 proto kernel metric 4294967295 error -101
local fe80:: dev lo table local proto none metric 0
local fe80:: dev lo table local proto none metric 0
local fe80::2250:e7ff:fe53:6c8a dev lo table local proto none metric 0
ff00::/8 dev wlan0 table local metric 256
android是通过netd发送netlink请求添加这些路由;也可以手动用 ip route 命令添加:
ip route add table local_network dev wlan0 10.0.0.0/16
命令功能:向指定的路由表 local_network 中添加一条路由规则,使所有发往 10.0.0.0/16 网段的数据包都通过 wlan0 接口发送。
路由策略
用ip rule list命令查看,对比打开热点前新增了以下规则:
10500: from all oif wlan0 uidrange 0-0 lookup local_network
14000: from all oif wlan0 lookup local_network
18000: from all iif wlan0 lookup eth0
android是通过netd发送netlink请求添加这些规则;也可以手动用 ip rule 命令添加:
ip rule add priority 10500 from all oif wlan0 uidrange 0-0 table local_network
ip rule add priority 14000 from all oif wlan0 table local_network
ip rule add priority 18000 from all iif wlan0 table eth0
第一条命令:为从接口wlan0发出且用户ID范围为0的数据包添加优先级10500的规则,指定这些数据包使用名为local_network的路由表。
第二条命令:同样对wlan0接口的数据包设置规则,但未指定UID范围,默认所有UID;优先级设为14000,并使用local_network表。
第三条命令:对于通过wlan0接口接收的数据包设置规则,优先级18000,指向eth0路由表。
iptables(防火墙)
查看日志,看到netd执行了以下iptables命令:
iptables -w -D natctrl_FORWARD -i eth0 -o wlan0 -m state --state ESTABLISHED,RELATED -g natctrl_tether_counters
iptables -w -D natctrl_FORWARD -i wlan0 -o eth0 -m state --state INVALID -j DROP
iptables -w -D natctrl_FORWARD -i wlan0 -o eth0 -g natctrl_tether_counters
iptables -w -F natctrl_FORWARD
iptables -w -A natctrl_FORWARD -j DROP
iptables -w -t nat -F natctrl_nat_POSTROUTING
iptables -w -t mangle -D INPUT -i wlan0 -j MARK --set-mark 0x30063
ip6tables -w -t mangle -D INPUT -i wlan0 -j MARK --set-mark 0x30063
iptables -w -t mangle -A INPUT -i wlan0 -j MARK --set-mark 0x30063
ip6tables -w -t mangle -A INPUT -i wlan0 -j MARK --set-mark 0x30063
iptables -w -t nat -A natctrl_nat_POSTROUTING -o eth0 -j MASQUERADE
iptables -w -A natctrl_FORWARD -i eth0 -o wlan0 -m state --state ESTABLISHED,RELATED -g natctrl_tether_counters
iptables -w -A natctrl_FORWARD -i wlan0 -o eth0 -m state --state INVALID -j DROP
iptables -w -A natctrl_FORWARD -i wlan0 -o eth0 -g natctrl_tether_counters
iptables -w -D natctrl_FORWARD -j DROP
iptables -w -A natctrl_FORWARD -j DROP
这些iptables命令,主要用于配置和管理网络流量,实现共享上网、提高网络安全等目的:
1. 删除和刷新规则:
删除nat表natctrl_FORWARD链中特定的规则:
iptables -w -D natctrl_FORWARD -i eth0 -o wlan0 -m state --state ESTABLISHED,RELATED -g natctrl_tether_counters
删除允许从eth0到wlan0接口、状态为ESTABLISHED或RELATED的连接计数规则。
iptables -w -D natctrl_FORWARD -i wlan0 -o eth0 -m state --state INVALID -j DROP
删除丢弃从wlan0到eth0接口、状态为INVALID的连接规则。
iptables -w -D natctrl_FORWARD -i wlan0 -o eth0 -g natctrl_tether_counters
删除从wlan0到eth0接口的连接计数规则。
清空nat表natctrl_FORWARD链中的所有规则:
iptables -w -F natctrl_FORWARD
删除nat表natctrl_FORWARD链中的DROP动作规则:
iptables -w -D natctrl_FORWARD -j DROP
2. 配置数据包过滤:
在nat表natctrl_FORWARD链中添加DROP动作规则:
iptables -w -A natctrl_FORWARD -j DROP
在nat表natctrl_FORWARD链中添加允许从eth0到wlan0接口、状态为ESTABLISHED或RELATED的连接计数规则:
iptables -w -A natctrl_FORWARD -i eth0 -o wlan0 -m state --state ESTABLISHED,RELATED -g natctrl_tether_counters
在nat表natctrl_FORWARD链中添加丢弃从wlan0到eth0接口、状态为INVALID的连接规则:
iptables -w -A natctrl_FORWARD -i wlan0 -o eth0 -m state --state INVALID -j DROP
在nat表natctrl_FORWARD链中添加从wlan0到eth0接口的连接计数规则:
iptables -w -A natctrl_FORWARD -i wlan0 -o eth0 -g natctrl_tether_counters
3. 配置NAT规则:
清空nat表natctrl_nat_POSTROUTING链中的所有规则:
iptables -w -t nat -F natctrl_nat_POSTROUTING
在nat表natctrl_nat_POSTROUTING链中添加MASQUERADE规则,将从eth0接口发出的所有数据包进行源地址伪装:
iptables -w -t nat -A natctrl_nat_POSTROUTING -o eth0 -j MASQUERADE
4. 配置数据包标记:
删除mangle表INPUT链中对从wlan0接口流入的数据包进行标记的规则:
iptables -w -t mangle -D INPUT -i wlan0 -j MARK --set-mark 0x30063
ip6tables -w -t mangle -D INPUT -i wlan0 -j MARK --set-mark 0x30063
在mangle表INPUT链中添加对从wlan0接口流入的数据包进行标记的规则:
iptables -w -t mangle -A INPUT -i wlan0 -j MARK --set-mark 0x30063
ip6tables -w -t mangle -A INPUT -i wlan0 -j MARK --set-mark 0x30063
用hostapd命令手动开启WLAN热点
1.加载驱动
手上的设备wifi驱动不是编译为模块,而是buildin方式, 所以不用insmod, 用以下命令打开驱动:
# echo '1'> /sys/class/rkwifi/driver
2.配置wlan0 IP地址
# ifconfig wlan0 192.168.43.1 netmask 255.255.0.0
3.运行hostapd
# /system/bin/hostapd -e /data/misc/wifi/entropy.bin /data/misc/wifi/hostapd.conf
/data/misc/wifi/hostapd.conf文件内容:
interface=wlan0
driver=nl80211
ctrl_interface=/data/misc/wifi/hostapd
ssid=MyAP
channel=6
ieee80211n=1
hw_mode=g
ignore_broadcast_ssid=0
wowlan_triggers=any
4.配置IP路由
# ip route add table local_network dev wlan0 192.168.43.0/24
5.使能ip forward
# echo "1">/proc/sys/net/ipv4/ip_forward
6.配置iptables
iptables -w -D natctrl_FORWARD -i eth0 -o wlan0 -m state --state ESTABLISHED,RELATED -g natctrl_tether_counters
iptables -w -D natctrl_FORWARD -i wlan0 -o eth0 -m state --state INVALID -j DROP
iptables -w -D natctrl_FORWARD -i wlan0 -o eth0 -g natctrl_tether_counters
iptables -w -F natctrl_FORWARD
iptables -w -A natctrl_FORWARD -j DROP
iptables -w -t nat -F natctrl_nat_POSTROUTING
iptables -w -t mangle -D INPUT -i wlan0 -j MARK --set-mark 0x30063
ip6tables -w -t mangle -D INPUT -i wlan0 -j MARK --set-mark 0x30063
iptables -w -t mangle -A INPUT -i wlan0 -j MARK --set-mark 0x30063
ip6tables -w -t mangle -A INPUT -i wlan0 -j MARK --set-mark 0x30063
iptables -w -t nat -A natctrl_nat_POSTROUTING -o eth0 -j MASQUERADE
iptables -w -A natctrl_FORWARD -i eth0 -o wlan0 -m state --state ESTABLISHED,RELATED -g natctrl_tether_counters
iptables -w -A natctrl_FORWARD -i wlan0 -o eth0 -m state --state INVALID -j DROP
iptables -w -A natctrl_FORWARD -i wlan0 -o eth0 -g natctrl_tether_counters
iptables -w -D natctrl_FORWARD -j DROP
iptables -w -A natctrl_FORWARD -j DROP
相关文章:
Android便携式WLAN热点分析
Android便携式WLAN热点分析 Platform: RK3368 OS: Android 6.0 Kernel: 3.10.0 文章目录 Android便携式WLAN热点分析分析Android开启WLAN热点的路由策略和防火墙便携式WLAN热点开启流程路由表路由策略iptables(防火墙) 用hostapd命令手动开启WLAN热点1.加载驱动2.配置wlan0 …...
从经济学原理看团队分工合作
最近我接触到一个经济学概念叫"比较优势"。学过经济学的同学应该很熟悉,但为了让不了解经济学的朋友们也能明白,我们先来解释下什么是比较优势,然后再谈谈为什么我认为这个原理应当被用在团队合作的分工当中。 比较优势是19世纪初…...
企业一级流程架构规划方法
在之前关于企业业务流程规划的系列文章中,我们已经分别对企业业务流程规划的价值和原则、企业的业务流程架构的应用、两种常见的企业总体业务流程架构模式等进行了比较深入的分析和阐述,相信大多数企业同仁,已经对企业的业务流程规划…...
用ESP32驱动stt7735 TFT屏幕
操作流程: 1 在esp32项目中搜索TFT库 2 找到对应TFT_eSPI库,添加进所在项目中(这里可能下载很久) 3 找到对应屏幕文件下的User_Setup.h 修改,将驱动换成ST7735_DRIVER,并修改对应屏幕引脚和屏幕尺寸&…...
Yolo目标检测:Yolo v1简介
一、Yolo系列介绍 YOLO(You Only Look Once)是一种基于深度学习的目标检测算法,由Joseph Redmon等人于2016年提出。它的核心思想是将目标检测问题转化为一个回归问题,通过一个神经网络直接预测目标的类别和位置。YOLO算法将输入图…...
Java動態轉發代理IP詳解
Java中實現動態轉發代理IP 在Java中實現動態轉發代理IP並不複雜,通常可以通過一些開源庫和框架來實現。下麵是一個簡單的實現思路: 設置HTTP請求:在Java中,可以使用HttpURLConnection或Apache HttpClient來發送HTTP請求。在發送…...
Android15之解决gdb:Remote register badly formatted问题(二百三十六)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
【Router】路由器中NAT、NAPT、NPT是什么?
参考链接 NAT vs. NAPT: What’s the Difference? IPv6 Network Prefix Translation (NPt) | pfSense Documentation (netgate.com) 趣谈NAT/NAPT的原理,这篇不可不读! - 知乎 (zhihu.com) NAT (Network Address Translation) NAT说明 NAT&#x…...
代码随想录算法训练营第三十九天|背包问题,416. 分割等和子集
背包问题,416. 分割等和子集 背包问题416. 分割等和子集 背包问题 有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 卡玛网的…...
可调用对象和Lambda
可调用对象: 函数 函数指针 函数对象 Lambda表达式(匿名函数) 01 函数对象 如果一个类实现了"函数调用运算符()"的重载,那么这个类的对象称为函数对象(仿函数) 函数对象的行为,类似于函数,可以被调用 #include …...
华为认证HCIE存储考啥?未来发展方向在哪?一个月就能轻松拿下?
说起HCIE,很多人第一反应都是路由交换、网络安全那些“热门”方向,而存储方向反而成了小众的存在。 其实,存储的江湖地位一点不低,尤其在数据爆炸的时代。 今天咱们就聊聊HCIE存储考什么、为什么要学,以及未来的可能…...
如何让自己的网站,被更多的人搜索到(免费方案)
文章目录 一、要做时间的朋友二、需要独立IP的服务器三、SEO信息如何设置设置网站TDK生成网站地图设置搜索引擎自动提交部署SSL证书加分项:定期更新文章 引言: 许多人都有这样一个问题:做好自己的网站,如何让这个网站被更多的人浏…...
Modbus 协议:工业自动化领域的通信脊梁
一、引言 在当今工业自动化的舞台上,数据的准确传输和设备间的有效通信是实现高效生产、精准控制的关键。Modbus 协议作为一种应用广泛、历史悠久的通信协议,在工业领域发挥着举足轻重的作用。从工厂的生产线到智能建筑的控制系统,从能源管理…...
函数的力量:掌握C语言的基石
目录 前言 标准库:C语言的百宝箱 头文件:库函数的藏宝图 实例分析:计算平方根的sqrt函数 功能描述 头文件包含的重要性 库函数文档的一般格式 自定义函数:释放你的编程创造力 函数的语法形式 函数的比喻 函数的举例 简化…...
U-Boot的移植流程
U-Boot的简化版启动流程: 1、设置状态寄存器 cpsr ,使CPU进入 SVC 特权模式,并且禁止 FIQ 和 IRQ; 2、关闭看门狗、中断、MMU、Cache; 3、初始化部分寄存器和外设(时钟、串口、Flash、内存)&…...
xRDP – 在 Ubuntu 18.04、20.04、22.04、22.10、23.04(脚本版本 1.4.7)上轻松安装 xRDP
最新脚本Repository | c-nergy.be 概述 到目前为止,您应该知道 xrdp-installer 脚本旨在简化 xRDP 在 Ubuntu 操作系统上的安装和配置后操作。xRDP 是一款在 Linux 上启用远程桌面服务的软件。这意味着 Windows 用户可以使用他们的远程桌面客户端 (mst…...
[Linux网络编程]04-多进程/多线程并发服务器思路分析及实现(进程,信号,socket,线程...)
一.思路 实现一个服务器可以连接多个客户端,每当accept函数等待到客户端进行连接时 就创建一个子进程; 核心思路:让accept循环阻塞等待客户端,每当有客户端连接时就fork子进程,让子进程去和客户端进行通信,父进程用于…...
《OpenCV计算机视觉》—— 年龄与性别预测
结合以下链接中的文章有助于理解此篇案例: OpenCV中的 cnn 模块 https://blog.csdn.net/weixin_73504499/article/details/142965441?spm1001.2014.3001.5501 此案例是通过使用OpenCV中的cnn模块来调用别人已经训练好的深度学习模型,此篇案例中用到了…...
详解23种设计模式——第一部分:概述+创建型模式
目录 1. 概述 2. 创建型模式 2.1 简单(静态)工厂模式 2.1.1 介绍 2.1.2 实现 2.2 工厂模式 2.3 抽象工厂模式 2.4 单例模式 2.4.1 饿汉模式 2.4.2 懒汉模式 2.4.3 线程安全的懒汉式 2.4.4 DCL单例 - 高性能的懒汉式 2.5 建造者模式 2.6 原…...
semi-Naive Bayesian(半朴素贝叶斯)
semi-Naive Bayesian(半朴素贝叶斯) 引言 朴素贝叶斯算法是基于特征是相互独立这个假设开展的(为了降低贝叶斯公式: P ( c ∣ x ) P ( c ) P ( x ∣ c ) P ( x ) P(c|x) \frac {P(c)P(x|c)}{P(x)} P(c∣x)P(x)P(c)P(x∣c)中后验概率 P …...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
