[FUG-BR] CARP + Ifstated
Fábio Ferrão
ferrao04 em gmail.com
Quarta Maio 27 12:57:49 BRT 2009
Senhores,
Estou utilizando CARP + ifstated para 3 interfaces virtuais em cada um dos
dois firewalls envolvidos. Por enquanto apenas um firewall com FreeBSD 7.2
Stable está rodando o CARP, pois o outro está sendo instalado.
O meu problema é:
O ifstated.conf está testando 3 interfaces conforme abaixo:
*#!/usr/local/bin/bash
init-state one
net = '( "ifconfig -a -u |grep carp0 > /dev/null" every 3 && "ifconfig -a -u
|grep carp1 > /dev/null" every 3 && "ifconfig -a -u |grep carp2 > /dev/null"
every 3)'
state one {
if ( ! $net ) {
run "/sbin/ifconfig carp0 advskew 200"
run "/sbin/ifconfig carp1 advskew 200"
run "/sbin/ifconfig carp2 advskew 200"
set-state two
}
}
state two {
if ( $net ) {
run "/sbin/ifconfig carp0 advskew 1"
run "/sbin/ifconfig carp1 advskew 1"
run "/sbin/ifconfig carp2 advskew 1"
set-state one
}
}*
Quando o ifstated é iniciado com o conf acima, a saída é a seguinte:
*[root em firewall ~]# ifstated -dv -f /usr/local/etc/ifstated.conf
net = "( "ifconfig -a -u |grep carp0 > /dev/null" every 2 && "ifconfig -a -u
|grep carp1 > /dev/null" every 2 && "ifconfig -a -u |grep carp2 > /dev/null"
every 2)"
ifstated: initial state: one
ifstated: changing state to one
ifstated: started
ifstated: running /sbin/ifconfig carp0 advskew 200
ifstated: running /sbin/ifconfig carp1 advskew 200
ifstated: running /sbin/ifconfig carp2 advskew 200
ifstated: changing state to two
ifstated: running /sbin/ifconfig carp0 advskew 1
ifstated: running /sbin/ifconfig carp1 advskew 1
ifstated: running /sbin/ifconfig carp2 advskew 1
ifstated: changing state to one
ifstated: running /sbin/ifconfig carp0 advskew 200
ifstated: running /sbin/ifconfig carp1 advskew 200
ifstated: running /sbin/ifconfig carp2 advskew 200
ifstated: changing state to two*
Com isso as interfaces CARP do meu firewall ficam da seguinte forma:
*carp0: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 10.0.0.1 netmask 0xff000000
carp: MASTER vhid 1 advbase 1 advskew 200
carp1: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 10.0.1.1 netmask 0xffff0000
carp: MASTER vhid 2 advbase 1 advskew 200
carp2: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 10.0.2.1 netmask 0xff000000
carp: MASTER vhid 3 advbase 1 advskew 200
*
O correto seria que as interfaces CARP ficassem com advskew 1, pois todas
estão up. A propósito o parâmetro -u do ifconfig mostra as interfaces que
estão UP. De acordo com a saída acima, dá impressão que uma das interfaces
não está up e por isso o script entrou no primeiro if.
Após isso, se eu executar um* ifconfig carp0 down *e
posteriormente*ifconfig carp0 up
*, o advskew de todas as interfaces ficam como valor 1, conforme abaixo:
*carp0: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 10.0.0.1 netmask 0xff000000
carp: MASTER vhid 1 advbase 1 advskew 1
carp1: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 10.0.1.1 netmask 0xffff0000
carp: MASTER vhid 2 advbase 1 advskew 1
carp2: flags=49<UP,LOOPBACK,RUNNING> metric 0 mtu 1500
inet 10.0.2.1 netmask 0xff000000
carp: MASTER vhid 3 advbase 1 advskew 1*
Se eu alterar o conf pra testar somente 2 interfaces, o script fucniona de
primeira, ou seja:
*#!/usr/local/bin/bash
init-state one
net = '( "ifconfig -a -u |grep carp0 > /dev/null" every 3 && "ifconfig -a -u
|grep carp1 > /dev/null" every 3)'
state one {
if ( ! $net ) {
run "/sbin/ifconfig carp0 advskew 200"
run "/sbin/ifconfig carp1 advskew 200"
set-state two
}
}
state two {
if ( $net ) {
run "/sbin/ifconfig carp0 advskew 1"
run "/sbin/ifconfig carp1 advskew 1"
set-state one
}
}
*
A saída do ifstated é:
*[root em firewall ~]# ifstated -dv -f /usr/local/etc/ifstated.conf
net = "( "ifconfig -a -u |grep carp0 > /dev/null" every 2 && "ifconfig -a -u
|grep carp1 > /dev/null" every 2)"
ifstated: initial state: one
ifstated: changing state to one
ifstated: started
ifstated: running /sbin/ifconfig carp0 advskew 200
ifstated: running /sbin/ifconfig carp1 advskew 200
ifstated: changing state to two
ifstated: running /sbin/ifconfig carp0 advskew 1
ifstated: running /sbin/ifconfig carp1 advskew 1
ifstated: changing state to one
*
Desta forma o advskew das interfaces ficam 1.
Alguém já configurou o CARP para mais de duas interfaces, teve este problema
e conseguiu resolver?
Este problem só ocorre quando o conf tests 3 interfaces. O script está
errado? Alguém pode me ajudar?
Abraço à todos.
--
Fábio Ferrão
"E conhecereis a verdade e a verdade vos libertará". João 8.32
"And you will know the truth and the truth you will free". John 8.32
Mais detalhes sobre a lista de discussão freebsd