PDA

Voir la version complète : double interface réseau / dual nic



jean
08/11/2012, 23h49
Bonjour

j'ai deux interfaces réseaux sur mon asterisk: eth1 / 192.168.0.x et eth0 / 192.168.1.x - avec la config suivante (http://www.asterisk-france.org/showthread.php/654-Question-routage-reseau?p=4182&viewfull=1#post4182), je suis connecté correctement en ssh.

j'essaie d'utiliser les 2 interfaces pour de la voip. eth0 est en prod et marche nickel. lorsque j'enregistre un client par eth1, je vois le register arriver sur la machine (avec un ngrep), mais asterisk ne le voit pas (sip set debug). j'ai arreté le firewall (c'est une prod, quelques instants slt), rien.

bindadress, et surtout udpbindadress sont à 0.0.0.0

j'ai pris la meme version sur un XenCitrix, monté deux interfaces, et évidemment, ca marche.... seule différence, les deux sont sur le meme sublan 192.168.2.X et 192.168.2.Y

des idées de ce qui pourrait ne pas aller ?

tks

J

therebel23
09/11/2012, 16h27
Salut,

si tu fais un


netstat -tanpu | grep 5060

c'est bon ?

Et :


sip set debug ip [TON IP]

?

jean
09/11/2012, 16h57
Aargh.... j'avais pas fait le sip debug sur l'ip seule....

asterisk recoit bien le REGISTER via eth1, mais renvoie via eth0 la réponse...

une idée sur comment corriger cela ?

therebel23
09/11/2012, 17h11
Oui, par les tables de routage : peux tu me montrer celle que tu as défini ?

jean
09/11/2012, 17h15
merci, je suis une quiche en routage !

j'ai donc:
- eth0, 192.168.0.1, gw 192.168.1.254
- eth1, 192.168.1.2, gw 192.168.1.1

ip route list donne:

192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.2
169.254.0.0/16 dev eth0 scope link
default via 192.168.1.254 dev eth0


ce routage permet à ssh de fonctionner correctement, et que j'attaque par eth0 ou eth1, ca ressort par ou c'est rentré (sans mauvaise blague :-) )

merci ton aide,

J

jean
09/11/2012, 18h07
j'ai une piste pas inintéressante - mais la machine est en prod, je teste plus tard
http://lists.digium.com/pipermail/asterisk-users/2010-February/245323.html

doo
06/12/2012, 10h47
Aargh.... j'avais pas fait le sip debug sur l'ip seule....
asterisk recoit bien le REGISTER via eth1, mais renvoie via eth0 la réponse...
une idée sur comment corriger cela ?

Salut,

et si tu forces l'adresse IP d'écoute du serveur asterisk ?
bindaddr dans le sip.conf

jean
06/12/2012, 14h14
je veux écouter sur les 2 interfaces, et répondre sur les deux. donc, le bindaddr doit être à zéro.

j'ai fait un test avec une box virtualisée et 2 nic dans le meme sublan, et ca marche... donc, y'a un truc qui m'échappe

jean
25/03/2013, 22h28
Bon, je suis toujours la dessus.... mon lien principal a planté, et j'ai du bricoler au niveau du dns, et ca me soule grave !!!

donc, le pbm est que asterisk peut écouter sur plusieurs addresses, mais s'il est naté, répond que sur 1

est ce que qqun a réusssi à configurer un asterisk avec deux liens WAN et des clients utilisant ces deux liens ?

J.

fastm3
26/03/2013, 00h37
Attention, je ne me suis pas vraiment penché sur la question, donc je peux dire des betises ci dessous.

Je n'ai jamais fait en utilisant les 2 liens a la fois simultanement ( je prefere en failover par simplicité ( config simple et zero materiel ) ) mais utiliser les 2 avec asterisk ne "serait" a priori pas possible pour moi.
Tu parles de 2 liens wan. Tu ne dis pas vraiment comment est ta config mais j'imagine bien 2 cartes interfaces connectes a un routeur ( NAT ) chacune.

Dans ton paquet sip, si tu parles a l'exterieur, tu dois specifier l'adresse ip externe.
Ce n'est pas au niveau routage, mais au niveau sip. Hors avec Asterisk, on ne peux specifier qu'une seule adresse externip. Donc pas possible directement avec asterisk ET sip. Par contre, ca devrait le faire en iax !

Si tu as plusieurs local subnet ( vpn, cartes ou autres ), si tu specifies toutes les lignes localnet ( 1 ligne par localnet ) , ca devrait le faire meme en sip mais tant que tu restes en local.

Si c'est du failover automatique, on peut donc s'en sortir facilement. Si par contre, tu veux vraiment pouvoir utiliser les 2 wans en meme temps derriere un NAT et pas alternativement , a mon avis , asterisk seul est pas tres bon pour ca.

Fastm3.

jean
26/03/2013, 00h50
pour le moment, j'ai deux liens wan, un SDSL avec business LiveBox et NAT (192.168.0.x), et l'autre en ADSL avec modem et NAT (192.168.1.1).

Le serveur asterisk a 4 cartes réseau, j'en utilise deux.

effectivement, l'externip unique fout la pagaille. je me dis que je devrais denatter mon sdsl et mettre l'ip en direct sur le serveur asterisk

Comment fais tu ton failover automatique ? si j'ai envie d'avoir les deux liens actifs, le failover serait un bon progrès

merci de ton aide,

fastm3
26/03/2013, 01h33
Pour le failover, deja je simplifie la config.
Une config type:
1 seule carte reseau, 1 seul subnet.
2 liens adsl, les 2 liens utilisent generalement leur boxs. Pour l'une des 2 boxs, on desactive le dhcp.

On se retrouve avec 2 gateways sur le subnet:
- 192.168.1.1 par exemple avec serveur dhcp et qui sert par exemple au surf.
- 192.168.1.2 qui sera dedié a la voip.

Sur l'ipbx , on sette juste la gateway correspondante.
Apres, on fait tourner un script ( ou on le lance en manuel , ce qui est aussi une bonne solution ). Attention, ca ne resoudra pas les desynchros ponctuelles et rapides d'un lien ne marchant pas bien. Le script doit switcher uniquement en cas de lien vraiment HS.
- On a un serveur de reference qui doit etre accessible tout le temps.
- On le ping
- On ping aussi les fournisseurs qui l'acceptent

Si pas bon apres double check, on change la gateway du serveur asterisk par l'autre. On change l'externip, un petit sip reload et on previent l'admin par email.
On continue a tester, et on retablit le lien voip des que up de nouveau.

Faudrait que je fasse un petit tuto...Les scripts sont pas tres propres mais ils tournent tres bien.
Ca peut etre adapté avec 2 subnets mais pour les petites installs, un subnet est plus simple.On a juste a faire pour changer la config.

route add default gw 1
route del default gw 2
sed -i -e "s/^externip=.*/externip=$EXTERNIP/" /etc/asterisk/sip_nat.conf
asterisk -rx "reload"



Simple, pas cher ( juste les boxs standard sans routeur double wan ) , et relativement efficace meme si je prefere de plus en plus le faire manuellement pour que le client se rende compte du pb sur un lien.
Fastm3.

jean
26/03/2013, 05h30
ok, merci - c'est à peu près ce que j'ai fait manuellement... :-) mais j'avais pas envisagé de le scripter

je suis total énervé contre FT.... je signale l'incident samedi matin - liaison hs... 3h après, pas de réponse, je rappelle, "ah on arrive pas à joindre l'astreinte"... puis, après 6h... monsieur, le cable de transport est hs, toutes les paires sont nazes, et on peut pas intervenir le week end... et lundi matin... oops... c'est l'alim de la LiveBox qui en fait est hs... (c'est sur un site distant et sécurisé, pas simple de le voir pour moi)... confondre un cable de transport HS et une box éteinte.... bande d'incapables !!!

Comdif
26/03/2013, 09h45
Peut être une inspiration
Voila ce que je fait tourner sur Cyber-wrt en cron minute
c'est sur un routeur, j'a appelé ma deuxième interface wan br1
J'ai une interface web pour peupler le fichier var.

fichier var.php


<?
// FIRST GATEWAY AND DNS
$gw1="192.168.20.1";
$dnsa1="192.168.20.1";
$dnsa2="212.27.40.240";
$dnsa3="212.27.40.241";
// SECOND GATEWAY AND DNS
$gw2="192.168.100.1";
$dnsb1="192.168.100.1";
$dnsb2="";
$dnsb3="";
// DEFINE HERE IP FOR EXEMPLE VOIP PROVIDER TO ALWAYS USE GW2 WHEN AVAILABLE
$spr1="";
$spr2="";
$spr3="";
$spr4="";
// DEFINE SUBNET FOR GW2
$br1net="192.168.100.0";
// DEFINE TWO REF IP TO PING WITH GW1 and GW2
$refpingregular="208.67.222.222";
$refpingextra="208.67.220.220";
$debug="yes";
$active="yes";
?>






#!/opt/bin/php -q
<?php
###############################
####### COMDIF TELECOM ########
######Biwan Failover Cron######
###############################
require ("/opt/var/var.php");

// uncomment to test if cron is working
// $now = date("h:i:s"); shell_exec(" echo '".$now."' >> /opt/cron.txt");

// if $active is empty this cron do nothing
if(empty($active) || empty($br1net) || empty($gw2) || empty($dnsb1)){ exit(); }

// check if br1 exist
$isup = shell_exec("ifconfig br1"); if(empty($isup)) { exit();}

// check if masquerade is set for br1
$chipta= shell_exec("iptables -t nat -L POSTROUTING | grep 'MASQUERADE' | grep 'anywhere'");
if(empty($chipta))
{
shell_exec("iptables -t nat -A POSTROUTING -o br1 -j MASQUERADE");
}

//test if gw2 route rule exist to give a sens to this script
$gw2test = shell_exec("route -n | awk /".$br1net."/");
if(empty($gw2test))
{
if(!empty($debug)) echo'Gateway2 route creation: '.$gw2.' seting to use: br1 interface</br>';
shell_exec("route add ".$br1net." gw 0.0.0.0");
}

// test if route rule $refpingregular for test ping on $gw1 is set on linux routes rules
$test1 = shell_exec("route -n | awk '/".$refpingregular."/ {print $1}'");
if(empty($test1))
{
if(!empty($debug)) echo"oups you don't previously create this rule, ".$refpingregular." ping by ".$gw1." so I create it for you";
if(!empty($debug)) echo'Test ping route creation: '.$refpingregular.' seting to use: '.$gw1.' GW</br>';
shell_exec("route add ".$refpingregular." gw ".$gw1."");
}

// test if route rule $refpingextra for test ping on $gw2 is set on linux routes rules
$test2 = shell_exec("route -n | awk '/".$refpingextra."/ {print $1}'");
if(empty($test2))
{
if(!empty($debug)) echo"oups you don't previously create this rule, ".$refpingextra." ping by ".$gw2." so I create it for you";
if(!empty($debug)) echo'Test ping route creation: '.$refpingextra.' seting to use: '.$gw2.' GW</br>';
shell_exec("route add ".$refpingextra." gw ".$gw2."");
}

//////////////////////////////// MODULE TO CHECK ORPHEAN SPECIAL RULES ///////////////////////////
if (!empty($spr1)) $spr1v= explode('.',$spr1); $spr1v= $spr1v[0] + $spr1v[1] + $spr1v[2] + $spr1v[3];
if (!empty($spr2)) $spr2v= explode('.',$spr2); $spr2v= $spr2v[0] + $spr2v[1] + $spr2v[2] + $spr2v[3];
if (!empty($spr3)) $spr3v= explode('.',$spr3); $spr3v= $spr3v[0] + $spr3v[1] + $spr3v[2] + $spr3v[3];
if (!empty($spr4)) $spr4v= explode('.',$spr4); $spr4v= $spr4v[0] + $spr4v[1] + $spr4v[2] + $spr4v[3];
$valip2= explode('.',$refpingextra); $valip2= $valip2[0] + $valip2[1] + $valip2[2] + $valip2[3];
$srouting = shell_exec("route -n | awk '/".$gw2."/{print \":\" $1}'");
$difs = explode(':', $srouting);
$tail = sizeof($difs);
for($i=1; $i<$tail; $i++)
{
$valip1= explode('.',$difs[$i]); $valip1= $valip1[0] + $valip1[1] + $valip1[2] + $valip1[3];
if($valip1 != $valip2)
{
if ( $valip1 != $spr1v || $valip1 != $spr2v || $valip1 != $spr3v || $valip1 != $spr4v)
{
shell_exec("route del ".$difs[$i]." gw ".$gw2."");
}
}
}
////////////////////////////// MODULE TO CHECK ORPHEAN SPECIAL RULES END //////////////////////////

//////////////////////////////////// commands ////////////////
$regularping="/opt/tmp/ping -c 1 -W 1 ".$refpingregular." | grep '1 received'";
$extrawanping= "/opt/tmp/ping -c 1 -W 1 ".$refpingextra." | grep '1 received'";
$getdefault="ip route | awk '/default via/ {print $3}'";
$adoriroute="route add default gw ".$gw1."";
$deloriroute="route del default gw ".$gw1."";
$adextraroute="route add default gw ".$gw2."";
$delextraroute="route del default gw ".$gw2."";

// find the actual defaullt gateway //
$state= shell_exec($getdefault);
$state =explode('.',$state); $state = $state[0] + $state[1] + $state[2] + $state[3];
$st1 =explode('.',$gw1); $st1 = $st1[0] + $st1[1] + $st1[2] + $st1[3];
$st2 =explode('.',$gw2); $st2 = $st2[0] + $st2[1] + $st2[2] + $st2[3];
// Run ping accross all gateways
$w1state = shell_exec($regularping);
$w2state = shell_exec($extrawanping);

###################### RESULT AND ACTION AFTER TESTING MAIN GW ################
if(!empty($w1state))
{
if(!empty($debug)) echo $w1state.' OK - '.$test1.' IS RESPONDING ON MAIN GATEWAY<br>';
// check if conf is regular conf
if($state != $st1)
{
// test show using altrenative gateway so make all changes
if(!empty($debug)) echo 'MAIN ROUTE IS RESPONDING RESTORING NORMAL CONFIGURATION</br>';
// restore original default route //
shell_exec($delextraroute); shell_exec($adoriroute);
shell_exec("echo \"nameserver ".$dnsa1."\" > /tmp/resolv.dnsmasq");
shell_exec("echo \"nameserver ".$dnsa2."\" >> /tmp/resolv.dnsmasq");
shell_exec("echo \"nameserver ".$dnsa3."\" >> /tmp/resolv.dnsmasq");
}
}
elseif(empty($w1state))
{
if($state != $st2)
{
if(!empty($debug)) echo 'MAIN ROUTE IS DOWN MAKING ALTERNATIVE CONFIGURATION</br>';
shell_exec($deloriroute); shell_exec($adextraroute);
shell_exec("echo \"nameserver ".$dnsb1."\" > /tmp/resolv.dnsmasq");
shell_exec("echo \"nameserver ".$dnsb2."\" >> /tmp/resolv.dnsmasq");
shell_exec("echo \"nameserver ".$dnsb3."\" >> /tmp/resolv.dnsmasq");
}
}

###################### RESULT AND ACTION AFTER TESTING SECONDARY GW ################
if(!empty($w2state))
{
if(!empty($debug)) echo $w2state.' OK - '.$test2.' IS RESPONDING ON ALTERNATIVE GATEWAY<br>';
// check if special voip routing rule 1 is ok
if(!empty($spr1))
{
$on=shell_exec("route -n | awk '/".$spr1."/ {print $1}'");
if(empty($on))
{
if(!empty($debug)) echo 'SECONDARY GW IS NOW RESPONDING RESTORING SPECIAL RULES CONFIGURATION</br>';
shell_exec("route add ".$spr1." gw ".$gw2."");
}
}
// check if special voip routing rule 2 is ok
if(!empty($spr2))
{
$on=shell_exec("route -n | awk '/".$spr2."/ {print $1}'");
if(empty($on))
{
shell_exec("route add ".$spr2." gw ".$gw2."");
}
}
// check if special voip routing rule 3 is ok
if(!empty($spr3))
{
$on=shell_exec("route -n | awk '/".$spr3."/ {print $1}'");
if(empty($on))
{
shell_exec("route add ".$spr3." gw ".$gw2."");
}
}
// check if special voip routing rule 4 is ok
if(!empty($spr4))
{
$on=shell_exec("route -n | awk '/".$spr4."/ {print $1}'");
if(empty($on))
{
shell_exec("route add ".$spr4." gw ".$gw2."");
}
}
}
// Backup wan is not responding, remove special routing rules
else
{
if(!empty($debug)) echo 'SECONDARY GW DOWN CHANGE SPECIAL ROUTING IF NEEDED !</br>';
if(!empty($spr1))
{
$already=shell_exec("route -n | awk '/".$spr1."/ {print $1}'");
if(!empty($already))
{
if(!empty($debug)) echo 'SECONDARY GW DOWN CHANGE SPECIAL ROUTING CONFIGURATION for '.$spr1.' AND OTHER</br>';
shell_exec("route del ".$spr1."");
if(!empty($spr2)){ shell_exec("route del ".$spr2.""); }
if(!empty($spr3)){ shell_exec("route del ".$spr3.""); }
if(!empty($spr4)){ shell_exec("route del ".$spr4.""); }
}
}
}
?>

fastm3
26/03/2013, 10h32
ok, merci - c'est à peu près ce que j'ai fait manuellement... :-) mais j'avais pas envisagé de le scripter

je suis total énervé contre FT.... je signale l'incident samedi matin - liaison hs... 3h après, pas de réponse, je rappelle, "ah on arrive pas à joindre l'astreinte"... puis, après 6h... monsieur, le cable de transport est hs, toutes les paires sont nazes, et on peut pas intervenir le week end... et lundi matin... oops... c'est l'alim de la LiveBox qui en fait est hs... (c'est sur un site distant et sécurisé, pas simple de le voir pour moi)... confondre un cable de transport HS et une box éteinte.... bande d'incapables !!!
Ils ne sont pas si incapables que ca. Ils n'ont rien confondu. Ils gagnent juste du temps.
J'ai toujours eu des temps de retablissement super court en numeris ( vraiment moins de 4h et meme en signalant le pb le samedi matin ) . En xdsl, c'est une autre histoire. Si l'on considere comme tu l'as fait, qu'il faut toujours un lien de backup et les temps de reparation , et la criticité exceptionnelle de la ligne.
Utilser des lignes traditionnelles est quelque fois une tres bonne solution...On l'oublie souvent et on s'en rappelle tout le temps en cas de soucis.
Fastm3.

jean
17/05/2013, 14h23
bon, je continue à chercher.... le post de fastm3 est juste (http://www.asterisk-france.org/showthread.php/2178-double-interface-r%C3%A9seau-dual-nic?p=13629&viewfull=1#post13629)

un seul externip, donc si natté, un seul wan.

les solutions à ce jour: deux instances d'asterisk sur la meme machine, ou un proxy qui recoit sur les interfaces et renvoie sur asterisk. j'ai fait quelques recherches et pas de proxy léger et couvrant cela (sippr, siproxyd, sippy de iptel, etc...) et kamaila/openser, ca me parait bien gros....

des idées sur un proxy léger ?

J.