Autor: Carlos Roberto | Publicado: 2015-03-12T00:01:00-07:00



UM HOTSPOT PORTATIL COM RASPBERRY Pi
Com a massificação do uso de dispositivos móveis, a procura por hotspot ou wi-fi abertos tem se tornado frequente entre os usuários desses dispositivos. Tempos atrás eu estava passando alguns dias na praia num local onde meu único meio de acesso à internet era um Modem USB 3G da Huawei Technologies, modelo  E173s. Na ocasião eu dispunha de 2 laptops e 1 smartphone Samsung. Pelo fato de ser um modem usb, apesar de ser inconveniente, era possível mudar o modem de um laptop para o outro mas já o smartphone, apesar de possível, a solução para conecta-lo a internet já era um pouco mais complicada. Então, como eu dispunha de um kit composto do Raspberry Pi B+, depois de dar um giro pela internet, resolvi montar um hotspot com o RPi, o que me facilitou a conexão de qualquer dispositivo a internet, sem a necessidade de ficar trocando o modem de dispositivo.Mas ai você pergunta: pra que fazer um hotspot se você pode fazer isso com o celular? Boa pergunta. Mas a resposta é bem convincente. Por exemplo, se você precisar comprar um pacote de 10 Gb, vai pagar de 3 a 4 vezes mais se for pra celular, quando comparado com o valor para somente dados, ou seja, pra modem o valor fica bem mais em conta.
Bem, vamos ao nosso projeto. O material utilizado foi:

Software: Linux Raspberrypi 3.18.5+Hardware: Raspberry Pi B+ V 1.2Modem USB Huawei 3G, modelo E173sModem wireless USB Ralink Technologies, modelo RT530

Visão final do projeto







1. Modem switching


Alguns modens possuem dois modos de operação: modo memoria flash USB e modo modem USB.Essa foi a primeira dificuldade que encontrei: não conseguia fazer meu modem 3G mudar de memória flash para modem 3G, quando conectado ao RPi. Após tentar varias opções, a única solução que funcionou foi a seguinte: conectei o modem a um laptop Windows e, através do Painel de Controle &gt; Gerenciador de Dispositivos, verifiquei que estava usando a porta COM4. Com o utilitário putty.exe, abri uma janela terminal, conforme mostrado abaixo.





   
Na janela terminal aberta, digitei o comando "AT^U2DIAG=0", sem aspas. Ao plugar o modem novamente no RPi verifiquei que, finalmente, o modem havia chaveado pra interface correta, ou seja, modo modem com vendor=0x12d1 e product=0x1c05, como mostrado abaixo:

   
Com o modem 3G sendo reconhecido pelo kernel RPi, agora precisamos configura-lo.



2. Configurando o modem 3G no Raspberry Pi







Existem diversos tutoriais na internet que auxiliam nessa tarefa. O ponto de partida é primeiro saber se o modem foi instalado corretamente no RPi. Isso pode ser feito verificando as mensagens do comando dmesg mostrado abaixo e as informações mostradas pelo comando lsusb, como mostra a figura abaixo.





Ao executar o comando lsusb, a saida mostra que o modo modem esta ligado.





   
Na figura acima é possível ver o ID do modem 3G e o status como ligado, significando que o modem foi identificado corretamente pelo RPi.
2.1. Instale o software necessário



Para instalar os pacotes necessários para esse projeto, execute o comando abaixo. Note que amaior parte dos comandos utilizados exigem o login do root ou sudo   


# apt-get install wvdial ppp hostapd udhcpd   

Uma vez instalados os pacotes, execute o comando:

# wvdialconf /etc/wvdial.conf   

A ferramenta irá fazer uma verificação no seu modem 3G, executando uma série de comandos AT e, ao final, irá gerar o arquivo /etc/wvdial.conf com uma configuração default que você poderá editar e completar com os dados relativos a sua configuração ou adicionar uma nova configuração, usando esse default como template. Segue como ficou a configuração do meu arquivo wvdial.conf.

[Dialer 3gcon]Init1 = ATZInit2 = AT &amp;FE0V1X1 &amp;D2 &amp;C1 S0=0Init3 = AT+CGDCONT=1,"IP","zap.vivo.com.br"Password = &lt;Your Password&gt;Username = &lt;Your Login Name&gt;Modem = /dev/ttyUSB0Check Def Route = onAbort on No Dialtone = offModem Type = Analog ModemStupid Mode = 1Baud = 460800Dial Command = ATDTISDN = 0#Phome = *99#Phone = *99***1#
[Dialer Defaults]Init2 = ATQ0 V1 E1 S0=0 &amp;C1 &amp;D2Modem Type = Analog Modem; Phone = &lt;Target Phone Number&gt;ISDN = 0; Username = &lt;Your Login Name&gt;Init1 = ATZ; Password = &lt;Your Password&gt;Modem = /dev/ttyUSB0Baud = 9600     Agora execute o comando para conectar seu modem.

# wvdial 3gcon   

Você deverá obter uma tela semelhante a figura abaixo. Se tudo estiver certo, nesse ponto o RPi já tem acesso a internet via modem 3G USB. Agora vamos conectar o hotspot a internet.








3. Configurando o modem wireless (hotspot)


Udhcpd é um pequeno servidor DHCP muito utilizado em sistemas embarcados.Hostapd é um programa para gerenciar pontos de acesso (AP) sem fio e autenticação de servidores.


3.1. Configurar o servidor DHCP


Edite o arquivo  /etc/udhcpd.conf. No meu caso, veja como ficou meu udhcpd.conf
# Sample udhcpd configuration file (/etc/udhcpd.conf)# The start and end of the IP lease block
start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;192.168.1.20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#default: 192.168.0.20end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;192.168.1.254&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#default: 192.168.0.254
# The interface that udhcpd will useinterface&nbsp;&nbsp;&nbsp;&nbsp;wlan0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#default: eth0
# If remaining is true (default), udhcpd will store the time# remaining for each lease in the udhcpd leases file. This is# for embedded systems that cannot keep time between reboots.# If you set remaining to no, the absolute time that the lease# expires at will be stored in the dhcpd.leases file.
remaining&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#default: yes
# The location of the leases file
lease_file&nbsp;&nbsp;&nbsp;&nbsp;/var/lib/misc/udhcpd.leases&nbsp;&nbsp;&nbsp;&nbsp;#defualt: /var/lib/misc/udhcpd.leases
# The location of the pid file
pidfile&nbsp;&nbsp;&nbsp;&nbsp;/var/run/udhcpd.pid&nbsp;&nbsp;&nbsp;&nbsp;#default: /var/run/udhcpd.pid
opt &nbsp;&nbsp;&nbsp;&nbsp;dns&nbsp;&nbsp;&nbsp;&nbsp;8.8.8.8 8.8.4.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#opt&nbsp;&nbsp;&nbsp;&nbsp;dns&nbsp;&nbsp;&nbsp;&nbsp;192.168.10.2 192.168.10.10option&nbsp;&nbsp;&nbsp;&nbsp;subnet&nbsp;&nbsp;&nbsp;&nbsp;255.255.255.0opt&nbsp;&nbsp;&nbsp;&nbsp;router&nbsp;&nbsp;&nbsp;&nbsp;192.168.1.1option&nbsp;&nbsp;&nbsp;&nbsp;domain&nbsp;&nbsp;&nbsp;&nbsp;localoption&nbsp;&nbsp;&nbsp;&nbsp;lease&nbsp;&nbsp;&nbsp;&nbsp;864000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 10 days of seconds
Em start/stop voce define o range de IPs para seus clientes. A interface do modem wireless foi definida como sendo wlan0 (use ifconfig para saber qual a interface utilizada pelo modem). Também defini o endereço IP 192.168.1.1 como sendo o IP do meu roteador.
Crie um arquivo vazio para o DHCP lease que será preenchido mais tarde pelo udhcpd.

# touch /var/lib/misc/udhcpd.leases   

Habilite o udhcpd de forma permanente, comentando a seguinte linha no /etc/default/udhcpd

# nano /etc/default/udhcpd   

#DHCPD_ENABLED=¨no¨
Configure o udhcpd para iniciar automaticamente no boot. Use o comando abaixo.

# update-rc.d udhcpd enable   

Edite o arquivo /etc/network/interfaces e configure a nova interface que será usada para acessar o modem wireless. No meu caso, usei a interface wlan0, onde usei IP estático ou IP 192.168.1.1, o mesmo já definido no arquivo udhcpd.conf mostrado acima. Caso já exista uma definição para wlan0, comente e atualize. Abaixo segue como ficou meu arquivo interfaces.

auto loiface lo inet loopbackiface eth0 inet dhcp
iface wlan0 inet staticaddress 192.168.1.1netmask 255.255.255.0network 192.168.1.0broadcast 192.168.1.255
#allow-hotplug wlan0#iface wlan0 inet manual#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf#iface default inet dhcp
up iptables-restore &lt; /etc/iptables.ap


3.2. Configurar o servidor hostapd


Editar o arquivo /etc/hostapd/hostapd.conf,  como segue abaixo
# interface used by access pointinterface=wlan0
# firmware driverdriver=nl80211
# access point SSIDssid=HotPi
# operator mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g)hw_mode=g
# access point channelchannel=11
macaddr_acl=0auth_algs=1ignore_broadcast_ssid=0
# key management algorithmwpa_key_mgmt=WPA-PSKwpa_passphrase=&lt;your passkey&gt;wpa=2
# set cipherswpa_pairwise=TKIPrsn_pairwise=CCMP

Você pode mudar o ssid, channel e wpa_passphrase para valores da sua preferência. Note que o ssid é o nome do wi-fi que será propagado pelo hotspot pra que outros dispositivos possam se conectar a internet. Se quiser criar uma rede aberta, basta comentar o parametro wpa_passphrase.Edite o arquivo /etc/default/hostapd e faça a seguinte mudança

# DAEMON_CONF=¨¨para# DAEMON_CONF=¨/etc/hostapd/hostapd.conf¨

Ajuste o servidor hostapd para inicio automatico durante o boot, o que pode ser feito executando o comando abaixo.

# update-rc.d hostapd enable   


4. Redirecionamento via NAT (Network Address Translation)

A última parte do nosso projeto é promover o redirecionamento dos dados da rede externa (modem 3G em ppp0) para os pontos de acesso internos (modem wireless em wlan0) e vice-versa, para todos os dispositivos conectados. Isso pode ser feito configurando regras especificas para o NAT.
Habilite forwarding para IP editando o arquivo /etc/sysctl.conf
# nano /etc/sysctl.conf   
net.ipv4.ip_forward = 1
Configure as regras necessárias para roteamento na iptables
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE# iptables -A FORWARD -i ppp0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT# iptables -A FORWARD -i wlan0 -o ppp0 -j ACCEP
Salve as regras criadas na iptables para um arquivo
# sh –c ¨iptables-save &gt; /etc/iptables.ap¨   
A cada boot é necessário restabelecer as regras da iptables. Isso pode ser feito adicionando ao arquivo interfaces um comando para restaurar iptables, o que já foi feito alguns passos atrás.
# up iptables-restore &lt; /etc/iptables.ap5. Reboot

Finalmente, reboot o Raspberry Pi.
Após o reboot, execute o comando ifconfig e verifique se as interfaces possuem os IPs corretos e se estão transmitindo os dados. Segue abaixo meu ifconfig:





   
Veja que a interface ppp0 (modem 3G) está recebendo e enviando dados. O mesmo acontece com a interface wlan0, o que supõe que os dados estão fluindo de/para a internet (rede externa)  de/para os dispositivos conectados ao hotspot (rede interna).Para fazer uma verificação, ligue um laptop, tablet ou smartphone e tente conectar ao hotspot.A figura abaixo eu conectei um smartphone ao hotspot criado, ou seja, HotPi.





   
A figura mostra o resultado final conseguido com o Raspberry Pi conectado ao monitor de configuracao. O área de alcance do sinal do hotspot, proporcionado pelo modem wireless RT530, foi em torno de 30m o que é bastante razoável para a utilização em uma residência.Para uma utilização no dia a dia, voce não precisa de mouse ou monitor conectados ao RPi. Então basta voce criar um script que é executado no boot e fica rodando permanentemente. Esse script ficaria responsavel por monitorar o modem 3G e providenciar a reconexão caso ela caia.








6. Referencias

Nesse projeto, pesquisei alguns blogs e documentos que encontrei na internet. Entre os diversos encontrados, cito alguns que usei como referencia.
http://elinux.org/RPI-Wireless-Hotspothttps://www.thefanclub.co.za/how-to/how-setup-usb-3g-modem-raspberry-pi-using-usbmodeswitch-and-wvdial
http://www.revsys.com/writings/quicktips/nat.html
&nbsp;
&nbsp;