quinta-feira, 25 de abril de 2013

O inferno que é inovar.

Estou há dois dias tentando instalar alguns pacotes para rodar o Openflow 1.3 em um Ubuntu 12.04. Antes havia rodado os aplicativos em uma VM pré preparada e tudo bem. Mas agora a VM que utilizava uma versão anterior do Ubuntu foi "deprecated", me vi tendo de instalar do zero.
Tenho uma certa experiência em instalar pacotes e compilar programas no Linux, já o faço há 18 anos. mesmo assim é sempre uma "quebra de pedras". São bibliotecas que faltam, instruções parciais, scripts com bugs ou que se referem a outras versões dos pacotes. Um inferno.
Alguns funcionaram, mas o LXC nem por reza braba e muito trabalho nos scripts. Outros, como o ryu, até funcionaram depois de muitos módulos adicionais que foram instalados. O floodlight foi bem simples, mas ainda não tem suporte ao OF1.3. Como os OpenWRT que possuo somente funcionam com o OF1.3 e não existe backward compatibility com o OF1.0, ele não tem serventia. Uma pena, porque parece ser uma excelente escolha de controlador OF. Vou tentar usar o ryu mesmo, porque o NOX OF1.3 funciona, mas está sendo descontinuado.
E assim vou quebrando pedras neste inferno.

sexta-feira, 19 de abril de 2013

Modificando o SSID e a chave WPA2 padrão do OpenWrt de acordo com o endereço MAC do AP

Meu problema era criar uma versão de firmware OpenWrt padrão, para ser instalado em milhares de roteadores de um mesmo modelo, o TP-Link WR-841nd. O firmware deveria ser customizado de uma forma que o técnico de instalação tivesse o menor trabalho possível.
Uma forma de customizar a configuração é copiar o diretório /etc de um roteador já configurado para a o diretório trunk/package/files da árvore de compilação do OpenWrt ,antes da compilação final da imagem (make).
Porém eu queria que cada roteador tivesse um SSID diferente, tipo REDE-XX, onde o XX é o último byte em hexa do endereço MAC da placa Wireless do roteador. Também seria importante que a chave WPA2 fosse diferente para roteador e que ela fosse de fácil acesso para o cliente. Então optei por utilizar o MAC completo como chave (sem os ":"), já que ele está impresso em uma etiqueta embaixo do equipamento.
No OpenWrt, se não existir um arquivo padrão /etc/config/wireless, ele é criado no primeiro "boot" do equipamento pelo script /sbin/wifi, que por sua vez utiliza a biblioteca /lib/wifi/mac80211.sh.
O que fiz foi alterar o arquivo trunk/package/mac80211/files/lib/wifi/mac80211.sh na árvore de compilação, alterando as últimas linhas do para o seguinte:

...
                        new_ssid="      option ssid     REDE-$(cut -f6 -d: /sys/class/ieee80211/${dev}/macaddress)"
                        new_pass="      option key      $(cut -c1-2,4-5,7-8,10-11,13-14,16-17 /sys/class/ieee80211/${dev}/macaddress)"
                cat <<EOF
config wifi-device  radio$devidx
        option type     mac80211
        option channel  ${channel}
        option hwmode   11${mode_11n}${mode_band}
$dev_id
$ht_capab
        # REMOVE THIS LINE TO ENABLE WIFI:
        #option disabled 1

config wifi-iface
        option device   radio$devidx
        option network  lan
        option mode     ap
$new_ssid
        option encryption psk2
$new_pass
...


A ideia básica do que eu fiz está aí, mas somente edite o arquivo se conseguir entender o código. 




segunda-feira, 15 de abril de 2013

Coursera e SDN

Agora estou cursando Python na Coursera,org. Fantástico, até com legendas em português no vídeo.
Mês que vem inicia um curso de Software Definied Networks e Openflow. Parece ser de nível 101, mas nunca é demais ouvir o que estão mostrando ao mundo sobre este novo paradigma, ops, "inovação não linear".

sexta-feira, 12 de abril de 2013

Compilação do OpenWRT Barrier Breaker para o TP-Link WR1043nd com suporte ao OpenFlow 1.3

O pessoal do CPQD lançou a versão de um softswitch user-space com suporte ao OpenFlow 1.3 em https://github.com/CPqD/ofsoftswitch13/wiki/OpenFlow-1.3-for-OpenWRT. As instruções de compilação apresentadas são para a versão antiga do OpenWrt, então tentei compilar uma imagem mais atual. As imagens compiladas, que devem funcionar com o TP-Link WR-1043:
- para a versão de hardware até a 1.11 (só testei com a 1.8): Openflow 1.3
- para a versão de hardware 2.0 e 2.1 (não testei): Openflow 1.3
Fiz a compilação com a versão "trunk" do OpenWRT (Barrier Breaker) e tudo funcionou muito bem.
Alternativamente, tenho estas versões compiladas com o branch estável (Attitude Adjustment 12.09) para a versão de hardware até 1.11 ( a versão 2 não é suportada):
- Firmware Openflow 1.3 e o OpenFlow 1.0 (Pantou)
Para compilá-las, utilizei uma imagem padrão do Ubuntu 12.04 para o Virtualbox, com 1,5 G de memória e 20 GB de disco, em um laptop I3 com 4 Gb de RAM, Win7 64 bits.
É imprescindível ter acesso Internet de dentro da máquina virtual. Pingue o www.google.com antes de tudo.
A "receita de bolo" exata é a seguinte:

sudo su -
Digite o seguinte  na mesma linha:
apt-get install git quilt build-essential binutils flex bison autoconf gettext   texinfo sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawk 
exit
mkdir ~/openwrt
cd ~/openwrt
svn co svn://svn.openwrt.org/openwrt/trunk/
cd trunk
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
Select Target Profile (TP-LINK TL-WR1043N/ND)
make prereq
make
cd ~/openwrt
git clone https://github.com/CPqD/openflow-openwrt.git
cd ~/openwrt/trunk/package/
ln -s ~/openwrt/openflow-openwrt/openflow-1.3/
cd ~/openwrt/trunk/
ln -s ~/openwrt/openflow-openwrt/openflow-1.3/files make menuconfig Select (*) OpenFlow package under network Select (*) tc package under network Select kmod-tun under Kernel Modules->Network Support Save and Exit make kernel_menuconfig Under Networking Support->Networking options->QoS and/or fair queueing select Hierarchical Token Bucket (HTB) Save and Exit
Dica opcional: se quiser gravar os arquivos de configuração para que eles fiquem na imagem compilada, os grave em  ~/openwrt/trunk/files/etc/config 
Agora faça a compilação final:

make
      E voilá, a sua imagem estará em ~/openwrt/trunk/bin/ar71xx/openwrt-ar71xx-generic-tl-wr1043nd-v1-jffs2-factory.bin, após a longa compilação. A copie para o seu Windows utilizando o WinSCP ou similar. Faça o upgrade do firmware pela tela de gerência web do TP-link.
Caso o roteador já esteja com o OpenWRT instalado, copie com o WinSCP (modo SCP) o arquivo para o /tmp do TP-Link e utilize o seguinte comando para fazer o upgrade:
mtd -r write /tmp/openwrt-ar71xx-generic-tl-wr1043nd-v1-jffs2-factory.bin firmware
Depois do upgrade feito, conecte o seu micro em uma das portas LAN do roteador e acesse por telnet (ou Putty) o endereço 192.168.1.1.
Primeiramente crie o seguinte vínculo estático. Sem ele, os processos do openflow não "sobem":

cd /etc 
ln -s /lib/functions.sh
cd /sbin
ln -s /usr/sbin/tc
Faça uma cópia dos arquivos originais e edite os seguintes arquivos, para que fiquem exatamente como o modelo a seguir. O endereço de gerência será alterado para 192.168.1.111, agora na porta WAN, com o endereço do controlador definido para 192.168.1.130, mas podem ser modificados (e devem ser para os demais roteadores) com a alteração dos valores em vermelho. Para ficar mais divertido, habilitei dois SSID, um WAN na a rede ligada ao plano de controle e outro na rede do plano de dados.
Altere todos os arquivos abaixo para não se incomodar.
cp /etc/config/network  /etc/config/network.ori
cp /etc/config/firewall  /etc/config/firewall.ori
cp /etc/config/wireless  /etc/config/wireless.ori
cp /etc/config/openflow  /etc/config/openflow.ori

Utilizo o "cat" para sobrescrever os arquivos originais, mas podem ser editados com o "vi".
cat > /etc/config/network
config switch
        option name 'rtl8366rb'
        option reset '1'
        option enable_vlan '1'
        option enable_learning '0'

config switch_vlan
        option device 'rtl8366rb'
        option vlan '1'
        option ports '1 5t'

config switch_vlan
        option device 'rtl8366rb'
        option vlan '2'
        option ports '2 5t'

config switch_vlan
        option device 'rtl8366rb'
        option vlan '3'
        option ports '3 5t'

config switch_vlan
        option device 'rtl8366rb'
        option vlan '4'
        option ports '4 5t'

config switch_vlan
        option device 'rtl8366rb'
        option vlan '5'
        option ports '0 5t'

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config interface
        option ifname 'eth0.1'
        option proto 'static'

config interface
        option ifname 'eth0.2'
        option proto 'static'

config interface
        option ifname 'eth0.3'
        option proto 'static'

config interface
        option ifname 'eth0.4'
        option proto 'static'

config interface 'wan'
        option ifname 'eth0.5'
        option proto 'static'
        option ipaddr '192.168.1.111'
        option netmask '255.255.255.0'
        option type 'bridge'

tecle <ctrl-d>

cat > /etc/config/wireless
config wifi-device  radio0
        option type     mac80211
        option channel  11
        option hwmode   11ng
        option path     'platform/ath9k'
        option htmode   HT20
        list ht_capab   SHORT-GI-40
        list ht_capab   DSSS_CCK-40
        # REMOVE THIS LINE TO ENABLE WIFI:
        #option disabled 1

config wifi-iface wlan0
        option device   radio0
        # option network  lan
        option mode     ap
        option ssid     OpenFlow-111-lan
        option encryption none

config wifi-iface wlan1
        option device   radio0
        option network  wan
        option mode     ap
        option ssid     OpenFlow-111-wan
        option encryption none


cat > /etc/config/openflow
config 'ofswitch'
        option 'dp' 'dp0'
        option 'dpid' '000000000111'
        option 'ofports' 'eth0.1 eth0.2 eth0.3 eth0.4 wlan0'
        option 'ofctl' 'tcp:192.168.1.130'
        option 'mode'  'outofband'


<ctrl-d>


cat > /etc/config/firewall
config defaults
        option syn_flood        1
        option input            ACCEPT
        option output           ACCEPT
        option forward          ACCEPT

<ctrl-d>

cat > /etc/config/system

config system
        option hostname 'OpenWrt'
        option timezone 'UTC'

config timeserver 'ntp'
        list server '0.openwrt.pool.ntp.org'
        list server '1.openwrt.pool.ntp.org'
        list server '2.openwrt.pool.ntp.org'
        list server '3.openwrt.pool.ntp.org'
        option enable_server '0'

config led 'led_usb'
        option name 'USB'
        option sysfs 'tp-link:green:usb'
        option trigger 'usbdev'
        option dev '1-1'
        option interval '50'

config led 'led_wlan'
        option name 'WLAN'
        option sysfs 'tp-link:green:wlan'
        option trigger 'phy0tpt'



<ctrl-d>

Depois de  terminar a edição dos arquivos, reinicialize com o "reboot" o TP-link. Não esqueça que agora deve ser utilizada a porta WAN para o acesso telnet ao endereço de gerência.
O comando "ps" deve mostrar duas linhas similares a estas:

ofdatapath ptcp:6634 -i eth0.1 eth0.2 eth0.3 eth0.4 wlan0 --no-slicing --no-local-port --pidfile -d 000000000011
ofprotocol tcp:127.0.0.1:6634 tcp:192.168.1.130 --fail=closed -D --pidfile=/var/run/ofprotocol.pid --out-of-band



Se algo der errado, há a possibilidade do System Rescue, como explicado em http://wiki.openwrt.org/doc/howto/generic.failsafe#in.failsafe.mode . A pagina do Wiki do OpenWRT para o TP-link WR-1043nd é muito útil, no caso de problemas.
Update:
O desempenho medido com o Iperf, entre dois micros ligados em dois switches separados está abaixo: