Subversion (SVN) on CentOS Autenticando no LDAP

Instalando SVN(subversion) no Centos com ldap

    Pre-Requisitos:

  1. - apache2 instalado e funcionando

  2. - Servidor ldap

Instalação:

  1. - Instalar o subversion:

    #yum install mod_dav_svn subversion

  2. - Criar pasta de repositorios:

    #mkdir /var/svn

  3. - configurar apache:

    #vim /etc/httpd/conf.d/subversion.conf

    Editar para que fique da seguinte forma:

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

  # Enable Subversion
    DAV svn

  # Directory containing all repository for this path
    SVNPath                       /var/svn/repos
    SVNAutoversioning                   on

  # LDAP Authentication & Authorization is final; do not check other databases
    AuthBasicProvider                   ldap
    AuthzLDAPAuthoritative              off

  # Do basic password authentication in the clear
    AuthType                            Basic

  # The name of the protected area or "realm"
    AuthName                            "Subversion Repository"

  # The LDAP query URL
    AuthLDAPURL                         "ldap://:389/dc=example,dc=co.za

  # Require authentication for this Location
    Require valid-user


    4 – Criar repositorio:

    #cd /var/svn

    #svnadmin create repos

    #service httpd restart

    5 – Setar permissões na pasta:

    #chown -R apache:apache /opt/svn

    6 – Tudo pronto, agora acesse pelo browser ou svn client :

    #http://192.168.50.171/repos

Instalar OpenLdap no CentOS

Instalação e configuração OpenLdap on CentOS 5

  1. Instalação dos pacotes:

    #yum install openldap openldap-servers openldap-devel compat-openldap php-ldap openldap-clients

  2. Gerar Hash da senha para que não fique em clear text no arquivo de configuração:

    #slappasswd -s sua_senha

    Resultado: {SSHA}cstId8RjQKllsfdVDoStH0lxkQQ63ooYa

  3. Editar o arquivo de configuração através do comando:

    #vim /etc/openldap/slapd.conf

    Para que fique da seguinte maneira:

include /etc/openldap/schema/core.schema

include /etc/openldap/schema/cosine.schema

include /etc/openldap/schema/inetorgperson.schema

include /etc/openldap/schema/nis.schema

allow bind_v2

pidfile /var/run/openldap/slapd.pid

argsfile /var/run/openldap/slapd.args

database bdb

suffix “dc=ctic,dc=cesupa”

rootdn “cn=Manager,dc=ctic,dc=cesupa”

rootpw {SSHA}cstId8RjQKllsfdVDoStH0lxkQQ63ooYa

##Colocar a senha gerada anteriormente.

directory /var/lib/ldap

index objectClass eq,pres

index ou,cn,mail,surname,givenname eq,pres,sub

index uidNumber,gidNumber,loginShell eq,pres

index uid,memberUid eq,pres,sub

index nisMapName,nisMapEntry eq,pres,sub

  1. OpenLdap Configurado, agora iremos iniciar o serviço:

    #service ldap start

  2. Para testar o funcionamento do Oldap, execute o seguinte comando, se a resposta não for: “ldap_bind: Can’t contact LDAP server (-1) ” o serviço estará executando.

    #ldapsearch -x

  3. criando a base. Crie um arquivo de nome topo.ldif e insira o seguinte conteudo:

    dn: dc=ctic,dc=cesupa

    objectclass: dcObject

    objectclass: organization

    o: Ctic Openldap

    dc: ctic

    dn: cn=Manager,dc=ctic,dc=cesupa

    objectclass: organizationalRole

    cn: Manager

  4. A partir deste momento, eu recomendo a utilização de um software de administração de Ldap para criar as OU’s e usuários.

    Utilizei o software LdapAdmin, disponivel em:http://ldapadmin.sourceforge.net/



    Espero ter ajudado, Abraços!!!

DNS Externo, Master e Slave com reverso no Debian

Especificações

*Servidor DNS MASTER:

nome: ns1

fqdn: ns1.meudominio.com

ip válido: 221.164.109

*Servidor DNS SLAVE:

nome: ns2

fqdn: ns2.meudominio.com

ip válido: 221.164.180.108

Obs.: Os ips acima mencionados, são meros exemplos!

1-instalar o debian básico

2 – adicionar “deb http://ftp.debian.org/debian/ lenny main contrib” ao source.list

3 –comando para serem executados tanto no master como no slave:

apt-get update

apt-get install ssh

apt-get install tcpdumb (debug)

apt-get upgrade

4 – atualizar o sistema:

apt-get update

apt-get dist-upgrade

5 – instalar o bind

apt-get install bind9

6 – configurar os forwarders, no meu caso, da locaweb:

editar o arquivo /etc/bind/named.conf.options, descomente as linhas forwarders e insira os seguintes ips(locaweb, use o seu!)

ns1.locaweb.com.br = 189.126.108.2

ns2.locaweb.com.br = 201.76.40.2

sendo assim seus forwarders ficarão assim:

forwarders {

189.126.108.2;

201.76.40.2;

};

7 – configurar o resolv.conf

edite o arquivo /etc/resolv.conf

para que fique da seguinte forma:

search meudominio.com

nameserver 127.0.0.1

após este procedimento restarte o bind:

/etc/init.d/bind9 restart

8 – configurando o Servidor MASTER meudominio.com

Comentários:

Na zona direta “meudominio.com”, na opção allow-transfer, você deve substituir 221.164.180.108 pelo ip válido do seu Servidor DNS SLAVE

Na zona reversa “180.164.221.in-addr.arpa” você deve inserir os 3 primeiros octetos de sua subrede disponibilizada pelo provedor, ou seja ips válidos. Se sua rede é 222.223.224.104/29, você deve substituir o valor “180.164.221.in-addr.arpa” por “224.223.222.in-addr.arpa”, note que são somente os 3 primeiros octetos em ordem reversa.

Faça o mesmo com o nome do arquivo.

edite o arquivo /etc/bind/named.conf.local e insira as seguintes zonas:

zone “meudominio.com” IN{

type master;

file “/etc/bind/db.meudominio.com”;

allow-transfer { 221.164.180.108; };

};

zone “180.164.221.in-addr.arpa”{

type master;

file “/etc/bind/db.180.164.221″;

allow-transfer { 221.164.180.108; };

};

Criaremos os arquivos db especificados no arquivo anteriormente editado:

Comentários:

É fácil encontrar documentação na internet sobre como configurar o BIND, mas raramente é disponibilizado mais informações sobre os parametros utilizados nos arquivos de zonas, abaixo vou dar uma explicação resumida dos parametros utilizados:

@ IN SOA ns1.meudominio.com. suporte.meudominio.com.

O @ no inicio da primeira linha indica a origem do dominio e ao mesmo tempo, o inicio das configurações.

O IN é abreviação de internet e o SOA de “start of autority”.

Em seguida vem o nome do servidor seguido do e-mail de contato do administrador. Note que no caso do e-mail temos a conta separada do dominio por um ponto (.)e não pelo @, o mais comum é utilizar hostmaster, mas você pode colocar o e-mail que quiser.

Note também que existe um ponto depois de ns1.meudominio.com, e suporte.meudominio.com. O ponto se refere ao dominio raiz de responsabilidade dos root servers. No exemplo nosso servidor (ns1) é responsável pelo dominio (meudominio), que faz parte do dominio (.com), que por sua vez faz parte do dominio raiz (.).

Esta linha que acabei de resumir, diz algo como “Na internet o servidor “ns1” responde pelo dominio “meudominio.com” e o e-mail do responsável pelo dominio é suporte.meudominio.com”.

A primeira linha termina com um parêntese, que significa o inicio das configurações daquele dominio, temos então:

2010051312 3H 15M 1W 1D )

2010051312 é valor de sincronismo, que permite que o servidor secundário mantenha-se sincronizado com o principal. Este número é composto da data da última alteração (como em: 20100513), e um número de dois dígitos qualquer que você escolhe. Sempre que editar a configuração, ou sempre que configurar um servidor DNS a partir de um template qualquer, lembre-se de atualizar a data e mudar os dois dígitos.

Os quatro campos seguintes orientam o servidor DNS secundário. O primeiro campo indica o tempo que o servidor aguarda entre as atualizações (3 horas). Caso ele perceba que o servidor principal está fora do ar, ele tenta fazer uma transferência de zona, ou seja, tenta assumir a responsabilidade sob o domínio. Caso a transferência falhe e o servidor principal continue fora do ar, ele aguarda o tempo especificado no segundo campo (15 minutos ) e tenta novamente.

O terceiro campo indica o tempo máximo que ele pode responder pelo domínio, antes que as informações expirem (1 semana, tempo mais do que suficiente para você arrumar o servidor principal ) e o tempo mínimo antes de devolver o domínio para o servidor principal quando ele retornar (1 dia).

Muita gente prefere especificar estes valores em segundos. Uma configuração muito comum é separar os valores por linha, incluindo comentários, como em:

2010051312; serial

28800; refresh, seconds

7200; retry, seconds

604800; expire, seconds

86400 ); minimum, seconds

O resultado é exatamente o mesmo. A única diferença é que você vai acabar digitando várias linhas a mais.

#vim /etc/bind/db.meudominio.com

com o seguinte conteúdo:

$TTL 604800

@ IN SOA ns1.meudominio.com. suporte.meudominio.com. (

2010051312 3H 15M 1W 1D )

@ IN NS ns1

@ IN NS ns2

meudominio.com IN MX 10 ns1

meudominio.com IN A 221.164.180.109

www IN A 221.164.180.107

ns1 IN A 221.164.180.109

ns2 IN A 221.164.180.108

Agora o reverso:

vim /etc/bind/db.180.164.221

Com o seguinte conteúdo:

$TTL 1d ;

$ORIGIN 180.164.221.IN-ADDR.ARPA.

@ IN SOA ns1.meudominio.com. suporte.meudominio.com. (

2010051312 3H 15M 1W 1D )

IN NS ns1.meudominio.com.

IN NS ns2.meudominio.com.

109 IN PTR ns1.meudominio.com.

108 IN PTR ns2.meudominio.com.

Restarte o bind:

/etc/init.d/bind9 restart

Com isso o seu dns já deve estar funcionando, agora vamos instalar o slave:

Para ambos os servidores, Slave e Master, você deve adicionar a seguinte linha no arquivo /etc/bind/named.conf.options

dnssec-enable yes;

Agora precisamos setar uma chave segura para que os dois se comuniquem, este comando irá gerar um arquivo .private e um .key. A opção “key=” no .private representa o hashkey, execute o seguinte comando:

dnssec-keygen -r /dev/urandom -a hmac-md5 -b 128 -n host meudominio.com

agora edite o arquivo /etc/bind/named.conf, em ambos os servidores e insira o seguinte trecho, substituindo o “secret” pelo que foi gerado no .private.

key “TRANSFER” {

algorithm hmac-md5;

secret “jxTZsKVn0p0irY6Q3f8E4A==”;

};

No DNS master você deve inserir o ip do slave no mesmo arquivo, /etc/bind/named.conf, segue o trecho:

server 221.164.180.108 {

keys {

TRANSFER;

};

};

No DNS slave você deve inserir o ip do master no mesmo arquivo, /etc/bind/named.conf, segue o trecho:

server 221.164.180.109 {

keys {

TRANSFER;

};

};

No DNS slave edite sua zona para que fique parecido com isso:

vim /etc/bind/named.conf.local

zone “meudominio.com” {

type slave;

file “/etc/bind/db.meudominio.com”;

masters { 221.164.180.109; };

allow-notify { 221.164.180.109; };

};

Obs.:

Com a configuração acima, tive problemas com a replicação de zonas, pois o diretorio /etc/bind não permite escrita para o usuario do bind, portando para não liberar permissões neste diretório, o que seria uma brecha de segurança, mudei o diretorio para /var/cache/bind, no qual é o padrão para dns’s Slave,

zone “meudominio.com” {

type slave;

file “/var/cache/bind/db.meudominio.com”;

masters { 221.164.180.109; };

allow-notify { 221.164.180.109; };

};

o ultimo passo necessário é para ser feito nos dois servidores, edite o /etc/bind/named.conf e insira a seguinte linha:

include “/etc/bind/rndc.key”

Para ter uma transferencia bem sucedida entre zonas instale o ntpdate:

apt-get install ntpdate

Obs, ate o momento não houve tranferencia de dns para o slave, aguardarei 1dia pois é o tempo estimado

Bibliografia:

http://www.howtoforge.com/debian_bind9_master_slave_system

http://linux.justinhartman.com/DNS_Installation_and_Setup_using_BIND9

http://www.guiadohardware.net/tutoriais/instalando-servidor-dns/

http://www.vivaolinux.com.br/artigo/Configurando-DNS-%28bind9%29-no-Debian-Sarge/?pagina=2

http://www.vivaolinux.com.br/artigo/Configurando-o-bind-9-no-Debian?pagina=2

Cups + Jasmine + Active Directory

Cups + jasmine + ActiveDirectory

#apt-get update

#apt-get upgrade

#apt-get dist-upgrade

Instalando o Kerberos

Instale o Kerberos com o seguinte comando:

#aptitude install -y ldap-utils libldap2 krb5-user
Obs.: libldap2 não encontrads, utilizada: libldap-2.4-2 

O instalador fará alguns questionamentos. O primeiro é qual o nome do seu controlador de domínio. Responda com letras maiúsculas.

Ex.: SERVIDOR1 SERVIDOR2

Depois você será questionado sobre qual o controlador de domínio primário da sua rede. Responda também com letras maiúsculas.

Ex.: SERVIDOR1

Feito isso terminamos a configuração do Kerberos.

Instalação e configuração do Samba

Agora iremos instalar o Samba com winbind para que possamos ingressar a máquina no domínio. Rode o comando abaixo:

apt-get install -y samba samba-common winbind

Mais uma vez o instalador lhe fará perguntas. A primeira é qual o nome do domínio. Responda em letras maiúsculas.

Ex.: DOMINIO

Depois disso você será perguntado se quer modificar smb.conf para usar configurações WINS fornecidas via DHCP. Responda Não.

Faça uma cópia do arquivo smb.conf e edite-o para ficar conforme abaixo:

[global]
workgroup = DOMINIO
server string = SERVIDOR
netbios name = SERVIDOR
realm = DOMINIO.COM.BR
dns proxy = no
ldap ssl = no
log file = /var/log/samba/%m.log
max log size = 500
debug level = 1
security = ads
encrypt passwords = yes
smb passwd file = /etc/samba/smbpasswd
username map = /etc/samba/smbusers
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
unix charset = iso-8859-1
password server = IP_DO_SERVIDOR_DE_DOMINIO
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
template homedir = /dev/null
template shell = /dev/null
winbind use default domain = yes
passdb backend = smbpasswd
preferred master = no
wins support = yes
os level = 254
printing = cups
load printers = yes

[printers]
comment = Todas as Impressoras
path = /var/spool/samba
printable = Yes
printing = cups
public = yes
writable = yes
load printers = yes
print ok = yes
guest ok = yes
browseable = yes

Feito isso reinicie o Samba e o Winbind para que as modificações entrem em vigor.

/etc/init.d/samba restart && /etc/init.d/winbind restart

Agora já podemos ingressar a máquina no domínio Active Directory. Para isso execute:

net ads join -U administrator

Onde administrator é o administrador do domínio. Coloque a senha e pronto! Já temos a máquina como membro do domínio Active Directory.

Edite também o arquivo nsswitch.conf para que fique da seguinte forma:

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc Name Service Switch' for information about this file.

passwd:         compat winbind
group:          compat winbind
shadow:         compat winbind

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Instalando o Jasmine

Depois de ingressar a máquina no domínio iremos começar a instalação e configuração do jasmine propriamente dita. Vamos começar instalando os pré-requisitos:

apt-get install -y mysql-server-5.0 apache2 php5 php5-mysql python-imaging python-psyco cups libdbd-mysql-perl

Cadastre uma senha para o usuário root do mysql e em seguida configure o bando de dados do Jasmine conforme abaixo:

mysql -uroot -psenha
CREATE DATABASE jasmine;
GRANT ALL ON jasmine.* TO jasmine@127.0.0.1 IDENTIFIED BY 'jasmine';

Baixando e instalando os pacotes do Jasmine

Vamos baixar os pacotes do Jasmine e colocá-los em um diretório chamado /dados:

mkdir /dados && cd /dados
wget http://nayco3.free.fr/Jasmine/Releases/0.0.3/JASmine-MySQL-0.0.3.tar.bz2
wget http://nayco3.free.fr/Jasmine/Releases/0.0.3/JASmine-Backend-0.0.3.tar.bz2
wget http://nayco3.free.fr/Jasmine/Releases/0.0.3/JASmine-Web-0.0.3.tar.bz2

tar xvjf JASmine-Backend-0.0.3.tar.bz2
tar xvjf JASmine-Web-0.0.3.tar.bz2
tar xvjf JASmine-MySQL-0.0.3.tar.bz2
cd JASmine-MySQL-0.0.3

Agora iremos rodar o script .sql no banco do jasmine criado anteriormente:

mysql -uroot -psenha jasmine < jasmine.sql

Instalação do Backend

cd ..
cd JASmine-Backend-0.0.3
tar zxvf pkpgcounter-2.10.tar.gz
cd pkpgcounter-2.10
./setup.py install
cd ..
cp jasmine /usr/lib/cups/backend
chmod 755 /usr/lib/cups/backend/jasmine
cp dummy /usr/lib/cups/backend
chmod 755 /usr/lib/cups/backend/dummy

Modifique as linhas do arquivo /usr/lib/cups/backend/jasmine da seguinte forma:

my $DBhost="localhost";
my $DBlogin="jasmine";
my $DBpassword="senha_do_usuario_jasmine";
my $DBdatabase="jasmine";

my $Want_Sys_Syslog=1;
my $Debug_Mode=0;

my $path_to_pkpgcounter="/usr/bin/pkpgcounter";
my $path_to_python="/usr/bin/python";

Editando o cupsd.conf

Deixe-o da seguinte forma:

LogLevel warning
SystemGroup lpadmin

# Allow remote access
Port 631
Listen /var/run/cups/cups.sock

# Share local printers on the local network.
Browsing On
BrowseOrder allow,deny
BrowseAddress @LOCAL
DefaultAuthType Basic
<Location />
Allow From 127.0.0.1
Allow From 192.168.*

# Allow shared printing and remote administration...
Order allow,deny
Allow @LOCAL
</Location>
<Location /admin>
Allow From 127.0.0.1
Allow From 192.168.*

# Allow remote administration...
Order allow,deny
Allow @LOCAL
</Location>
<Location /admin/conf>
AuthType Default
Require user @SYSTEM

# Allow remote access to the configuration files...
Order allow,deny
Allow @LOCAL
</Location>
<Policy default>
<Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Accept-Jobs CUPS-Reject-Jobs>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Cancel-Job CUPS-Authenticate-Job>
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit All>
Order deny,allow
</Limit>
</Policy>
DefaultEncryption Never

Instalando a parte web do jasmine

mkdir /var/www/jasmine
cp -R /dados/JASmine-Web-0.0.3/* /var/www/jasmine
cp /var/www/jasmine/config.php.dist /var/www/jasmine/config.php
/etc/init.d/apache2 restart

Edite as seguintes linhas do arquivo conf.php:

$DB_host="localhost";
$DB_login="jasmine";
$DB_pass="senha_do_usuario_jasmine";
$DB_db="jasmine"

Pronto. Com isso já teremos o jasmine emitindo relatórios por nome de usuário.

Instalando as Impressoras no CUPS

Para que se possa imprimir e ser contabilizado no Jasmine você precisa instalar a impressora escolhendo a opção Really Virtual Printer for Testing Cups e colocar jasmine antes da URL. Veja o Exemplo abaixo:

jasmine:socket://ip_da_impressora:9100

Dessa forma o backend do Jasmine será executado e as impressões serão contabilizadas.

Instalando as Impressoras nos Clientes

Essa solução foi testada tanto em estações Windows quanto em Linux. Em ambas as impressões saíram com o nome dos usuários. Basta que nas duas situações as máquinas estejam ingressadas no domínio.

Para instalar as impressoras nos clientes escolha a opção Impressora de rede e coloque o seguinte endereço:

http://ip_do_servidor_jasmine:631/printers/nome_da_impressora

Load Balance Mikrotik, usando PCC com links adsl

Olá;
Um dos leitores do blog teve a necessidade de balancear os seus links adsl, e o tutorial postado anteriormente não solucionou seu problema, Visto que a conexão do pppoe é estabelecida pelo mikrotik, o mesmo identifica o trafego de saida realmente como um OUTPUT e não como um FORWARD, o que normalmente acontece para links dedicados.

Caso seu modem adsl não esteja em modo bridge, estas alterações provavelmente não serão necessárias.

Vou somente postar as regras do mangle, para quem não sabe o que é o PCC, recomendo a dar uma lida neste topico que explica o seu funcionamento:
http://blog.lcmm.info/?p=71

As alterações que devem ser feitas para o PCC funcionar com o adsl, são as seguintes:
Entenda 192.168.0.0/16 como sua LAN;

/ip firewall mangle
add action=accept chain=prerouting comment=”remove balanceamento das redes conectadas /16 para agregar rede 192.168.1.0 e 192.168.0.0!” disabled=no dst-address=192.168.0.0/16 in-interface=ether5-local

add action=mark-connection chain=input comment=”Inicio Conf PCC, marca conexF5es entrantes!” disabled=no in-interface=pppoe-out1 new-connection-mark=ppoe1 passthrough=yes

add action=mark-connection chain=input comment=”" disabled=no in-interface=pppoe-out2 new-connection-mark=ppoe2 passthrough=yes

add action=mark-connection chain=input comment=”" disabled=no in-interface=pppoe-out3 new-connection-mark=ppoe3 passthrough=yes

add action=accept chain=output comment=”Sem Load Balance” disabled=no dst-address-list=nobalance

add action=mark-routing chain=output comment=”" connection-mark=ppoe1 disabled=no new-routing-mark=para-ppoe1 passthrough=yes

add action=mark-routing chain=output comment=”" connection-mark=ppoe2 disabled=no new-routing-mark=para-ppoe2 passthrough=yes

add action=mark-routing chain=output comment=”" connection-mark=ppoe3 disabled=no new-routing-mark=para-ppoe3 passthrough=yes

add action=mark-connection chain=prerouting comment=”PCC em si, colocando um peso igual para todos os ppoe” disabled=no dst-address=!192.168.0.0/16 dst-address-type=!local new-connection-mark=ppoe1 passthrough=yes per-connection-classifier=both-addresses:3/0 src-address=192.168.0.0/16

add action=mark-connection chain=prerouting comment=”" disabled=no dst-address=!192.168.0.0/16 dst-address-type=!local new-connection-mark=ppoe2 passthrough=yes per-connection-classifier=both-addresses:3/1 src-address=192.168.0.0/16

add action=mark-connection chain=prerouting comment=”" disabled=no dst-address=!192.168.0.0/16 dst-address-type=!local new-connection-mark=ppoe3 passthrough=yes per-connection-classifier=both-addresses:3/2 src-address=192.168.0.0/16

add action=mark-routing chain=prerouting comment=”Aponta as conexF5es do Load Balance para as suas respectivas tabelas de roteamento” connection-mark=ppoe1 disabled=no dst-address=!192.168.0.0/16 new-routing-mark=para-ppoe1 passthrough=yes src-address=192.168.0.0/16

add action=mark-routing chain=prerouting comment=”" connection-mark=ppoe2 disabled=no dst-address=!192.168.0.0/16 new-routing-mark=para-ppoe2 passthrough=yes src-address=192.168.0.0/16

add action=mark-routing chain=prerouting comment=”" connection-mark=ppoe3 disabled=no dst-address=!192.168.0.0/16 new-routing-mark=para-ppoe3 passthrough=yes src-address=192.168.0.0/16

Espero ter ajudado, até a próxima!!!

#Zimbra, wrong status, zimbra.log vazio

Boas,

Recentemente coloquei um servidor zimbra em produção, estou terminando a documentação para postar aqui um passo a passo, mas, antes que eu me esqueça, colocarei a solução de um problema um tanto comum para os administradores do zimbra.
Ao acessar o status do servidor no console de adminitração do zimbra, notei alguns status errados, alguns serviços apareciam como parados mas na verdade estava executando normalmente. Fui atrás do log do zimbra (zimbra.log e zm-stats.log) e eles estavam limpos, 0kb, não estava logando nada.
Fui no forum oficial do zimbra e constatei que várias pessoas estavam com o mesmo problema, existiam varias “possíveis” soluções, mas nada que me agradasse. Neste forum descobri que o problema era na integração do rsyslog + zimbra + logrotate.
Notei que ao reiniciar o rsyslog tudo voltava ao normal, ai vi sugestões, no forum internacional, para criar uma rotina para reiniciar o rsyslog, conhecido como gambiarra, até porque no intervalo de tempo entre o logrotate e o restart do rsyslog, iriamos perder as informações que deveriam ser logadas!!!

Achei uma solução, para mim melhor que a sugerida no forum internacional:

#vim /etc/logrotate.d/zimbra

Dentro deste arquivo, existem vários blocos que são os arquivos de logs que dever ser rotacionados.
Iremos inserir um comando na área do postrotate para que o proprio logrotate reinicie o rsyslog apos rotacionar os arquivos de log.

Antes(somente um trecho do arquivo, os dois primeiros blocos):

/var/log/zimbra.log {
daily
missingok
notifempty
create 0644 zimbra zimbra
postrotate
killall -HUP rsyslogd 2> /dev/null || true
su – zimbra -c “/opt/zimbra/bin/zmswatchctl restart” > /dev/null 2>&1 || true
endscript
compress
}

/var/log/zimbra-stats.log {
daily
missingok
notifempty
create 0644 zimbra zimbra
postrotate
killall -HUP rsyslogd 2> /dev/null || true
su – zimbra -c “/opt/zimbra/bin/zmlogswatchctl restart” > /dev/null 2>&1 || true
endscript
rotate 0
}

Depois:

/var/log/zimbra.log {
daily
missingok
notifempty
create 0644 zimbra zimbra
postrotate
killall -HUP rsyslogd 2> /dev/null || true
su – zimbra -c “/opt/zimbra/bin/zmswatchctl restart” > /dev/null 2>&1 || true
/etc/init.d/rsyslog restart
endscript
compress
}

/var/log/zimbra-stats.log {
daily
missingok
notifempty
create 0644 zimbra zimbra
postrotate
killall -HUP rsyslogd 2> /dev/null || true
su – zimbra -c “/opt/zimbra/bin/zmlogswatchctl restart” > /dev/null 2>&1 || true
/etc/init.d/rsyslog restart
endscript
rotate 0
}

Ativar daemon snmp (snmpd) no VMware ESX 3

Ativar snmpd no VMware esx 3

É necessário ter um usuário com acesso ao shell do esx.

1 – Faça logon no Vmware ESX através do ssh ou diretamente no console do ESX.

2 – Edite o arquivo /etc/snmp/snmpd.conf, através do comando:

#vi /etc/snmp/snmpd.conf

3 – Na linha “rocommunity public” substitua “public” pela sua chave snmp.

4 – É necesário configurar o vmware para que inicialize o daemon snmp automaticamente, para isso rode o comando:

#chkconfig snmpd on

5 – Libere o acesso ao daemon snmp no firewall do Vmware ESX, através do comando:

#esxcfg-firewall -e snmpd

6 – inicialize o serviço:

#service snmpd start

PCC Load balance no Mikrotik

Load Balance no Mikrotik usando PCC, Detalhado e Explicado

Luiz Claudio Martins Maia

Bacharel em Ciência da Computação, CESUPA –  lcm@lcmm.info

Resumo: Este documento demonstra como configurar um balanceamento de carga (Load Balance) orientado ao ip ou à porta, no mikrotik 3.30 através de dois ou mais links.

Abstract: This document demonstrates how to configure a load balancing (Load Balance), ip or port oriented in mikrotik 3:30 through two or more links.

Palavras-chave: Mikrotik; Load Balance; PCC.

1. Introdução

O objetivo deste documento e demonstrar como configurar um balanceamento de carga entre múltiplos links, utilizando PCC no mikrotik.

Existem algumas formas de balancear links, porém existem também algumas complicações com alguns deles, um exemplo é o ECMP, no qual por padrão o kernel linux limpa a tabela de roteamento de 10 em 10 minutos em média, forçando a perda de conexão em aplicações “keep_alive”.

O PCC ou “per connection classifier”, marca os pacotes para que os mesmos sejam direcionados para o gateway certo, com isso a conexão ficará pertinente à certo gateway.

2. Cenário

PCCLoadBalance

Ether1 – Lan 10.10.10.0/24

Ether3 – Wan Embratel (router + 4 modems PPP) / Link 8 Mb/s

Ether4 – Wan OI (router+2modems PPP)/ Link 4 Mb/s

3. Regras para os Impacientes

/ip firewall mangle

add action=accept chain=output comment=”Sem Balance” disabled=no dst-address-list=SemBalance

add action=accept chain=prerouting comment=”" disabled=no dst-address=200.200.200.200/29 in-interface=ether1

add action=accept chain=prerouting comment=”" disabled=no dst-address=222.222.222.222/28 in-interface=ether1

add action=mark-connection chain=input comment=”____________Inicio Conf PCC (Load Balance) —————    Marca Conexoes de entrada para que voltem pelo mesmo link” disabled=no in-interface=ether3 new-connection-mark=EBT_conn passthrough=yes

add action=mark-connection chain=input comment=”" disabled=no in-interface=ether4 new-connection-mark=OI_conn passthrough=yes

add action=mark-connection chain=output comment=”Load Balance Proxy” connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/0

add action=mark-connection chain=output comment=”" connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/1

add action=mark-connection chain=output comment=”" connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=OI_conn passthrough=yes per-connection-classifier=both-addresses:3/2

add action=mark-routing chain=output comment=”Retorna as conexoes marcadas no inicio, pelo mesmo link que entraram” connection-mark=EBT_conn disabled=no new-routing-mark=EBT_traffic passthrough=yes

add action=mark-routing chain=output comment=”" connection-mark=OI_conn disabled=no new-routing-mark=OI_traffic passthrough=yes

add action=mark-connection chain=prerouting comment=”Load Balance (PCC), para os dois links (OI e EBT) sendo um peso maior o link da EBT por causa da velocidade maior” disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/0

add action=mark-connection chain=prerouting comment=”" disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/1

add action=mark-connection chain=prerouting comment=”" disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=OI_conn passthrough=yes per-connection-classifier=both-addresses:3/2

add action=mark-routing chain=prerouting comment=”Aponta as conexoes do load balance para as novas tabelas de roteamento, possibilitando o Load Balance(PCC)” connection-mark=EBT_conn disabled=no in-interface=ether1 new-routing-mark=EBT_traffic passthrough=yes

add action=mark-routing chain=prerouting comment=”____________FIM Load Balance (PCC)” connection-mark=OI_conn disabled=no in-interface=ether1 new-routing-mark=OI_traffic passthrough=yes

/ip route

add comment=”Rota Saida Principal EBT sem Load Balance” disabled=no distance=2 dst-address=0.0.0.0/0 gateway=222.222.222.222 scope=30

target-scope=10

add comment=”Rota saida OI sem Load Balance” disabled=no distance=3 dst-address=0.0.0.0/0 gateway=200.200.200.200 scope=30

target-scope=10

add comment=”Rota saida OI para Load Balance” disabled=no distance=1 dst-address=0.0.0.0/0 gateway= 200.200.200.200 routing-mark=

OI_traffic scope=30 target-scope=10

add comment=”Rota Saida EBT para Load Balance” disabled=no distance=1 dst-address=0.0.0.0/0 gateway= 222.222.222.222 routing-mark=

EBT_traffic scope=30 target-scope=10

add comment=”Rota para Rede interna” disabled=no distance=1 dst-address=10.10.10.0/24 gateway=10.10.10.1 scope=30 target-scope=10

/ip firewall nat

add action=masquerade chain=srcnat comment=”Mascaramento Link EBT” disabled=no out-interface=ether3
add action=masquerade chain=srcnat comment=”Mascaramento Link OI” disabled=no out-interface=ether4

4. Explicação das Regras

/ip firewall mangle

add action=accept chain=output comment=”Sem Balance” disabled=no dst-address-list=SemBalance

A regra acima cria uma address list para cadastrar ips que você queira que saia pela rota default e não pelo balanceamento.

/ip firewall mangle

add action=accept chain=prerouting comment=”" disabled=no dst-address=200.200.200.200/29 in-interface=ether1

add action=accept chain=prerouting comment=”" disabled=no dst-address=222.222.222.222/28 in-interface=ether1

É necessário “remover” do balanceamento as redes que estão conectadas diretamente ao mikrotik, neste caso meus dois links:  200.200.200.200/29 e 222.222.222.222/28, para que não sejam balanceados entre si!

/ip firewall mangle

add action=mark-connection chain=input comment=”____________Inicio Conf PCC (Load Balance) —————    Marca Conexoes de entrada para que voltem pelo mesmo link” disabled=no in-interface=ether3 new-connection-mark=EBT_conn passthrough=yes

add action=mark-connection chain=input comment=”" disabled=no in-interface=ether4 new-connection-mark=OI_conn passthrough=yes

Esta regra serve para marcar os pacotes que estão entrando, para que os mesmos saiam pelo  link que entraram, ou seja, caso seja estabelecia uma conexão entrante no link da oi com destino, por exemplo, ao meu servidor web, esta será marcada como “OI_conn”, e nas próximas regras será direcionado para a saída correta que é a interface ether4.

/ip firewall mangle

add action=mark-connection chain=output comment=”Load Balance Proxy” connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/0

add action=mark-connection chain=output comment=”" connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/1

add action=mark-connection chain=output comment=”" connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=OI_conn passthrough=yes per-connection-classifier=both-addresses:3/2

Essas 3 regras só se aplicam se você tiver na mesma maquina o PCC e o Web-Proxy ativado,  é ai que a mágica começa, a opção  “per-connection-classifier” é o PCC, no qual você deve subdividir seu link, no meu caso tenho um de 8 Mb e um de 4Mb, ou seja, para não subutilizar o meu link de 8 Mb, devo colocar 2 vezes para o de 8 Mb (EBT_conn) e um para o de 4Mb (OI_conn).

/ip firewall mangle

add action=mark-routing chain=output comment=”Retorna as conexoes marcadas no inicio, pelo mesmo link que entraram” connection-mark=EBT_conn disabled=no new-routing-mark=EBT_traffic passthrough=yes

add action=mark-routing chain=output comment=”" connection-mark=OI_conn disabled=no new-routing-mark=OI_traffic passthrough=yes

Nas duas regras acima, nos asseguramos que os pacotes que entraram pelos links OI e EBT e que foram marcados como OI_conn e EBT_conn saiam pela interface correta, ou seja, a interface que eles entraram, para isso é necessário criar uma tabela de roteamento para cada um dos links, descritos nas regras como OI_traffic e EBT_traffic, logo abaixo adicionaremos as rotas para essas tabelas.

/ip firewall mangle

add action=mark-connection chain=prerouting comment=”Load Balance (PCC), para os dois links (OI e EBT) sendo um peso maior o link da EBT por causa da velocidade maior” disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/0

add action=mark-connection chain=prerouting comment=”" disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/1

add action=mark-connection chain=prerouting comment=”" disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=OI_conn passthrough=yes per-connection-classifier=both-addresses:3/2

Essas 3 regras fazem o Load Balance das conexões que estão passando pelo mikrotik (FORWARD), funcionam da mesma forma que as regras para o balanceamento do proxy, a diferença é o “chain”, pois as 3 primeiras que são do proxy, especificamos como “OUTPUT” e neste caso pega o resto que nao se encaixam na primeira (FORWARD), lembrando que para nao subutilizar um dos links, por causa da diferença de velocidade, coloquei 2 vezes o link EBT por ter o dobro da velocidade do link OI.

/ip firewall mangle

add action=mark-routing chain=prerouting comment=”Aponta as conexoes do load balance para as novas tabelas de roteamento, possibilitando o Load Balance(PCC)” connection-mark=EBT_conn disabled=no in-interface=ether1 new-routing-mark=EBT_traffic passthrough=yes

add action=mark-routing chain=prerouting comment=”____________FIM Load Balance (PCC)” connection-mark=OI_conn disabled=no in-interface=ether1 new-routing-mark=OI_traffic passthrough=yes

Essas duas últimas regras encaminham o tráfego que foi marcado(balanceado)  nas regras acima para suas tabelas de roteamento correspondentes.

/ip route

add comment=”Rota Saida Principal EBT sem Load Balance” disabled=no distance=2 dst-address=0.0.0.0/0 gateway=222.222.222.222 scope=30 target-scope=10

add comment=”Rota saida OI sem Load Balance” disabled=no distance=3 dst-address=0.0.0.0/0 gateway=200.200.200.200 scope=30 target-scope=10

add comment=”Rota saida OI para Load Balance” disabled=no distance=1 dst-address=0.0.0.0/0 gateway= 200.200.200.200 routing-mark=OI_traffic scope=30 target-scope=10

add comment=”Rota Saida EBT para Load Balance” disabled=no distance=1 dst-address=0.0.0.0/0 gateway= 222.222.222.222 routing-mark=EBT_traffic scope=30 target-scope=10

add comment=”Rota para Rede interna” disabled=no distance=1 dst-address=10.10.10.0/24 gateway=10.10.10.1 scope=30 target-scope=10

As regras acima criam as tabelas de roteamento necessárias para o funcionamento do PCC Load Balance, as duas primeiras são rotas estáticas para os ips que não irão utilizar o PCC, as duas seguintes dizem que os pacotes marcados como OI_traffic e EBT_traffic devem sair pelo gateway do qual entraram para não ter perda de conexão. A ultima é a rota para a rede interna.

add action=masquerade chain=srcnat comment=”Mascaramento Link EBT” disabled=no out-interface=ether3
add action=masquerade chain=srcnat comment=”Mascaramento Link OI” disabled=no out-interface=ether4

Essas regras são necessárioas para fazer o mascaramento para poder saira para internet.

Bom, espero com este artigo, ajudar as pessoas interessadas em implementar um bom balanceamento de carga no mikrotik. Este artigo ainda não está completo, existem informações importantes que quero colocar aqui, como o funcionamento do PCC e algumas dicas, mas ficará para outra hora.

EDIT: Para quem usa adsl, visite o link http://blog.lcmm.info/?p=91, vai ajudar bastante!

Espero ter ajudado,

[]‘s

Luiz Maia

Lcm

Beowulf Cluster, Instalação e Configuração no Slackware 13

versão em PDF: ClusteBeowulfLCM.pdf

Cluster Beowulf – Instalação e Configuração

Luiz Claudio Martins Maia

Bacharel em Ciência da Computação, CESUPA – lcm@lcmm.info

Resumo: Este documento apresenta a instalação e configuração de um cluster Beowulf, o mesmo é constituído por vários computadores ligados em rede de forma que trabalhem como se fosse uma única maquina de grande porte.

Abstract: This document provides installation and configuration of a Beowulf cluster, it consists of several networked computers so that they can work like a single large machine.

Palavras-chave: Beowulf; Cluster; instalação; Configuração; Slackware; mpi.

1. Introdução

O objetivo deste documento é mostrar como pode ser feita a instalação e configuração de um cluster beowulf para aplicações que necessitam de um alto desempenho.

Beowulf é o nome de um projeto para computação paralela, usando computadores comuns, não especializados e portanto mais baratos. O projeto foi criado por Donald Becker da NASA e hoje são usados em todo o mundo, principalmente para processamento de dados com finalidade científica. Cluster Beowulf são clusters de desempenho escaláveis, baseados em uma infraestrutura de hardware comum, rede privada e software open-source(linux).

2. Requisitos e Estrutura

Sistema Operacional: Slackware Linux 13.0 (instalação padrão)

Bilbioteca: lam-7.1.1-i486-1jac.tgz

Configurações de rede:

-Nó Master: 192.168.1.1

-Nó 01: 192.168.1.10

-Nó 02: 192.168.1.11

-Nó 03: 192.168.1.12

3. Configuração do Nó Master

3.1 - Habilitar os serviços rlogin, rexec e rsh.

Estes serviços estão associados ao super servidor “inetd”,  para habilitá-los basta descomentar as respectivas linhasno arquivo de configuração do inetd /etc/inet.conf, através do comando:

#vim /etc/inet.conf

cluster-inetd

Em seguida é necessário dar um restart no super servidor inetd, através do comando:

#/etc/rc.d/rc.inetd restart

3.2 Configuração de nomes.

Para facilitar a configuração e utilização do cluster é necessário criarmos um servidor de nomes, como o cluster “nano” não tem muitos nós, utilizaremos o arquivo hosts e não um servidor DNS, caso o cluster tenha muitos nós, é recomendado um servidor de nomes pois esta configuração do arquivo hosts deve ser feita em todos os nós.

Vamos editar o arquivo através do comando:

#vim /etc/hosts

Este arquivo deve conter a seguinte estrutura e conteúdo:

#127.0.0.1       localhost

192.168.1.1     master.nano    master

192.168.1.10   no01.nano       no01

192.168.1.11   no02.nano       no02

192.168.1.12   no02.nano       no03

3.3 Relação de Confiança

Agora iremos configurar o nó mestre para que ele tenha uma relação de confiança com os demais nós do cluster, para isso vamos editar o arquivo /etc/hosts.equiv, através do seguinte comando:

#vim /etc/hosts.equiv

Este arquivo deve conter a seguinte estrutura e conteúdo:

#localhost

master

no01

no02

no03

É necessário, também, criarmos um arquivo dentro da pasta home do usuario cluster, mas antes devemos criar o usuário cluster, através do comando:

#Adduser cluster

O Slackware solicitará algumas informações, não há necessidade de inserir dados nessas informações, é so ir apertando enter até o mesmo solicitar uma senha, esta senha será necessária para logar com o usuário e executar os “jobs” no cluster, portanto memorize-a.

Agora criaremos o arquivo na pasta dome do usuário cluster, através do comando:

#Vim /home/cluster/.rhosts

Note que este arquivo começa com o caractere “.”, o que para o linux significa que é um arquivo oculto, um simples ls dentro do diretorio não exibirá o arquivo, neste arquivo devemos inserir as mesmas informações e estrutura que colocamos no arquivo anterior:

master

no01

no02

no03

3.4 Servidor NFS

Nesta etapa iremos configurar o servidor NFS, no qual irá montar o diretório home do usuário cluster em todos os nós do cluster, caso contrario, ao rodar um “job”, deveriamos copiar o arquivo para todos os nós do cluster.

A instalação padrão do slackware 13, já tras o NFS, é necessário apenas dar poder de execução ao seu “daemon”, para isso execute o seguinte comando:

#Chmod +x /etc/rc.d/rc.nfsd

Agora temos que configurar o nfs para que ele compartilhe o diretório /home/cluster, para isso, devemos editar o arquivo /etc/exports e adicionar os compartilhamentos e as opções de montagem, execute o seguinte comando para editar o arquivo:

#Vim /etc/exports

E adicione o seguinte conteúdo ao arquivo:

/home/cluster no01 (rw,no_root_squash)

/home/cluster no02 (rw,no_root_squash)

/home/cluster no03 (rw,no_root_squash)

ou, para facilitar a escalabilidade:

/home/cluster * (rw,no_root_squash)

Na configuração anterior, foi configurado um compartilhamento para cada nó, poderiamos ter feito somente um compartilhamento para todos os nós, mas por questões de segurança, especificamos os nés que terão acesso ao compartilhamento, o parametro rw, permite a leitura e escrita no compartilhamento e o parametro no_root_squash, remove permissões de root no compartilhamento.

Após Configurar os compartilhamentos, faz-se necessário reiniciar o servidor NFS, execute o seguinte comando para reiniciá-lo:

#/etc/rc.d/rc.nfsd restart

E

#/etc/rc.d/rc.rpc restart

3.5 Bilbiotecas LAM-MPI

Neste passo iremos instalar um conjunto de programas e bibliotecas chamado LAM-MPI, no qual permite que um conjunto de maquinas seja utilizado de forma paralela. Iremos utilizar a versão 7.1.1. Existe um pacote pré-compilado para o slackware no site http://www.linuxpackages.net, com o nome “lam-7.1.1-i486-1jac.tgz”, copie o arquivo para a pasta /root e execute o seguinte comando:

#Installpkg lam-7.1.1-i486-1jac.tgz

OBS: Este pacote funciona normalmente para a linguagem C e C++, no entanto, ele não foi compilado com a linguagem fortran habilitada, para utilizr programas em fortran no cluster devemos baixar os fontes da bilbioteca e compilar, os fontes podem ser baixados no site do projeto LAM-MPI, ou neste link direto: http://www.lam-mpi.org/download/files/lam-6.5.9.tar.gz

Para compilar o fonte baixado, decompacte o arquivo na pasta /root com o seguinte comando:

#tar -xzvf lam-6.5.9.tar.gz

Entre no diretório lam-6.5.9 com o seguinte comando:

#cd lam-6.5.9

É necessário setar uma variável de ambiente para habilitar o fortran(f77 ou f97)

#FC=f77

#export FC

Agora vamos à instalação:

#./configure –with-fc

#make

#make install

No fim da instalação deve aparecer “Package lam-7.1.1-i486-1jac.tgz installed.”

Depois de instalado, o LAM-MPI irá gerar um arquivo de configuração chamado /etc/lam-bhost.def, edite ele com o comando:

#vim /etc/lam-bhost.def

Este arquivo deve conter o nome de todos os nós do cluster, portanto ele deve ficar assim:

master

no01

no02

no03

4. Configuração dos Nós Escravos

4.1 Habilitar os serviços rlogin, rexec e rsh.

Estes serviços estão associados ao super servidor “inetd”,  para habilitá-los basta descomentar as respectivas linhasno arquivo de configuração do inetd /etc/inet.conf, através do comando:

#vim /etc/inet.conf

cluster-inetd

Em seguida é necessário dar um restart no super servidor inetd, através do comando:

#/etc/rc.d/rc.inetd restart

4.2Configuração de nomes.

Para facilitar a configuração e utilização do cluster é necessário criarmos um servidor de nomes, como o cluster “nano” não tem muitos nós, utilizaremos o arquivo hosts e não um servidor DNS, caso o cluster tenha muitos nós, é recomendado um servidor de nomes pois esta configuração do arquivo hosts deve ser feita em todos os nós.

Vamos editar o arquivo através do comando:

#vim /etc/hosts

Este arquivo deve conter a seguinte estrutura e conteúdo:

#127.0.0.1       localhost

192.168.1.1     master.nano    master

192.168.1.10   no01.nano       no01

192.168.1.11   no02.nano       no02

192.168.1.12   no02.nano       no03

Os trabalhos aceitos para o evento serão inteiramente publicados nos anais do I ENHidro, em formato de CD-ROM.

4.3 Relação de Confiança

Agora iremos configurar os nós escravos para que os mesmos tenham uma relação de confiança com os demais nós do cluster, para isso vamos editar o arquivo /etc/hosts.equiv, através do seguinte comando:

#vim /etc/hosts.equiv

Este arquivo deve conter a seguinte estrutura e conteúdo:

#localhost

master

no01

no02

no03

É necessário, também, criarmos um arquivo dentro da pasta home do usuario cluster, mas antes devemos criar o usuário cluster, através do comando:

#Adduser cluster

O Slackware solicitará algumas informações, não há necessidade de inserir dados nessas informações, é so ir apertando enter até o mesmo solicitar uma senha, esta senha será necessária para logar com o usuário e executar os “jobs” no cluster, portanto memorize-a.

Agora criaremos o arquivo na pasta dome do usuário cluster, através do comando:

#Vim /home/cluster/.rhosts

Note que este arquivo começa com o caractere “.”, o que para o linux significa que é um arquivo oculto, um simples ls dentro do diretorio não exibirá o arquivo, neste arquivo devemos inserir as mesmas informações e estrutura que colocamos no arquivo anterior:

master

no01

no02

no03

4.4 Cliente NFS

Neste passo iremos configurar o cliente nfs para que monte o compartilhamento na inicialização do sistema, para isso execute o comando abaixo:

Cat >> /etc/fstab (aperte ENTER)

master:/home/cluster /home/cluster   nfs       rw,hard,intr    0          0

4.5 Bilbiotecas LAM-MPI

Neste passo iremos instalar um conjunto de programas e bibliotecas chamado LAM-MPI, no qual permite que um conjunto de maquinas seja utilizado de forma paralela. Iremos utilizar a versão 7.1.1. Existe um pacote pré-compilado para o slackware no site http://www.linuxpackages.net, com o nome “lam-7.1.1-i486-1jac.tgz”, copie o arquivo para a pasta /root e execute o seguinte comando:

Installpkg lam-7.1.1-i486-1jac.tgz

OBS: Este pacote funciona normalmente para a linguagem C e C++, no entanto, ele não foi compilado com a linguagem fortran habilitada, para utilizr programas em fortran no cluster devemos baixar os fontes da bilbioteca e compilar, os fontes podem ser baixados no site do projeto LAM-MPI, ou neste link direto: http://www.lam-mpi.org/download/files/lam-6.5.9.tar.gz

Para compilar o fonte baixado, decompacte o arquivo na pasta /root com o seguinte comando:

#tar -xzvf lam-6.5.9.tar.gz

Entre no diretório lam-6.5.9 com o seguinte comando:

#cd lam-6.5.9

É necessário setar uma variável de ambiente para habilitar o fortran(f77 ou f97)

#FC=f77

#export FC

Agora vamos à instalação:

#./configure –with-fc

#make

#make install

No fim da instalação deve aparecer “Package lam-7.1.1-i486-1jac.tgz installed.”

5. Teste do Cluster

Para inicializar o cluster, vc deve estar logado com o usuário cluster, como root o mpi não irá inicializar, com o usuário cluster execute o seguinte comando:

lamboot

Para checar os nós que estão respondendo execute o comando:

lamnodes

Testando um programa em C

Codigo fonte do programa hello.c:

/*

* $Id: hello.c,v 1.3 2002/11/23 04:06:57 jsquyres Exp $

*

* Copyright (c) 2001-2002 The Trustees of Indiana University.

*                         All rights reserved.

* Copyright (c) 1998-2001 University of Notre Dame.

*                         All rights reserved.

* Copyright (c) 1994-1998 The Ohio State University.

*                         All rights reserved.

*

* This file is part of the LAM/MPI software package.  For license

* information, see the LICENSE file in the top level directory of the

* LAM/MPI source distribution.

*

* $HEADER$

*

* Sample hello world MPI program for testing MPI.

*/

#include <stdio.h>

#include <stdlib.h>

#include <mpi.h>

int

main(int argc, char **argv)

{

int rank, size;

/* Start up MPI */

MPI_Init(&argc, &argv);

/* Get some info about MPI */

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

MPI_Comm_size(MPI_COMM_WORLD, &size);

/* Print out the canonical “hello world” message */

printf(“Hello, world!  I am %d of %dn”, rank, size);

/* All done */

MPI_Finalize();

return 0;

}

1-Compile o programa com o comando:

#mpicc –o hello hello.c

2 – copie o programa hello para a pasta do usuário cluster, para isso execute o seguinte comando:

#cp hello /home/cluster

3 – execute o programa com o comando:

#mpirun n0-2 /home/cluster/hello

Codigo Fonte Programa PI:

/*

* Copyright (c) 2001-2002 The Trustees of Indiana University.

*                         All rights reserved.

* Copyright (c) 1998-2001 University of Notre Dame.

*                         All rights reserved.

* Copyright (c) 1994-1998 The Ohio State University.

*                         All rights reserved.

*

* This file is part of the LAM/MPI software package.  For license

* information, see the LICENSE file in the top level directory of the

* LAM/MPI source distribution.

*

* $HEADER$

*

* $Id: cpi.c,v 1.4 2002/11/23 04:06:58 jsquyres Exp $

*

* Portions taken from the MPICH distribution example cpi.c.

*

* Example program to calculate the value of pi by integrating f(x) =

* 4 / (1 + x^2).

*/

#include <stdio.h>

#include <math.h>

#include <mpi.h>

/* Constant for how many values we’ll estimate */

#define NUM_ITERS 1000

/* Prototype the function that we’ll use below. */

static double f(double);

int

main(int argc, char *argv[])

{

int iter, rank, size, i;

double PI25DT = 3.141592653589793238462643;

double mypi, pi, h, sum, x;

double startwtime = 0.0, endwtime;

int namelen;

char processor_name[MPI_MAX_PROCESSOR_NAME];

/* Normal MPI startup */

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &size);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

MPI_Get_processor_name(processor_name, &namelen);

printf(“Process %d of %d on %sn”, rank, size, processor_name);

/* Do approximations for 1 to 100 points */

for (iter = 2; iter < NUM_ITERS; ++iter) {

h = 1.0 / (double) iter;

sum = 0.0;

/* A slightly better approach starts from large i and works back */

if (rank == 0)

startwtime = MPI_Wtime();

for (i = rank + 1; i <= iter; i += size) {

x = h * ((double) i – 0.5);

sum += f(x);

}

mypi = h * sum;

MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if (rank == 0) {

printf(“%d points: pi is approximately %.16f, error = %.16fn”,

iter, pi, fabs(pi – PI25DT));

endwtime = MPI_Wtime();

printf(“wall clock time = %fn”, endwtime – startwtime);

fflush(stdout);

}

}

/* All done */

MPI_Finalize();

return 0;

}

static double

f(double a)

{

return (4.0 / (1.0 + a * a));

}

1-Compile o programa com o comando:

mpicc –o cpi cpi.c

2 – copie o programa hello para a pasta do usuário cluster, para isso execute o seguinte comando:

cp cpi /home/cluster

3 – execute o programa com o comando:

Mpirun n0-2 /home/cluster/CPI

http://www.lam-mpi.org

EDIT:
Notas:
1 – Para habilitar o compilador fortran nesta configuração, caso não esteja instalado o f77, vc deve baixar o pacote(tanto do fortran(f77), quanto do mpi, pois o que esta neste tutorial já vem pré compilado) e instalar. Em seguida deve setar a seguinte variável “FC=f77″, caso seu compilador seja o f77, em seguida, na pasta do mpi, “./configure –with-fc=f77″, “make”, “make install”. Só testar!!!

Obs: este procedimento deve ser feito em todos os nós.
link g77:ftp://ftp.slackware-brasil.com.br/slackware-10.0/slackware/d/gcc-g77-3.3.4-i486-1.tgz
Link fonte mpi:http://www.lam-mpi.org/download/files/lam-6.5.9.tar.gz

Load Balance no Mikrotik usando ECMP e failover

Introdução:

Já vi vários posts na internet mostrando como fazer o balanceamento de carga em dois ou mais links no mikrotik, mas todos os que eu vi ou deixam um dos links sem utilização somente como failover ou você tem que dividir as saídas por certos ips da sua rede interna.

Nenhum dos casos me agradou, à seguir vou mostrar como fazer um balanceamento de carga de uma forma eficaz sem subutilizar um dos links ou dividir sua rede, usando “ECMP load balance” no mikrotik.

Cenário:

LAN: 192.168.0.1/24
WAN1: 172.16.10.10/32 – Link Embratel 2Mb
WAN2: 172.16.20.10/32 – Link OI 2Mb

IPS Mikrotik:
LAN: 192.168.0.1
WAN1:172.16.10.1
WAN2:172.16.20.1

IPS Routers:
WAN1: 172.16.10.10
WAN2:172.16.20.10

Regras para os impacientes:

/ip address
add address=192.168.0.1/24 broadcast=192.168.0.255 comment=”LAN” disabled=no
interface=ether2 network=192.168.0.0
add address=172.16.10.1/24 broadcast=172.16.10.255 comment=”WAN1″ disabled=no
interface=ether3 network=172.16.10.0
add address=172.16.20.1/24 broadcast=172.16.20.255 comment=”WAN2″ disabled=no
interface=ether1 network=172.16.20.0

/ ip route
add dst-address=0.0.0.0/0 gateway=172.16.10.10,172.16.20.10 check-gateway=ping

/ ip firewall nat
add chain=srcnat out-interface=WAN1 action=masquerade
add chain=srcnat out-interface=WAN2 action=masquerade

/ ip firewall mangle
add chain=input in-interface=WAN1 action=mark-connection new-connection-mark=wan1_conn
add chain=input in-interface=WAN2 action=mark-connection new-connection-mark=wan2_conn
add chain=output connection-mark=wan1_conn action=mark-routing new-routing-mark=to_wan1
add chain=output connection-mark=wan2_conn action=mark-routing new-routing-mark=to_wan2

/ ip route
add dst-address=0.0.0.0/0 gateway=172,16.10.10 routing-mark=to_wan1
add dst-address=0.0.0.0/0 gateway=172.16.20.10 routing-mark=to_wan2

Explicação:

-IP Address:

/ip address
add address=192.168.0.1/24 broadcast=192.168.0.255 comment=”LAN” disabled=no
interface=ether2 network=192.168.0.0
add address=172.16.10.10/24 broadcast=172.16.10.255 comment=”WAN1″ disabled=no
interface=ether3 network=172.16.10.0
add address=172.16.20.10/24 broadcast=172.16.20.255 comment=”WAN2″ disabled=no
interface=ether1 network=172.16.20.0

Neste trecho definimos os ips da interface local LAN (192.168.0.1/24) e os ips das interfaces externas WAN(172.16.10.1/24 e 172.16.20.1/24), claro, ips inválidos, adeque a sua necessidade!

-Routing:

/ ip route
add dst-address=0.0.0.0/0 gateway=172.16.10.10,172.16.20.10 check-gateway=ping

Aqui criamos uma rota tipica de ECMP (Equal Cost Multi-Path), com check-gateway. Por definição o ECMP é persistente por conexão, ou seja, se um cliente estabelece conexão pelo gateway 172.16.10.10, ele irá utilizar somente este gateway durante ESTA conexão. Assim que um dos links cair o check-gateway irá remove-lo da lista de gateway, com isso você terá um efeito failover de brinde :D .

você pode utilizar também links assimétricos, por exemplo, digamos que o link da OI seja de 4Mb e o da Embratel de 8Mb, sendo o da Embratel o dobro do link da OI, você pode fazer a rota da seguinte forma para não subutilizar um dos links:

/ ip route
add dst-address=0.0.0.0/0 gateway=172.16.20.10,172.16.10.10,172.16.10.10 check-gateway=ping

-NAT:

/ ip firewall nat
add chain=srcnat out-interface=wan1 action=masquerade
add chain=srcnat out-interface=wan2 action=masquerade

Como as rotas já foram decididas, só precisamos das regras para corrigir o src-address para os pacotes de saída, Se o pacote sair pela WAN1 será “NATeado” para 172.16.10.10/24, caso contrário será para 172.16.20.10/24.

-Conexões Entrantes:

/ ip firewall mangle
add chain=input in-interface=WAN1 action=mark-connection new-connection-mark=wan1_conn
add chain=input in-interface=wlan2 action=mark-connection new-connection-mark=wan2_conn
add chain=output connection-mark=wan1_conn action=mark-routing new-routing-mark=to_wan1
add chain=output connection-mark=wan2_conn action=mark-routing new-routing-mark=to_wan2

/ ip route
add dst-address=0.0.0.0/0 gateway=172.16.10.10 routing-mark=to_wan1
add dst-address=0.0.0.0/0 gateway=172.16.20.10 routing-mark=to_wan2

Imagine um pacote INPUT vindo pelo link da Oi e retornando pelo link da Embratel, com ip diferente não vai dar, para evitar isso, vamos avisar ao mikrotik que o pacote que for recebido pelo link1 deve ser retornado pelo mesmo link.

Conclusão:

O ECMP é uma boa forma de balancear múltiplos links no mikrotik, com a utilização dele não subutilizamos os links e conseguimos um failover caso um dos links caiam, ele bem configurado dificilmente dará problemas.

[]‘s
Lcm

http://blog.lcmm.info