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.
quinta-feira, 25 de abril de 2013
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
...
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.
quarta-feira, 17 de abril de 2013
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".
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:
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:
- 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/configAgora 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:
Primeiramente crie o seguinte vínculo estático. Sem ele, os processos do openflow não "sobem":
Altere todos os arquivos abaixo para não se incomodar.
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>
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:
Assinar:
Postagens (Atom)