Estou trabalhando em um sistema Linux embarcado onde há uma interface WLAN que pode funcionar tanto no modo STA quanto no modo AP.
valid interface combinations:
* #{ AP } <= 2, #{ managed } <= 2, #{ P2P-client, P2P-GO } <= 2, #{ P2P-device } <= 1, #{ IBSS } <= 1,
total <= 4, #channels <= 2
Agora configurei a interface WLAN para o modo STA e AP (criando um software AP uap0) da seguinte maneira,
# 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 é a interface física, cujo endereço IP é obtido do AP externo.
uap0 é uma interface de software usada como AP, que pode ser conectada pelo meu celular.
Eu habilitei o sysctl -w net.ipv4.ip_forward=1
, e route -n
mostra,
# 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
Posso pingar a Internet pública externa da placa de destino e o IP do meu celular (192.168.0.190).
Mas agora meu celular não consegue acessar a internet pelo WIFI (uap0).
Como configurar a rede Linux neste caso para permitir que meu celular acesse a internet pública?
Com suas configurações atuais, o AP externo provavelmente pensa que 192.168.95.x/24 é uma rede "edge", ou seja, até onde ele sabe, não há outros segmentos de rede acessíveis através dela.
Mas a rede entre seu AP Linux integrado e o celular forma outro segmento de rede: 192.168.0.x/24. O AP externo e a rede além dele não têm conhecimento sobre isso e, de fato, o mesmo intervalo de endereços IP pode estar em uso em outro lugar da rede. (Vou chamar seu segmento de rede 192.168.0.x/24 de "desonesto" e o possível outro segmento de rede com os mesmos endereços IP de "oficial").
Quando seu celular envia pacotes de saída para a Internet usando 192.168.0.190 como seu IP de origem, seu laptop pode encaminhá-lo para o AP externo, e o AP externo provavelmente o enviará para seu roteador upstream... filtro marciano" configurado, ele verá que o endereço de origem não corresponde à sua expectativa de que apenas os pacotes com endereços de origem no intervalo 192.168.95.x devem vir do AP externo e o filtrará. Mas vamos supor que isso não aconteça.
Se uma resposta da Internet chegar ao roteador upstream do AP externo com um endereço de destino de 192.168.0.190, uma das duas coisas acontecerá:
Em outras palavras, para fazer sua configuração atual funcionar, você teria que fazer o(s) roteador(es) upstream do AP externo ciente(s) de sua rede 192.168.0.x/24 e do fato de que ela pode ser acessada usando 192.168.95.14 como um roteador/ Porta de entrada. Mas, a menos que você tenha acesso administrativo ao(s) roteador(es) upstream, não poderá fazer isso.
Em vez disso, você teria que configurar seu sistema embarcado para mascarar (=uma forma de NAT) o tráfego do celular para que pareça vir do próprio sistema embarcado:
(
-j SNAT --to-source 192.168.95.14
também funcionaria, mas-j MASQUERADE
funciona melhor em situações em que o DHCP é usado entre o AP externo e o sistema integrado.)Observe que isso significa que haverá um "NAT duplo" entre seu celular e a internet, o que não é o ideal e pode causar problemas com alguns protocolos de rede.
Depois de resolver esse problema de roteamento fundamental, pode haver problemas secundários; como o dirkt mencionado nos comentários, você teria que ter alguma maneira de fornecer endereços de servidor DNS para o telefone.