Linux 网络共享

4G 或者 以太网 共享到 WIFI

Posted by LXG on March 11, 2024

create_ap

create_ap 是一个开源的命令行工具,用于在 Linux 系统中创建一个临时的无线接入点(Access Point,AP),使得你的计算机可以作为一个 WiFi 热点来分享网络连接。

依赖库 hostapd、iproute2、iw、haveged 和 dnsmasq

内核支持修改

kernel/linux-5.4/arch/arm/configs/sun8iw20p1smp_t113_auto_defconfig


CONFIG_NETFILTER=y
CONFIG_NF_CONNTRACK=m
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CONNTRACK_AMANDA=m
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
CONFIG_NF_CONNTRACK_IRC=m
CONFIG_NF_CONNTRACK_NETBIOS_NS=m
CONFIG_NF_CONNTRACK_PPTP=m
CONFIG_NF_CONNTRACK_SANE=m
CONFIG_NF_CONNTRACK_SIP=m
CONFIG_NF_CONNTRACK_TFTP=m
CONFIG_NF_CT_NETLINK=m
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
CONFIG_NETFILTER_XT_TARGET_LED=m
CONFIG_NETFILTER_XT_TARGET_LOG=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_OWNER=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
CONFIG_NETFILTER_XT_MATCH_RECENT=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
CONFIG_NETFILTER_XT_MATCH_TIME=m
CONFIG_NETFILTER_XT_MATCH_U32=m
CONFIG_IP_VS=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_AH=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_CLUSTERIP=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_TTL=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_AH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_HL=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_MATCH_MH=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_TARGET_HL=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_RAW=m

create_ap.conf


CHANNEL=default
GATEWAY=10.0.0.1
WPA_VERSION=2
ETC_HOSTS=0
DHCP_DNS=gateway
NO_DNS=0
NO_DNSMASQ=0
HIDDEN=0
MAC_FILTER=0
MAC_FILTER_ACCEPT=/etc/hostapd/hostapd.accept
ISOLATE_CLIENTS=0
SHARE_METHOD=nat
IEEE80211N=0
IEEE80211AC=0
HT_CAPAB=[HT40+]
VHT_CAPAB=
DRIVER=nl80211
NO_VIRT=0
COUNTRY=
FREQ_BAND=2.4
NEW_MACADDR=
DAEMONIZE=0
NO_HAVEGED=0
WIFI_IFACE=wlan0
INTERNET_IFACE=ppp0
SSID=WIF
PASSPHRASE=12345678
USE_PSK=0

DNS配置

platform/framework/auto/rootfs/etc/dnsmasq.conf


server=223.5.5.5
server=223.6.6.6
server=119.29.29.29
server=180.76.76.76

# 不修改etc/reslov.conf文件
no-resolv

指令解析

create_ap wlan0 ppp0 wif 12345678

将ppp0网卡的网络分享到wlan0, 热点接入名称是wif, 密码是12345678

create_ap –daemon wlan0 ppp0 wif 12345678

以守护进程(daemon)模式运行 create_ap,将ppp0网卡的网络分享到wlan0, 热点接入名称是wif, 密码是12345678,关闭终端不影响运行

pkill -f create_ap

通常能够有效地关闭通过 create_ap 创建的 Wi-Fi 热点及相关服务(如 hostapd 和 DHCP 服务器等)

create_ap –list-clients wlan0

查询当前热点连接了几个设备

查看当前正在运行的 create_ap 相关进程


sh-4.4# ps aux | grep create_ap
root     28177  0.0  1.9   2952  2152 ?        Ss   15:28   0:00 /bin/bash /usr/bin/create_ap --daemon wlan0 ppp0 wif 12345678
nobody   28288  0.0  1.6   3628  1796 ?        S    15:28   0:00 dnsmasq -C /tmp/create_ap.wlan0.conf.XXNx9MVN/dnsmasq.conf -x /tmp/create_ap.wlan0.conf.XXNx9MVN/dnsmasq.pid -l /tmp/create_ap.wlan0.conf.XXNx9MVN/dnsmasq.leases -p 5353
root     28289  0.6  1.5   2952  1728 ?        S    15:28   0:02 /bin/bash /usr/bin/create_ap --daemon wlan0 ppp0 wif 12345678
root     28293  0.0  2.7   6540  3012 ?        S    15:28   0:00 /usr/sbin/hostapd /tmp/create_ap.wlan0.conf.XXNx9MVN/hostapd.conf

基本工作原理

  1. WLAN 开启 AP 模式
  2. 创建一个虚拟网络接口: 配置无线网络参数,包括 SSID(Wi-Fi 名称)、频道(channel)、加密类型(如 WPA2)和密码
  3. DHCP 服务配置:create_ap 还会启动一个 DHCP 服务器(如 dnsmasq),自动为连接到热点的设备分配 IP 地址和其他必要的网络配置信息。
  4. create_ap 会持续监控无线网络的状态,确保其稳定性,并在遇到问题时尝试自动修复

dnsmasq 和 udhcpcd 的区别

dnsmasq侧重于在网络中提供DNS和DHCP服务,而udhcpcd则是用来接收DHCP服务的客户端组件,帮助设备自动获取网络配置。两者在功能上有一定的互补性,在很多情况下会一起部署,共同维护小型网络环境的稳定运行

正常网络共享的日志


Feb  3 09:58:45 kunos user.err smart_cabinet[1294]: Debug: hotSpot:  1
# 应用层日志:热点开关被置为 1,准备开启热点

Feb  3 09:58:45 kunos user.err smart_cabinet[1294]: Debug: "create_ap --daemon wlan0 ppp0 AAAAAA xintian888"
# 调用 create_ap 创建热点
# wlan0:AP 接口
# ppp0:上行网络(4G/拨号)
# AAAAAA:热点 SSID
# xintian888:热点密码

Feb  3 09:58:55 kunos user.err smart_cabinet[1294]: Debug: open hotspot
# 应用层确认热点启动流程已执行

Feb  3 09:58:57 kunos daemon.info dhcpcd[1150]: wlan0: carrier acquired
# dhcpcd 检测到 wlan0 物理链路已就绪
# ⚠️ 实际上 wlan0 已被用作 AP,这里 dhcpcd 不应该介入

Feb  3 09:58:57 kunos user.info kernel: [  105.822869] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
# 内核 IPv6 子系统检测到 wlan0 链路就绪(正常)

Feb  3 09:58:57 kunos daemon.info dhcpcd[1150]: wlan0: IAID a4:fd:c6:b8
# DHCP 客户端为 wlan0 分配 IPv6 IAID(无关紧要)

Feb  3 09:58:57 kunos daemon.info dhcpcd[1150]: wlan0: adding address fe80::d98a:ae5b:ecd2:287
# 为 wlan0 添加 IPv6 链路本地地址(AP 场景下一般不用)

Feb  3 09:58:57 kunos daemon.info dhcpcd[1150]: wlan0: soliciting a DHCP lease
# dhcpcd 尝试为 wlan0 申请 IPv4 DHCP 地址
# ⚠️ AP 接口不应作为 DHCP 客户端

Feb  3 09:58:59 kunos daemon.info dhcpcd[1150]: wlan0: soliciting an IPv6 router
# 尝试寻找 IPv6 路由器(AP 环境下必然失败)

Feb  3 09:59:02 kunos daemon.info dhcpcd[1150]: wlan0: probing for an IPv4LL address
# DHCP 失败后,开始探测 IPv4LL(169.254.x.x)

Feb  3 09:59:08 kunos daemon.info dhcpcd[1150]: wlan0: using IPv4LL address 169.254.253.182
# wlan0 被分配了链路本地 IPv4 地址
# ⚠️ 这是 AP 自身接口的地址,不影响客户端连网

Feb  3 09:59:08 kunos daemon.info dhcpcd[1150]: wlan0: adding route to 169.254.0.0/16
# 添加 IPv4LL 路由(基本无实际用途)

Feb  3 09:59:11 kunos daemon.warn dhcpcd[1150]: wlan0: no IPv6 Routers available
# 没有 IPv6 路由器,正常现象,可忽略

Feb  3 10:00:00 kunos daemon.info hostapd: wlan0: STA 8a:33:5d:ce:3c:00 IEEE 802.11: associated
# 客户端(MAC: 8a:33:5d:ce:3c:00)成功关联到 AP

Feb  3 10:00:00 kunos daemon.info hostapd: wlan0: STA 8a:33:5d:ce:3c:00 IEEE 802.11: associated
# 重复关联日志(hostapd 正常行为)

Feb  3 10:00:00 kunos daemon.info hostapd: wlan0: STA 8a:33:5d:ce:3c:00 RADIUS: starting accounting session B87168C018B71B4F
# 启动客户端会话记账(即便没用 RADIUS 也会打印)

Feb  3 10:00:00 kunos daemon.info hostapd: wlan0: STA 8a:33:5d:ce:3c:00 WPA: pairwise key handshake completed (RSN)
# WPA2 四次握手完成
# ✅ 密码正确,加密连接成功(非常关键的成功标志)

Feb  3 10:00:04 kunos daemon.info dnsmasq-dhcp[2772]: DHCPDISCOVER(wlan0) 8a:33:5d:ce:3c:00
# 客户端通过 wlan0 发起 DHCP 请求

Feb  3 10:00:04 kunos daemon.info dnsmasq-dhcp[2772]: DHCPOFFER(wlan0) 192.168.12.133 8a:33:5d:ce:3c:00
# dnsmasq 向客户端提供 IP 地址 192.168.12.133

Feb  3 10:00:04 kunos daemon.info dnsmasq-dhcp[2772]: DHCPDISCOVER(wlan0) 8a:33:5d:ce:3c:00
# 客户端再次发送 DISCOVER(常见重试)

Feb  3 10:00:04 kunos daemon.info dnsmasq-dhcp[2772]: DHCPOFFER(wlan0) 192.168.12.133 8a:33:5d:ce:3c:00
# 再次提供相同 IP

Feb  3 10:00:05 kunos daemon.info dnsmasq-dhcp[2772]: DHCPREQUEST(wlan0) 192.168.12.133 8a:33:5d:ce:3c:00
# 客户端请求使用该 IP

Feb  3 10:00:05 kunos daemon.info dnsmasq-dhcp[2772]: DHCPACK(wlan0) 192.168.12.133 8a:33:5d:ce:3c:00
# DHCP 确认完成
# ✅ 客户端成功获取 IP,热点连接流程结束

异常网络共享的日志

热点开启成功后的网络配置


sh-4.4# ifconfig
eth0      Link encap:Ethernet  HWaddr 7E:CF:69:97:75:CD  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:40 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:638 errors:0 dropped:0 overruns:0 frame:0
          TX packets:638 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:44387 (43.3 KiB)  TX bytes:44387 (43.3 KiB)

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:10.112.142.89  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:3488 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5031 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:1137782 (1.0 MiB)  TX bytes:1153220 (1.0 MiB)

usb0      Link encap:Ethernet  HWaddr AE:0C:29:A3:9B:6D  
          inet addr:192.168.43.100  Bcast:192.168.43.255  Mask:255.255.255.0
          inet6 addr: fe80::6929:4371:1aac:4e3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:153 errors:0 dropped:0 overruns:0 frame:0
          TX packets:180 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6200 (6.0 KiB)  TX bytes:10867 (10.6 KiB)

wlan0     Link encap:Ethernet  HWaddr A8:43:A4:FD:C6:B8  
          inet addr:192.168.12.1  Bcast:192.168.12.255  Mask:255.255.255.0
          inet6 addr: fe80::d98a:ae5b:ecd2:287/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6284 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2165 errors:0 dropped:160 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1263272 (1.2 MiB)  TX bytes:495140 (483.5 KiB)

路由配置


sh-4.4# iproute
default via 10.64.64.64 dev ppp0  metric 250 
default via 192.168.43.1 dev usb0  src 192.168.43.100  metric 300 
10.64.64.64 dev ppp0 scope link  src 10.112.142.89 
169.254.0.0/16 dev wlan0 scope link  src 169.254.253.182  metric 200 
192.168.12.0/24 dev wlan0 scope link  src 192.168.12.1 
192.168.43.0/24 dev usb0 scope link  src 192.168.43.100  metric 300