我正在开发一个嵌入式 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
我可以从目标板和我的手机 IP (192.168.0.190) ping 外部公共互联网。
但是现在我的手机无法通过WIFI(uap0)上网。
在这种情况下如何配置Linux网络以使我的手机可以访问公共互联网?
使用您当前的设置,外部 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 可能会将其发送到其上游路由器......但是如果该路由器具有“ martian filter”配置后,它将发现源地址与它的预期不匹配,即只有源地址在 192.168.95.x 范围内的数据包应该来自外部 AP,并将其过滤掉。但让我们假设这不会发生。
如果来自 Internet 的回复到达目标地址为 192.168.0.190 的外部 AP 的上游路由器,将发生以下两种情况之一:
换句话说,要使您当前的配置正常工作,您必须让外部 AP 的上游路由器知道您的 192.168.0.x/24 网络以及使用 192.168.95.14 作为路由器可以访问它的事实/网关。但是除非您具有对上游路由器的管理访问权限,否则您无法执行此操作。
相反,您必须将嵌入式系统配置为伪装(=一种 NAT 形式)手机的流量,使其看起来像是来自嵌入式系统本身:
(
-j SNAT --to-source 192.168.95.14
也可以,但-j MASQUERADE
在外部 AP 和嵌入式系统之间使用 DHCP 的情况下效果更好。)请注意,这意味着您的手机和互联网之间将存在“双重 NAT”,这并不理想,并且可能会导致某些网络协议出现问题。
解决了这个基本的路由问题之后,可能还有次要问题;就像评论中提到的 dirkt 一样,您必须通过某种方式为电话提供 DNS 服务器地址。