我正在开发一个嵌入式Linux系统,其中有一个WLAN接口可以在STA和AP模式下工作。
valid interface combinations:
* #{ AP } <= 2, #{ managed } <= 2, #{ P2P-client, P2P-GO } <= 2, #{ P2P-device } <= 1, #{ IBSS } <= 1,
total <= 4, #channels <= 2
现在我已将 WLAN 接口配置为 STA 和 AP 模式(通过创建软件 AP uap0),如下所示,
# ifconfig
uap0 Link encap:Ethernet HWaddr D6:9C:DD:A0:13:78
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4749 errors:0 dropped:333 overruns:0 frame:0
TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:458760 (448.0 KiB) TX bytes:5526 (5.3 KiB)
wlan0 Link encap:Ethernet HWaddr D4:9C:DD:A0:13:78
inet addr:192.168.95.14 Bcast:192.168.95.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:36 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5425 (5.2 KiB) TX bytes:1723 (1.6 KiB)
wlan0 是物理接口,其IP 地址是从外部AP 获取的。
uap0是作为AP使用的软件接口,可以用我的手机连接。
我启用了sysctl -w net.ipv4.ip_forward=1
,并route -n
显示,
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.95.1 0.0.0.0 UG 0 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 uap0
192.168.95.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
我可以从目标板 ping 外部公共互联网,以及我手机的 IP (192.168.0.190)。
但现在我的手机无法通过WIFI(uap0)访问互联网。
在这种情况下如何配置Linux网络以使我的手机能够访问公共互联网?
答案1
根据您当前的设置,外部 AP 可能认为 192.168.95.x/24 是“边缘”网络,即据其所知,没有其他网段可通过它访问。
但是您的嵌入式Linux AP和手机之间的网络形成了另一个网段:192.168.0.x/24。外部 AP 及其之外的网络对此一无所知,事实上相同的 IP 地址范围可能在网络的其他地方使用。 (我将您的 192.168.0.x/24 网段称为“恶意”网段,而可能具有相同 IP 地址的其他网段称为“官方”网段。)
当您的手机使用 192.168.0.190 作为源 IP 向互联网发送传出数据包时,您的笔记本电脑可以将其路由到外部 AP,而外部 AP 可能会将其发送到其上游路由器...但是如果该路由器有“配置“火星过滤器”后,它将发现源地址与预期不符,即只有源地址在 192.168.95.x 范围内的数据包才应来自外部 AP,并将其过滤掉。但我们假设这不会发生。
如果来自互联网的回复到达目标地址为 192.168.0.190 的外部 AP 的上游路由器,则会发生以下两种情况之一:
- 如果存在官方 192.168.0.x/24 网段,则回复数据包将路由到那里,而不是发送到您的笔记本电脑。
- 如果路由器没有官方定义的192.168.0.x/24网段,路由器会有点困惑:“为什么我得到这个?据我所知,不存在这样的网络。它一定是一些错误路由的垃圾,所以它会被扔进垃圾桶!”它还可能将“网络无法访问”ICMP 错误消息发送回回复数据包的发送者。
换句话说,要使当前配置正常工作,您必须使外部 AP 的上游路由器了解您的 192.168.0.x/24 网络以及可以使用 192.168.95.14 作为路由器/来访问它的事实/网关。但除非您拥有上游路由器的管理访问权限,否则您无法执行此操作。
相反,您必须将嵌入式系统配置为伪装(= NAT 的一种形式)手机流量,使其看起来像是来自嵌入式系统本身:
iptables -t nat -A POSTROUTING -o wlan0 -s 192.168.0.0/24 -j MASQUERADE
(-j SNAT --to-source 192.168.95.14
也可以,但-j MASQUERADE
在外部 AP 和嵌入式系统之间使用 DHCP 的情况下效果更好。)
请注意,这意味着您的手机和互联网之间将存在“双重 NAT”,这并不理想,并且可能会导致某些网络协议出现问题。
解决了这个基本的路由问题之后,可能还有次要的问题;就像评论中提到的 dirkt 一样,您必须有某种方式为手机提供 DNS 服务器地址。