当前位置: 首页 > article >正文

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热点开启流程

  1. 应用层请求

    • 用户通过系统设置或其他应用请求开启Wi-Fi热点。
    • 应用通过WifiManagersetWifiApEnabled()方法发送请求。
  2. Framework层处理

    • WifiManager接收请求后,调用WifiServiceImplsetWifiApEnabled()方法。
    • WifiServiceImpl进一步将请求传递给WifiController
    • WifiController通过WifiStateMachine(状态机)来处理热点开启的逻辑。
    • WifiStateMachine决定需要进行的操作,包括配置热点参数(SSID、密码等)并调用NetworkManagementService来执行具体的网络操作。
  3. 与Native层的交互

    • NetworkManagementService通过NativeDaemonConnector与本地守护进程netd进行通信。
    • NativeDaemonConnector通过UNIX socket(例如/dev/socket/netd)向netd发送命令和数据。
    • netd接收命令后,解析并执行相应的操作。
  4. 配置文件生成

    • netd将接收到的热点配置(SSID、密码、加密方式等)写入到/data/misc/wifi/hostapd.conf文件中。
    • 这个配置文件是hostapd服务启动时用于配置Wi-Fi热点的关键文件。
  5. 启动hostapd服务

    • netd通过执行/system/bin/hostapd命令来启动hostapd守护进程。
    • hostapd是一个开源的、用户空间的IEEE 802.11接入点(AP)和认证服务器。
    • hostapd读取/data/misc/wifi/hostapd.conf配置文件,并根据其中的配置来启动和管理Wi-Fi热点。
  6. 状态更新和反馈

    • 一旦hostapd成功启动并配置好热点,netd会通过socket将状态更新回传给Framework层。
    • Framework层更新其内部状态,并通过系统通知或其他方式告知用户热点已成功开启。

路由表

用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

http://www.kler.cn/news/357484.html

相关文章:

  • 2025考研各省网上确认时间汇总!(别忘记)
  • Kubernetes部署练习
  • JS实现一维时间轴动画
  • Nginx超简洁知识:负载均衡-反向代理,动静分离,配置文件
  • 关于OceanBase数据库的poc测试连接经验(by liuhui)
  • ubuntu使用文本编辑器和vim,快捷键
  • 【读书笔记-《30天自制操作系统》-27】Day28
  • 【分立元件】方形贴片固定电阻器制造流程
  • 机器学习数据标准化与归一化:提升模型精度的关键
  • RabbitMQ 持久化与不公平分发
  • sqli-labs less-25a
  • 单片机的寻址方式有哪些?
  • 创建虚拟机并安装操作系统
  • 贪心day4
  • 【人工智能-初级】第9章 神经网络的基础:理解感知器与激活函数
  • qt项目使用其他项目的ui之单继承之成员变量
  • Cookie与Session的区别(特别详细)
  • C++学习路线(十六)
  • [论文阅读]: Detecting Copyrighted Content in Language Models Training Data
  • 【python】OpenCV—Fourier Transform