sexta-feira, 25 de outubro de 2013

Router/Firewall interno com bloqueio de tráfego e gestão web


Criação de um router interno que permita gerir o acesso à Internet através de um GUI web em PHP.

0. Pré-requisitos

1x máquina com duas placas de rede eth0 = WAN e eth1 = LAN

1. Instalação e Configuração como Router

Adicionar ao ficheiro /etc/init.d/nat:


#! /bin/bash
# Author: Mario Pinto
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="NAT router"
NAME=nat
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
WAN=eth0
# Function that starts the daemon/service
do_start()
{
   echo -n "Starting $DESC... "
   [ ! -e $PIDFILE ] || return 1
   touch $PIDFILE
   modprobe iptable_nat
   modprobe ip_conntrack_tftp # Allow TFTP UDP traffic
   modprobe ip_nat_tftp # Allow TFTP UDP traffic
   iptables -t nat -F
   iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE

   echo 1 > /proc/sys/net/ipv4/ip_forward

   return 0
}
# Function that stops the daemon/service
do_stop()
{
   echo -n "Stopping $DESC... "
   [ -e $PIDFILE ] || return 1
   iptables -t nat -F
   echo 0 > /proc/sys/net/ipv4/ip_forward
   rm $PIDFILE
   return 0
}
# MAIN OPTIONS
case "$1" in
   start)
      do_start
      case "$?" in
             0) echo "done" ;;
             1) echo "already running" ;;
             2) echo "error" ;;
      esac
      ;;
   stop)
      do_stop
      case "$?" in
                  0) echo "done" ;;
                  1) echo "not running" ;;
                  2) echo "error" ;;
      esac
      ;;
   restart)
      do_stop
          case "$?" in
                  0) echo "done" ;;
                  1) echo "not running" ;;
                  2) echo "error" ;;
          esac
      do_start
          case "$?" in
                  0) echo "done" ;;
                  1) echo "already running" ;;
                  2) echo "error" ;;
          esac
          ;;
   status)
      echo "Status: IPTABLES" >&2
      iptables -t nat -L
      echo "";echo "IP forward: ";cat /proc/sys/net/ipv4/ip_forward
      ;;

   *)
      echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
      exit 3
      ;;
esac
:


Tornar o script executável:
chmod 755 /etc/init.d/nat

Testar o serviço com:
service nat start
Starting NAT router... done

O serviço pode ser instalado para arrancar automaticamente com:

update-rc.d nat defaults


[Ainda faltam as partes de gestão e controlo]

2. Configuração do iptables

3. Scripts para configuração iptables

4. Aplicação web para gestão



Tutorial iptables:
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
TFTP UDP Traffic passthrough:
http://keystoneit.wordpress.com/2007/11/25/tftp-through-ipcop-or-other-iptables-firewalls/
Accounting:
http://www.catonmat.net/blog/traffic-accounting-with-iptables/
Bandwith:
http://jim-zimmerman.com/?p=798

quarta-feira, 2 de outubro de 2013

Configuração do Netbeans 7.3 para o JDK7

O Netbeans 7.3 tem alguns problemas com a última atualização do java 1.6u27.
Assim é necessário instalar a versão 1.7 e alterar o ficheiro de configuração do Netbeans disponível aqui: /usr/local/netbeans-7.3/etc/netbeans.conf e alterar a home do JDK:
netbeans_jdkhome="/usr/lib/jvm/java-7-oracle"

Depois para configurar 13 postos com Caixa Mágica 18 (ubuntu 12.04 LTS) foi necessário:

  • Copiar ficheiro de configuração correto (está no server em /tmp/netbeans.conf)

for IP in {1..13}; do ssh -t 192.168.1.$IP "sudo scp admin@server:/tmp/netbeans.conf /usr/local/netbeans-7.3/etc/"; done;

  • Instalar oracle-jdk7-installer:


for IP in {1..13}; do echo "Conecting to 192.168.1.$IP";ssh -t 192.168.1.$IP "echo Installing oracle-jdk7-installer...;sudo apt-get -y install oracle-jdk7-installer"; done;

Controlar o som remotamente

Utilizando ubuntu 12.04 LTS é possível controlar o volume através da linha de comandos:

Sem som
$ sudo amixer sset Master playback 0 on

No máximo
$ sudo amixer sset Master playback 64 on

No meio
$ sudo amixer sset Master playback 46 on

sexta-feira, 7 de junho de 2013

Obter informações do Hardware - dmidecode

Até agora encontrei sempre o dmidecode que permite listar todas as informações referentes ao hardware das máquinas, como modelos, características, velocidades, capacidades, etc.

Por exemplo:
# dmidecode -t system
System Information
Manufacturer: Dell Inc.
Product Name: Latitude 13
Version: Not Specified
Serial Number: .......................
UUID: ...........................
Wake-up Type: Power Switch
SKU Number: Not Specified
Family:

Handle 0x2000, DMI type 32, 11 bytes
System Boot Information
   Status: No errors detected

Para obter informações sobre o processador:
# dmidecode -t processor
Processor Information
Socket Designation: Microprocessor
Type: Central Processor
Family: Core 2 Duo
Manufacturer: Intel
.........
Core Count: 2
Core Enabled: 2
Thread Count: 2
Characteristics:
64-bit capable

Para obter informações sobre a RAM:
# dmidecode -t memory
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 8 GB
Number Of Devices: 2

Memory Device
 Size: 4096 MB
Form Factor: DIMM
Locator: DIMM_A
Type: DDR3
Type Detail: Synchronous
Speed: 1333 MHz
 .....

Memory Device
Size: No Module Installed
Form Factor: DIMM
 Locator: DIMM_B
 Type: DDR3
Type Detail: Synchronous
....

sábado, 2 de março de 2013

Proxmox - Aumentar disco de VM

Para aumentar o espaço do disco de uma máquina virtual (VM) com Windows 2003 Server é necessário fazer algumas considerações:

  • É necessário desligar a VM
  • Aumentar o disco de boot (C:) não é suportado pelo Windows 2003 Server
  • Convém efetuar backup dos dados contidos no disco a dimensionar

1. Redimensionar o disco no Proxmox

Depois de desligar a máquina convém efetuar um backup da mesma, que é uma operação algo demorada, acedendo à aba Backup e criando um novo backup.

Resta depois aceder por SSH ao servidor e efetuar o redimensionamento do disco (ficheiro) associado à VM, da qual é necessário saber o identificador, neste caso aparecerá XXX, e o nome do ficheiro, neste caso diskimage.zzz.

cd /var/lib/vz/images/XXX

Depois, utilizando o comando qemu-img é possível redimensionar o ficheiro do disco, neste caso, acrescentando 100 gigabytes ao seu tamanho atual.

qemu-img resize diskimage.zzz +100G

2. Aumentar a partição para o tamanho do disco

Após o seu redimensionamento, o disco é visto no Proxmox como tendo o novo tamanho, contudo a partição de sistema (C:) continua com o mesmo tamanho e é necessário aumentá-la.

O grande problema é que o Windows 2003 Server apenas permite efetuar o redimensionamento de partições básicas (sem ser a de sistema). Assim, será necessário utilizar um software que proceda a este redimensionamento.

Nota: No caso do Windows 7, Vista ou 2008 Server, o próprio sistema permite, no serviço de gestão de discos, efetuar o redimensionamento da partição de sistema (C:).

Assim, a forma mais simples é executar um LiveCD que possua o Gparted (por exemplo, Parted Magic ou o Grml). Neste caso, foi possível efetuar o arranque por PXE (para saber mais sobre isto veja aqui) e carregar o Grml.

Após o arranque em modo gráfico é possível aceder ao Gnome Partition Editor, onde facilmente se consegue redimensionar a partição de sistema, gravar as alterações e reiniciar a VM.

3. Arrancar o Windows 2003 Server

Ao arrancar a VM após o redimensionamento da partição, será feito um CHKDSK à partição, que permitirá assim corrigir qualquer erro que possa ter havido no processo de redimensionamento.

Após a conclusão deste processo a VM estará a funcionar como antes, apenas possuindo mais espaço em disco.

domingo, 24 de fevereiro de 2013

Raspberry Pi - Ler valores do GPIO


A primeira experiência no âmbito da leitura de valores para o Raspberry Pi, é feita com base no tutorial proposto por Matthew Kirk aqui.

0. Material necessário

  • Raspberry Pi
  • Sensor Digital de temperatura DS18B20
  • Resistência 4,7 kΩ

1. Esquema para sensor de temperatura

O sensor de temperatura utilizado é um DS18B20, que permite efetuar leituras digitais (9-bits a 12-bist) do valor da temperatura (em Celsius).
Esquema do sensor de temperatura DS18B20
Neste esquema a ligação ao Raspberry Pi efetuou-se atravé do pin7 do Raspberry Pi, correspondendo ao GPIO04.
Esquema de ligações dos componentes

2. Implementação do circuito

Novamente, muito cuidado ao ligar o circuito para não danificar o Raspberry Pi.
Breadboard com o circuito implementado e conectado ao Rpi

3. Carregar módulos necessários

A leitura da temperatura deste sensor pressupõe alguns passos iniciais de configuração, pois por defeito o Raspberry Pi não carrega os módulos que permitem a "conversa" com outros componentes.
Assim, é necessário ativar estes dois módulos:
$ sudo modprobe w1-gpio
$ sudo modprobe w1_therm

Após este passo é necessário verificar qual o número de série carregado para o sensor de temperatura.
$ ls /sys/bus/w1/devices/
28-0000025d1522  w1_bus_master1

É através deste número de série (único para cada sensor) que será possível obter a informação da temperatura do sensor.

4. Obter a temperatura

Para obter a temperatura atual basta ver o conteúdo do ficheiro:
$ cat /sys/bus/w1/devices/28-0000025d1522/w1_slave 
5c 01 4b 46 7f ff 04 10 a1 : crc=a1 YES
5c 01 4b 46 7f ff 04 10 a1 t=21750

Para ficar apenas com o valor é possível:
$ tail -n 1 /sys/bus/w1/devices/28-0000025d1522/w1_slave | tail -c 6
21875

5. Integração com PHP

Em PHP é muito fácil aceder ao ficheiro anterior e obter valor pretendido:
      if (isset($_GET['temp'])&&$_GET['temp']!=''){
        exec("sudo gpio -g mode 4 in"); // Iniciar GPIO04 = pin 7
        if ($_GET['temp']=='on'){
          // Ler do ficheiro
          $filename = '/sys/bus/w1/devices/28-0000025d1522/w1_slave';
          $mode = "r";
          $file = fopen($filename, $mode);
          if ($file){
            fgets($file); // Ler primeira linha e descartar
            $buffer = fgets($file); // Ler linha da temperatura
            fclose($file);
            $temp = substr($buffer, -6); // Obter os últimos 6 caracteres com a temperatura
            echo ""+$temp/1000+"ºC
"; // Converter para as unidades corretas
          }
        }
      }


Para executar basta aceder ao URL do ficheiro PHP e adicionar a variável temp com o valor on:
http://rpi/temp.php?temp=on


domingo, 17 de fevereiro de 2013

Raspberry Pi - Controlar GPIO em PHP

Para controlar o GPIO do Raspberry Pi através do PHP é necessário efetuar algumas configurações.

1. Configuração da execução do gpio

Adicionar no final do ficheiro de sudoers para dar permissão a www-data de execução apenas do comando gpio.
$ whereis gpio
gpio: /usr/local/bin/gpio
$ sudo visudo
...
# GPIO
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/gpio


Em PHP depois é possível fazer a chamadas à ferramenta gpio com sudo.

2. Exemplo de ficheiro PHP para controlar LED

Seguindo o setup eletrónico feito aqui, é possível criar o ficheiro led.php que acende e apaga o led através do PHP.

Exemplo led.php:

if (isset($_GET['led'])&&$_GET['led']!=''){
  exec("sudo gpio -g mode 7 out"); // Iniciar o GPIO07 = pino 26
  if ($_GET['led']=='on'){
    exec("sudo gpio -g write 7 1"); // Acender LED
  }else{
    exec("sudo gpio -g write 7 0"); // Apagar LED
  }
}

Para verificar basta ter uma hiperligação ou inserir o URL que passe a variável led com o valor on para acender o LED e qualquer outro para o apagar.

Para acender:
http://rpi/led.php?led=on

Para apagar:
http://rpi/led.php?led=off

WiringPi - GPIO na linha de comandos

Já foi visto um método que permite aceder ao GPIO do Rpi através de python, aqui.

Outra forma de interação com o GPIO é através do wiringPi que implementa uma ferramenta para a linha de comandos que pode ser invocada de várias formas.
Diretamente pelo utilizador, dentro de shell scripts, em PHP através de exec(), etc.

Esta ferramenta é da autoria de Gordon Henderson e para instalar basta seguir os passos daqui.
O manual da mesma encontra-se aqui ou na linha de comandos: man gpio.

1. Instalar o wiringPi

Instalar o git-clone:
$ sudo apt-get install git-clone

Obter o código:
$ git clone git://git.drogon.net/wiringPi

Instalar:
$ cd wiringPi
$ ./build

A partir daqui é possível utilizar a ferramenta wiringPi.

2. Utilizar o wiringPi

Implementando este circuito é possível através da linha de comandos efetuar o ligar e desligar do led.
Neste caso é indicado 7 para o GPIO07, ou seja, o pino 26. Depois escreve-se 1 para ligar ou 0 para desligar o led.
$ gpio -g mode 7 out
$ gpio -g write 7 1
$ gpio -g write 7 0

Raspberry Pi - webserver

A instalação de um webserver no Raspberry Pi permitirá ter um webserver com muito baixo consumo energético.
Mais para a frente será pretendido ter o webserver a controlar o Raspberry Pi através de PHP.

Normalmente utiliza-se o apache2 como webserver e o mysql-server para base de dados, mas devido às limitações do Raspberry Pi, a utilização do lighttpd webserver deverá ser mais adequada.

Também o mysql-server revela-se muito voraz em RAM... Após a sua instalação a RAM livre passou de 210MB para apenas 96MB...

Assim, ainda se procuram alternativas... 

1. Instalar lighttpd + php5

Para fazer este setup basta:
$ sudo apt-get install lighttpd php5-cgi

2. Configurar o webserver

A configuração básica necessária implica apenas ativar e configurar o suporte para PHP.

Para ativar o suporte para PHP no lighttpd:
$ sudo lighty-enable-mod fastcgi-php

Depois é necessário localizar o binário do php5-cgi para indicar na configuração do lighttpd:
$ whereis php5-cgi
php5-cgi: /usr/bin/php5-cgi ... ...

$ sudo nano /etc/lighttpd/conf-enabled/15-fastcgi-php.conf 

Confirmar se a o binário está correto:
"bin-path" => "/usr/bin/php5-cgi",

Caso esteja tudo correto, carregar as definições:
$ sudo service lighttpd force-reload

3. Testar o funcionamento

Depois de instalado e configurado resta testar. Para tal basta criar um ficheiro .php, por exemplo:
$ sudo nano /var/www/info.php
<?php
phpinfo();
?>

Abrir um browser e introduzir http://a.b.c.d/info.php
Onde a.b.c.d é o IP do Raspberry Pi.