Hello community,<br>I have two servers with keepalived running and
keepalived is running VRRP protocol to have redundancy. I've configured a
virtual IP address to be started when keepalived starts, so there are
one active virtual IP and one real IP per server. OpenSIPS (1.6.4tls) is
configured to be run on IP of 10.22.0.254, which is virtual IP address
and keepalived is configured to start OpenSIPS upon master transition
and stop it if it goes to slave mode. Real IP of first server is
10.22.0.1, backup server 10.22.0.2. Also, both of these interfaces are
in VLAN mode, so VLAN 402 is for internal network and VLAN 401 for the
Internet. Each server has public IP address on eth0.401 and I'd like
OpenSIPS to be able to accept SIP requests from both internal LAN &
Internet. OpenSIPS is used as a call director and load balancer, there
are two Asterisk servers behind it and I use OpenSIPS to send calls to
them. Asterisk servers are on IPs (not virtual) of 10.22.0.3 &
10.22.0.4. All works fine when clients connect from LAN and mhomed=0 is
set in configuration file.<br>
<br>But I've run into a problem that when I enable mhomed=1 system is
unable to find outgoing socket. I've traced that problem and found that
it works fine as long as I have real IP address on PBX and it stops
working as soon as I switch to keepalived and virtual IP address. System
accepts a call from client and then unable to route it to any of
Asterisk servers with an error:<br>
<br>Aug 10 10:49:14 localhost /opt/opensips/sbin/opensips[<div id=":1j">21748]: ERROR:core:get_out_socket: no socket found<br>Aug 10 10:49:14 localhost /opt/opensips/sbin/opensips[21748]: ERROR:tm:update_uac_dst: failed to fwd to af 2, proto 1 (no corresponding listening socket)<br>
Aug 10 10:49:14 localhost /opt/opensips/sbin/opensips[21748]: ERROR:tm:t_forward_nonack: failure to add branches<br><br>Ok,
so I tried to use force_send_socket() function and mhomed=0 to route
outgoing calls from clients to Asterisk servers - and it works fine
without issues. But the problem here is what to do with incoming calls
from Asterisk gateways to clients? Clients may be connected both from
LAN & from the Internet. I'm using just simple load_balance()
function to route calls to Asterisk servers, drouting module not used.<br>
<br>I haven't tested it yet, but I think it will be unable to find
appropriate outgoing interface to send packets from. And I really don't
know how to analyze from where client is connected and how to choose
correct socket for it to use force_send_socket function in this case.
So, maybe mhomed should be fixed to determine this virtual interface
correctly somehow? My routing table looks like this:<br>
<br>Kernel IP routing table<br>Destination Gateway Genmask Flags Metric Ref Use Iface<br>10.22.1.9 10.22.0.253 255.255.255.255 UGH 20 0 0 eth0.402<br>10.22.1.8 10.22.0.252 255.255.255.255 UGH 20 0 0 eth0.402<br>
10.22.1.3 10.22.0.252 255.255.255.255 UGH 20 0 0 eth0.402<br>10.22.1.2 10.22.0.253 255.255.255.255 UGH 20 0 0 eth0.402<br>10.22.1.1 10.22.0.253 255.255.255.255 UGH 20 0 0 eth0.402<br>
10.22.1.7 10.22.0.253 255.255.255.255 UGH 20 0 0 eth0.402<br>10.22.1.6 10.22.0.253 255.255.255.255 UGH 20 0 0 eth0.402<br>10.22.1.5 10.22.0.253 255.255.255.255 UGH 20 0 0 eth0.402<br>
10.22.1.4 10.22.0.253 255.255.255.255 UGH 20 0 0 eth0.402<br><PUBLIC_IP> 0.0.0.0 255.255.255.240 U 0 0 0 eth0.401<br>10.22.0.0 0.0.0.0 255.255.255.0 U 10 0 0 eth0.402<br>
10.22.1.0 10.22.0.252 255.255.255.0 UG 20 0 0 eth0.402<br>0.0.0.0 <GW> 0.0.0.0 UG 0 0 0 eth0.401<br><br>Host records are clients connected via L2TP to two routers and obtained using OSPF.<br>
Here's output of ifconfig. You can't see virtual IP address in here, which is normal.<br><br>eth0 Link encap:Ethernet HWaddr 00:0C:29:XX:XX:XX <br> inet6 addr: fe80::20c:29ff:fexx:xxxx/64 Scope:Link<br>
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br> RX packets:4604777 errors:0 dropped:0 overruns:0 frame:0<br> TX packets:5288576 errors:0 dropped:0 overruns:0 carrier:0<br> collisions:0 txqueuelen:1000 <br>
RX bytes:1215873667 (1.1 GiB) TX bytes:1185601384 (1.1 GiB)<br><br>eth0.401 Link encap:Ethernet HWaddr 00:0C:29:XX:XX:XX <br> inet addr:<PUBLIC_IP> Bcast:<BROADCAST> Mask:255.255.255.240<br>
inet6 addr: fe80::20c:29ff:fexx:xxxx/64 Scope:Link<br> UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br> RX packets:330 errors:0 dropped:0 overruns:0 frame:0<br> TX packets:158 errors:0 dropped:0 overruns:0 carrier:0<br>
collisions:0 txqueuelen:0 <br> RX bytes:156900 (153.2 KiB) TX bytes:32267 (31.5 KiB)<br><br>eth0.402 Link encap:Ethernet HWaddr 00:0C:29:XX:XX:XX <br> inet addr:10.22.0.1 Bcast:10.22.0.255 Mask:255.255.255.0<br>
inet6 addr: fe80::20c:29ff:fexx:xxxx/64 Scope:Link<br> UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br> RX packets:79734 errors:0 dropped:0 overruns:0 frame:0<br> TX packets:125343 errors:0 dropped:0 overruns:0 carrier:0<br>
collisions:0 txqueuelen:0 <br> RX bytes:12664805 (12.0 MiB) TX bytes:20989003 (20.0 MiB)<br><br>lo Link encap:Local Loopback <br> inet addr:127.0.0.1 Mask:255.0.0.0<br> inet6 addr: ::1/128 Scope:Host<br>
UP LOOPBACK RUNNING MTU:16436 Metric:1<br> RX packets:1372428 errors:0 dropped:0 overruns:0 frame:0<br> TX packets:1372428 errors:0 dropped:0 overruns:0 carrier:0<br> collisions:0 txqueuelen:0 <br>
RX bytes:457852457 (436.6 MiB) TX bytes:457852457 (436.6 MiB)<br><br>And here's an output of "ip addr ls" command, where you can find that virtual IP:<br>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN <br>
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br> inet <a href="http://127.0.0.1/8" target="_blank">127.0.0.1/8</a> scope host lo<br> inet6 ::1/128 scope host <br> valid_lft forever preferred_lft forever<br>
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000<br>
link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff<br> inet6 fe80::20c:29ff:fexx:xxxx/64 scope link <br> valid_lft forever preferred_lft forever<br>4: gre0: <NOARP> mtu 1476 qdisc noop state DOWN <br> link/gre 0.0.0.0 brd 0.0.0.0<br>
11: sit0: <NOARP> mtu 1480 qdisc noop state DOWN <br> link/sit 0.0.0.0 brd 0.0.0.0<br>12: eth0.402@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP <br> link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff<br>
inet <a href="http://10.22.0.1/24" target="_blank">10.22.0.1/24</a> brd 10.225.0.255 scope global eth0.402<br> inet <a href="http://10.22.0.254/24" target="_blank">10.22.0.254/24</a> scope global secondary eth0.402<br>
inet6 fe80::20c:29ff:fexx:xxxxx/64 scope link <br>
valid_lft forever preferred_lft forever<br>13: eth0.401@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP <br> link/ether 00:0c:29:08:b1:1d brd ff:ff:ff:ff:ff:ff<br> inet <PUBLIC_IP>/28 brd <BRDCST> scope global eth0.401<br>
inet6 fe80::20c:29ff:fexx:xxxx/64 scope link <br> valid_lft forever preferred_lft forever<br><br>Any
ideas how to make mhomed to work properly or any easy method to check
if client connected from LAN or the Internet to use force_send_socket()?<br>
<br>Thanks and best regards,<br><font color="#888888">Yuri Kirsanov.</font></div>