21 março 2017

VM Linux para servir como Access Point

Tive uma necessidade em criar uma rede wifi fechada que seja compartilhada através de um notebook, com configurações específicas de DNS e DHCP, e que fosse distribuível para qualquer notebook ou computador.

Um colega realizou tentativas, utilizando aplicativos para rotear a Internet através do Windows 7, e até mesmo o roteamento nativo do Windows 10, porém a rede se demonstrou muito instável para a necessidade que tínhamos.

Então surgiu a ideia de criar uma Máquina Virtual Linux, e configurá-la para agir como um Access Point, ou seja, para que os dispositivos wi-fi se conectassem através dele.


A máquina virtual 

Escolhemos o Debian 8 como distribuição pela estabilidade e larga documentação pela Internet. Utilizamos também como gerenciador de Máquinas Virtuais o Virtual Box da Oracle.

Foi realizada a instalação do Debian, com o mínimo de pacotes e sem Interface Gráfica, para deixá-la como mínimo possível de capacidade (atualmente ocupa 3 GB no disco rígido), já que uma das necessidade é que seja distribuível para qualquer computador hospedeiro (independente de Sistema Operacional: Linux, Windows ou Mac OS).

Hardware a Placa de rede wifi nativa.

A primeira dificuldade foi fazer com que a Máquina Virtual reconhecesse a placa de rede wifi do computador hospedeiro, e esta dificuldade não foi superada. É impossível fazer com que a Máquina Virtual (VM) reconhecesse a placa de rede wifi do computador hospedeiro, pois ela cria uma placa de rede virtual do tipo ethernet, e não como alterar isso, pelo menos esse é comportamento utilizando o Virtual Box.

Utilizando Adaptador Wireless USB

A solução então foi utilizar um adaptador wireless USB. O adaptador USB deve ser instalado no computador hospedeiro, sendo instalado todos os drivers necessários para o funcionamento normal do adaptador wireless no hospedeiro. Verifique se o adaptador wireless funcionada perfeitamente no computador hospedeiro, antes de tentar instalá-lo na VM.

O próximo passo é fazer com que a VM reconhecesse o adaptador USB. Para tanto é necessário ir nas configurações da VM. Basta selecionar a VM e clicar no botão "Configurações", selecionar USB e adicionar o dispositivo USB que deseja que a VM reconheça.

Porém, não foi tão simples assim. Estava usando a versão 4.3 do Virtual Box, e ela não reconhecia o adaptador USB. Achei uma documentação dizendo que precisaria de um "Extension package", um pacote de extensão para o Virtual Box, mas mesmo instalando-o não reconhecia o dispositivo USB. Mais um pouco de documentação, e percebi que a USB 2.0 e 3.0 só funcionam a partir da versão 5 do Virtual Box.

Baixei então o Virtual Box 5.1 e seu respectivo "Extension Package". Removi a versão anterior do Virtual Box, guardei a VM criada com o Debian 8 no computador. Realizei a instalação do Virtuabol 5.1 e Extension Package. Importei a VM, e consegui realizar a configuração USB sendo reconhecido o dispositivo USB.

O caminho para fazer com que a VM reconheça um dispositivo USB, pode ser acessado nesse link aqui, no meu caso em um hospedeiro Linux, mas a parte da instalação do "Extension Pack" é igual para qualquer hospedeiro:

https://blog.butecopensource.org/dispositivos-usb-nao-sao-reconhecidos-pelo-virtualbox-host-linux/

Instalando os drivers do adaptador wifi na VM Debian 8
Após o adaptador USB wifi estar instalado e funcional na máquina hospedeira, e o adaptador também esteja visível através das configurações da VM no Virtual Box, é a vez de instalar os drivers na VM Linux Debian 8.

Primeiro é preciso descobrir o id do fabricante e do dispositivo, basta usar o comando, todos com permissão de root:

# lsusb
Bus 005 Device 001: ID 0000:0000
Bus 004 Device 006: ID 0a5c:2110 Broadcom Corp.
Bus 004 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
 
Localize o número Hexadecimal, onde os 4 primeiro dígitos é o fabricante, e os 4 após os "dois pontos" é o id do dispositivo.
Ex.: 0a5c:2110
0a5c ==> Fabricante
2110 ==> Dispositivo

Mais informações aqui na wiki do Debian

Após descobrir o id do fabricante e do dispositivo, localize o respectivo driver no nesta página da wiki do Debian. Onde é possível localizar o repositório do driver, ou baixá-lo diretamente.

No meu caso era um Realtek, e tive que usar apenas alguns comandos para atualizar via apt-get, em outros casos é necessário baixar o drivers e realizar a instalação manual.

Programa Hotspotd em python
Como o dispositivo USB funcionando na VM Debian 8, é a hora de instalar  os programas necessários para o funcionamento da VM como um access point. Resolvi usar, por escolha própria, um script em python que realiza essa tarefa. O script chama-se hotspotd, e pode ser obtido através do endereço abaixo:

https://pypi.python.org/pypi/hotspotd

Existe uma pegadinha aí na documentação do hostpotd presente no package index, pois antes de realizar a instalação do hotspotd, existe a dependência da instalação de dois pacotes do linux: hostapd e dnsmasq.

Dessa forma, antes de instalar o hotspotd é necessário instalar esses pacotes através do comando abaixo:

# apt-get install hostapd
# apt-get install dnsmasq

Após a instalação, é possível seguir a instalação do hotspotd, com os comandos:

# wget https://github.com/prahladyeri/hotspotd/raw/master/dist/hotspotd-0.1.4.tar.gz
# tar xvf hotspotd-0.1.4.tar.gz
# cd hotspotd-0.1.4/
# python setup.py install

Para iniciar a aplicação basta digitar

# python hotspotd.py start
 
A primeira vez será solicitada as configurações de SSID e senha, essas configurações serão salvadas, e o Access Point já aparece disponível na rede wifi.

Encontrei algumas falhas de autenticação, e resolvi deixar a rede aberta. Para isso deve-se alterar o arquivo:

 /usr/local/lib/python2.7/dist-packages/hotspotd/run.conf

Deixando como comentário todos as linhas referentes a autenticação, da linha

auth_algs=1

para baixo, colocando um # na frente.



Detalhes do código e funcionamento do hotspotd aqui.



VM Debian 8 iniciando com senha automática
Para que a VM inicie automaticamente e já inicie o hotspotd sem necessidade de autenticação de usuário e senha, foi necessário alterar o linux para autenticar automaticamente com um user. Para isso foi alterado o arquivo com os comandos abaixo:

# cd /etc/systemd/system
# nano getty.target.wants/getty\@getty\@tty1.service

Localize a linha:

ExecStart=-/sbin/agetty --noclear $TERM

Altere para:

ExecStart=-/sbin/agetty --noclear -a robo %I $TERM

Salve e saia pressionando CTRL+X

Isso fará com que o Debian inicie automaticamente com o user robo sem autenticação.

Para carregar e iniciar automaticamente o hotspotd, basta alterar o arquivo .bashrc do usuário, no caso usuário robo

# nano /home/robo/.bashrc

E ao final do arquivo a linha para iniciar o hotspotd, como encontrei intermitência com o adaptador USB, hora ele ficava ativo, hora fica inativo, antes de iniciar o hotspotd, eu ativo o adaptador wireless. Então as linhas ao final do .bashrc ficaram:

sudo ifconfig wlan0 up
cd /home/robo/hotspotd-0.1.6
sudo python hotspotd start

Apesar de se tratar de uma Máquina Virtual, as configurações aqui realizadas, principalmente a parte da instalação do adaptador wireless na Máquina Virtual Debian, o hotspotd e as customizações de inicialização do Debian, podem ser replicadas no Linux Raspbian (distribuição Debian para o Raspberry Pi), podendo transformar um Raspberry Pi em um Roteador WiFi.

Até a próxima.