FreeBSD
Atualizando FreeBSD
Ano novo, vida nova, sistema novo... com a chegada de 2007, resolvi encarar a atualização de meu FreeBSD, de 6.1 para 6.2 (que no momento encontra-se ainda em RC2, mas acho que pouca coisa vai mudar). E também fazer minha primeira postagem de 2007 :-)
Ao invés de iniciar pelo sistema, resolvi começar pelos aplicativos, autilizando primeiramente o ports. Pelas minhas experiências anteriores, a atualização é o único ponto fraco do FreeBSD. Comparando com Debian, com seu sistema via apt, é realmente chato, moroso, e frequentemente com falhas o sistema de atualização dos BSDs. Mesmo assim resolvi encarar o ports, já que o mesmo se encontra em FROZEN para o lançamento do release 6.2.
Antes de iniciar, busquei algumas dicas de atualização e achei a página
http://sig9.com/articles/ports-howto
com um howto sobre atualização do ports. Como não era exatamente o que eu pensava em fazer, resolvi seguir, pois aparenta ser uma solução bem simples.
Já tinha feito a atualização do ports via portsnap, usando as opções fetch e depois extract, então somente refiz o INDEX para iniciar a atualização.
Alterei a sequência de comandos para:
portupgrade -arRP && pkgdb -F && pkgdb -fu
A opção -P do portupgrade faz com que seja buscado primeiramente o pacote já compilado antes de re-compilar a partir dos fontes. Isso tornaria a atualização mais rápida, porém...
---> Fetching the package(s) for 'ctags-5.6' (devel/ctags)
---> Fetching ctags-5.6 fetch:
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-6.1-release/All/ctags-5.6.tbz:
File unavailable (e.g., file not found, no access)
O sistema continua buscando packages-6.1-release, o que é correto já que ainda não foi atualizado, mas os pacotes compilados só estão disponiveis pro release 6.2... sendo assim, não consegui poupar o tempo que queria...
Até o momento a atualização dos aplicativos já consumiu 20 horas, sem vistas de acabar. Ao menos está indo de uma forma menos traumáticas que das outras vezes. Vamos ver qual vai ser o resultado final...
Horário de verão
Nesse domingo de feriadão, fui saudado com uma alteração no horário de verão de minhas máquinas. Eu já sabia que isso iria acontecer algum dia, já que o governou alterou o início do mesmo para seguir o calendário eleitoral.
Porém eu aguardava algum arquivo de zona lançado oficialmente por alguma entidade como o CAIS. Como isso não ocorreu, criei meu próprio arquivo de zona, baseado em um modelo de 2005, chamado hverao2006.zic, e coloquei a data de início, 00:00 horas de 05 de novembro, e a data final, 00:00 horas de 25 de fevereiro de 2007:
Rule Brazil 2006 only - Nov 05 00:00 1 D
Rule Brazil 2007 only - Feb 25 00:00 0 S
Zone America/Sao_Paulo -3:00 Brazil BR%sT
Zone Brazil/East -3:00 Brazil BR%sT
Verifiquei se meu /etc/localtime apontava como link simbólico para /usr/share/zoneinfo/Brazil/East ou /usr/share/zoneinfo/America/Sao_Paulo(ambos são corrigidos pelo arquivo acima) e simplesmente atualizei a informação de timezone:
zic hverao2006.zic
Exportando a tela do Qemu
Hoje me deparei com mais um problema estranho, daqueles que vemos nos momentos mais indesejados durante as tarefas mais corriqueiras.
Copiei minha imagem de Windão do meu laptop, FreeBSD 6.1, para meu desktop de casa, Ubuntu 6.06.1 (LTS). Minha idéia é usar a imagem do Windão para levantar uma conexão VPN à empresa. Como o aplicativo só roda em Windão... nada resta além de instalar no gateway de casa e começar a debugar a conexão (acho que é só um IPsec, mas....).
Fiz a conexão remote via ssh com o parâmetro "-X". Qual foi minha surpresa quando recebi o seguinte erro:
helio@picasso tmp> qemu -hda windows.img
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 25 (X_SendEvent)
Resource id in failed request: 0x44
Serial number of failed request: 12
Current serial number in output stream: 17
Cara de "ué?!" e alguns momentos de leitura da manpage me deram a seguinte alternativa:
helio@picasso tmp> qemu -hda windows.img -std-vga
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 25 (X_SendEvent)
Resource id in failed request: 0x44
Serial number of failed request: 12
Current serial number in output stream: 17
A cara de "ué?!" passou para um rosto de "saco...". Testei a conexão com um simples "xclock" que funcionou perfeitamente. Fiquei mais perdido ainda. Não restando muita opção, busquei ajuda no google. Felizmente achei exatamente o que queria:
by Richard Bejtlich - US
O grande macete foi reiniciar a conexão ssh com o parâmetro "-Y". Funcionou!!!! VPN debugging, aqui vou eu!!!!!!!!!
FreeBSD e arquivos maiores de 2GB
Novo trabalho, novos desafios. Umas das primeiras coisas que fiz foi livrar meu laptop dos grilhões que o prendiam e instalar o bom e velho FreeBSD, release 6.1. Bom sistema, tudo funcionando (ou quase tudo). Eis que resolvi recuperar alguns dados que gravei em um DVD:
musashi# ls -skh /cdrom/
ls: Backup-musashi_Win2k-2005-04-17.tar: Value too large to be stored in data type
total 227 227
Backup-musashi_Win2k-2005-04-17.toc.gz
Fora o fato bizarro de eu estar tentando acessar um backup de Windows, achei sacal o problema de não conseguir ler a mídia. Buscando na rede, descobri que existe uma limitação no driver cd9660 para ler arquivos maiores de 2GB.
Uma busca árdua no google me levou ao link:
Apliquei a alteração:
--- sys/isofs/cd9660/cd9660_node.h.org Wed Mar 16 09:09:52 2005
+++ sys/isofs/cd9660/cd9660_node.h Sun Jan 8 00:14:54 2006
@@ -69,7 +69,7 @@
ino_t i_ino; /* inode number of found directory */
long iso_extent; /* extent of file */
- long i_size;
+ u_long i_size;
long iso_start; /* actual start of data of file (may be different */
/* from iso_extent, if file has extended attributes) */
ISO_RRIP_INODE inode;
Ao invés de patch, editei o arquivo não mão, já que alteração era de long para u_long somente. Vamos ver se funciona....
Controle de banda com pf
Script utilizado para realizar o controle de banda no sistema wi-fi da Futurecom2005. O primeiro problema encontrado foi que o sistema utilizava VLANs para dividir o tráfego enquanto que o controle de banda é somente possível em interfaces físicas. Felizmente funcionou a contento.
AP_NET="172.20.0.0/22" MAN_NET="192.168.48.0/0" VLAN100="201.25.199.254" VLAN200="201.34.160.254" VLAN300="201.34.161.254" VLAN400="172.20.3.254" VLAN500="192.168.48.254" VLAN100_INTF="vlan1" VLAN200_INTF="vlan2" VLAN300_INTF="vlan3" VLAN400_INTF="vlan4" VLAN500_INTF="vlan5" ME="{ 192.168.48.254, 201.25.199.254, 201.34.160.254, \ 201.34.161.254, 172.20.3.254}" SSH="{ 192.168.48.254, 201.25.199.254 }" EXT="em0" set timeout { interval 10, frag 30 } set timeout { tcp.first 120, tcp.opening 30, \ tcp.established 86400 } set timeout { tcp.closing 900, tcp.finwait 45, \ tcp.closed 90 } set timeout { udp.first 60, udp.single 30, \ udp.multiple 60 } set timeout { icmp.first 20, icmp.error 10 } set timeout { other.first 60, other.single 30, \ other.multiple 60 } set timeout { adaptive.start 0, adaptive.end 0 } set limit { states 10000, frags 5000 } ##set loginterface none set optimization normal #set block-policy drop set require-order yes set fingerprints "/etc/pf.os" scrub in all ### bandwidth altq on $EXT cbq bandwidth 15Mb queue { ots, ssh, voip, web, dhcp } queue ots bandwidth 10% priority 0 cbq(default ecn) queue ssh bandwidth 100Kb priority 7 cbq(borrow) queue voip bandwidth 30% priority 5 cbq(borrow) queue web bandwidth 60% priority 3 { http, mail, msn, dns } queue http bandwidth 60% cbq(borrow red) queue mail bandwidth 30% cbq(borrow red) queue msn bandwidth 10% cbq(borrow red) queue dns bandwidth 10% cbq(borrow red) queue dhcp bandwidth 10% priority 5 cbq(borrow) nat on $VLAN100_INTF from $AP_NET to any -> ($VLAN100_INTF) block in log all block return in on $EXT inet all queue ots pass out all #pass in all pass out inet proto tcp from any to any port 80 keep state queue http pass out on $EXT inet proto tcp from any to any port { 80, 443 } \ keep state queue http pass out on $EXT inet proto tcp from any to any port { 25, 110, 143, \ 465, 993, 995 } keep state queue mail pass in on $EXT inet proto tcp from any to any port 1863 keep state \ queue msn pass out on $EXT inet proto tcp from any to any port 1863 keep state \ queue msn pass in on $EXT inet proto tcp from any to any port 22 keep state queue \ ssh pass out on $EXT inet proto tcp from any to any port 22 keep state queue \ ssh pass in on $EXT inet proto udp from any to any port 5060 keep state \ queue voip pass out on $EXT inet proto udp from any to any port 5060 keep state \ queue voip pass in on $EXT inet proto udp from any to any port 10000:20000 keep \ state queue voip pass out on $EXT inet proto udp from any to any port 10000:20000 keep \ state queue voip pass in on $EXT inet proto udp from any to any port 67:68 keep state \ queue dhcp pass out on $EXT inet proto udp from any to any port 67:68 keep state \ queue dhcp pass in on $EXT inet proto udp from any to any port 53 keep state queue \ dns pass out on $EXT inet proto udp from any to any port 53 keep state queue \ dns #pass in quick proto tcp from any to $SSH port 22 keep state #block in proto tcp from any to any port 80 pass in quick proto tcp from any to $ME port 80 pass in quick proto udp from any to any port 53 keep state pass in quick proto udp from any port 53 to any keep state pass in quick proto { tcp, udp } from any to $ME port { 67, 68 } keep state pass in quick proto { tcp, udp } from $AP_NET to $VLAN400 port { 67, 68 } \ keep state pass in quick proto { tcp, udp } from any to $ME port { 67, 68 } keep state #pass in proto { tcp, udp, icmp } from any to any block in quick log proto { tcp, udp } from any to any port { 135, 136, 137, \ 138, 139, 445, 1433, 1434 } pass in quick proto udp from any to $ME port 161 keep state pass in quick proto udp from any port 161 to $ME keep state #block in log from any to $MAN_NET #block out log from $MAN_NET to any pass out from $ME to any #block in quick log from any to $MAN_NET #block in quick log from $MAN_NET to any pass in quick proto icmp from any to $ME keep state pass out quick proto icmp from $ME to any keep state pass out quick proto tcp from $ME to 192.168.48.0/24 keep state pass in quick proto udp from 192.168.48.0/24 to $ME port 161 keep state pass in from any to any block in log from any to $ME
Configurando pppoed no FreeBSD
Aqui segue a receita de bolo para configurar um servidor pppoe em um FreeBSD. O uso aqui foi para testes de equipamentos VoIP. O usuários são aqueles configurados no /etc/passwd do sistema, com suas respectivas senhas.
[root@hloureiro ~]# cat /etc/ppp/ppp.conf
default:
set log All Phase tun command Chat Radius
set ifaddr 10.0.0.1/24 10.0.0.100-10.0.0.199
enable pap chap passwdauth
pppoe:
set device PPPoE:sis0:dlink
enable lqr
set cd 5
set dial
set login
set redial 0 0
dlink:
allow mode direct
enable lqr proxy
enable chap pap passwdauth
set ifaddr 10.0.0.1/24 10.0.0.100-10.0.0.199
accept dns
[root@hloureiro ~]# /usr/libexec/pppoed -p dlink -F -d sis0
Sending NGM_LISTHOOKS to sis0:
Got reply from id [1]: Type ether with 1 hooks
Got [1]:orphans -> [3]:ethernet
Sending PPPOE_LISTEN to .:pppoe-5538, provider dlink
pppoed[5538]: Listening as provider dlink
Firewall em FreeBSD
Nos tempos atuais, segurança deixou de ser um item reservados às grandes redes e servidores para tornar-se um companheiro mais próximo no nosso dia-à-dia. Nesse contexto, o uso de um firewall faz-se mais que necessário.
Esse é o script de inicialização de firewall que usava em meu laptop, baseado em FreeBSD. É bem simples e permite um bom nível de segurança.
Para utilizar, basta copiar o conteúdo abaixo para o arquivo /etc/rc.firewall e adicionar a seguinte entrada em /etc/rc.conf:
firewall_enable="YES"
Para baixar as regras do firewall e permitir a passagem de todos os pacotes, basta rodar "sh /etc/rc.firewall stop".
#! /bin/sh fwcmd="/sbin/ipfw" LOOPB="127.0.0.1/8" ${fwcmd} -f flush #${fwcmd} add divert natd ip from any to any via ep0 ${fwcmd} add allow all from any to any via lo0 ${fwcmd} add deny log all from any to ${LOOPB} ${fwcmd} add deny log all from ${LOOPB} to any ${fwcmd} add allow tcp from any to any established ${fwcmd} add allow tcp from me to any keep-state ${fwcmd} add allow udp from me to any keep-state ${fwcmd} add allow udp from me to any 53 keep-state ${fwcmd} add allow icmp from me to any keep-state ${fwcmd} add allow tcp from any to me 21 keep-state ${fwcmd} add allow tcp from any to me 22 keep-state ${fwcmd} add allow tcp from any to me 23 setup ${fwcmd} add allow tcp from any to me 69 setup ${fwcmd} add allow udp from any to me 69 keep-state ${fwcmd} add allow tcp from any to me 80 setup ${fwcmd} add allow tcp from any to me 33434 setup ${fwcmd} add allow udp from any to me 33434 setup #${fwcmd} add allow tcp from any to me 6000 setup #${fwcmd} add allow icmp from any to me icmptype 11 ${fwcmd} add allow icmp from any to me ${fwcmd} add deny tcp from any to me 135-139 ${fwcmd} add deny udp from any to me 135-139 ${fwcmd} add deny log all from any to me ${fwcmd} add allow all from any to any case $1 in clean|clear|stop) ${fwcmd} -f flush ${fwcmd} add divert natd ip from any to any via ep0 ${fwcmd} add allow all from any to any ;; esac