SIP, VPN et NAT

Bonjour.

Voilà ma configuration : un serveur S avec Asterisk et une machine M sur le même réseau local. M peut se connecter sans souci à Asterisk, Ekiga fonctionne etc. Je veux maintenant pouvoir relier mon “ordi téléphone” T à Asterisk mais il n’est pas et ne peut pas être sur le même réseau que S. J’ai donc monté un VPN (openvpn tap) entre M et T (je ne peux rien toucher sur S).

Le souci c’est que je n’arrive pas à régler les iptables et routes pour que T puisse se connecter à S. En faisant du masquerading j’arrive à pinger S, j’arrive même à voir les paquets SIP qui passent via M en tcpdump, mais rien à faire : la connexion SIP ne se fait pas.

Quelqu’un aurait une idée ? Je précise que S, M et T sont ur Wheezy.
Merci d’avance.

@+
Rémi

On ne le répètera jamais assez : le NAT (dont le masquerading est une forme) casse la connectivité IP de bout en bout qui est un des fondement du protocole IP et dont certains protocoles complexes comme SIP ou FTP ont besoin, sous peine d’être cassés en même temps.

Si tu veux persister avec du NAT, essaie de charger les modules de suivi de connexion et de NAT de netfilter pour le protocole SIP (nf_conntrack_sip et nf_nat_sip) sur la machine qui fait le masquerading. La fonction de ces modules et d’analyser les flux SIP et de faire les modifications nécessaires pour tenir compte du NAT. C’est de la bidouille compliquée, mais c’est mieux que rien.

L’idéal serait de supprimer ce NAT et d’ajouter une route de retour vers T sur S, mais tu dis qu’on ne peut rien modifier sur S, dommage. Néanmoins si S et M ont une passerelle par défaut commune qui est suffisamment configurable, tu peux ajouter la route de retour sur celle-ci. Le routage de retour de S vers T ne sera pas optimal puisqu’il passera par la passerelle puis par M (sauf si la passerelle émet des ICMP Redirect et S les accepte) mais AMA c’est mieux que du NAT.

Une autre possiblité, puisque tu utilises un tunnel en mode tap, est de ponter l’interface tap de M avec l’interface ethernet du réseau local et d’attribuer à l’interface tap de T une adresse dans le réseau local qui sera joignable directtement par S.

Une autre possibilité, mais moins propre, est d’attribuer à T une adresse dans le réseau local et d’activer le proxy ARP sur l’interface ethernet de M, ainsi S verra T comme s’il était sur le réseau local.

Ouhlà ! Beaucoup de chose à tester :slightly_smiling:

Tu pourrais détailler un peu la méthode de bridge via le tunnel TAP ? Je ne comprends pas trop ce que je dois faire là…

Merci en tout cas, ça me donne des pistes !

@+
Rémi

man brctl
Quelqu’un capable d’opérer une usine à gaz comme Asterisk devrait y arriver.

Non mais ce n’était pas question, je sais faire des ponts mais je ne vois pas quel pont tu me conseilles de faire, je vais essayer d’être plus explicite. Si j’ai bien compris, je dois faire ça :

Sur S :

  • eth0 : 192.168.0.1/24

Sur M :

  • br0 : 192.168.0.2/24
  • eth0 (bridged)
  • vpn0 (bridged)

Sur T :

  • eth0 : 172.17.16.1/24
  • vpn0 : ???

Pour le moment, sans bridge, j’ai mes interfaces vpn0 qui sont adressées en 10.0.0.0/16, je dois changer quelquechose donc ?

Merci d’avance pour tes éclaircissements.

@+
Rémi

Avec le pontage, l’ensemble LAN + VPN constitue un domaine de diffusion unique (avec ses avantages et ses inconvénients, notamment le VPN se prend tout les broadcast du LAN).
L’interface VPN de T devra avoir une adresse dans le même réseau IP que S et M. L’interface VPN de M n’aura pas d’adresse IP puisqu’elle est pontée.