如何配置Linux组网使WLAN工作在STA和AP模式?

如何配置Linux组网使WLAN工作在STA和AP模式?

我正在开发一个嵌入式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 服务器地址。

相关内容