[OpenSIPS-Users] Forcing outgoing socket issue?

Bogdan-Andrei Iancu bogdan at opensips.org
Mon Jan 12 07:57:21 UTC 2026


Hi Ihor,

Attached is a patch for doublechecking the AF of the forced socket - if 
not matching, it will be discarded and a new socket will be selected 
based on proto and AF family. It is not ideal, but let's see.

For doing DNS at the script level, see the IP transformation (it is what 
you worked on previously):
https://www.opensips.org/Documentation/Script-Tran-3-6#ip.resolve

I agree, it might be useful to have it extended to (a) control the AF 
and (b) to return maybe a list with all the IPs.

On a much broader view, talking with Razvan on this topic, we were 
brainstorming on a more generic and flexible approach for this kind of 
problem (trying to force from script some kind of outbound socket, but 
without knowing (yet) all the details on the destination (like proto, 
port, IP). The idea here is to come up with a kind of phony socket 
definition (phony as it will not be used for listening on) to act as a 
routing table, to allow the selection of a real socket based on a later 
determined port, proto, etc.

Like (in a json format):

socket = my_socket { AF=4:udp:1.2.3.4:5060, AF=6: udp:[2001:db8::1:0]:5060}

or something more complex, with proto filtering too:

socket = my_socket { AF=4,proto=udp:udp:1.2.3.4:5060, AF=6,proto=tcp: 
tcp:[2001:db8::1:0]:5060}


The idea is to still have at the code level a `struct socket_info`, but 
to be interpreted in a more generic way.

Regards,

Bogdan-Andrei Iancu

OpenSIPS Founder and Developer
   https://www.opensips-solutions.com
   https://www.siphub.com

On 08.01.2026 18:33, Ihor Olkhovskyi wrote:
>
> Bogdan,
>
> Thanks for this, I'm for sure will be happy to test a patch.
>
> For the DNS/socket/AF, as I've said, I'm using now explicit resolution 
> of address with AF (resolve4 and resolve6) and acting accordingly.
>
> Still, sort of solution I see here - 
> https://www.kamailio.org/docs/modules/devel/modules/ipops.html#ipops.f.dns_query 
> , it also allows to deal with multiple A and AAAA records.
>
> Le 08/01/2026 à 16:55, Bogdan-Andrei Iancu a écrit :
>> Hi Ihor,
>>
>> First, without the `dns_try_ipv6` options, the DNS lookup will never 
>> return an IPv6 address (as gethostbyname() will be used, which is 
>> AF_INET only).
>>
>> Now, going back to the original report: having the `dns_try_ipv6` 
>> option on, you get back an IPv6 address (from the DNS resolver). Now, 
>> checking the code, if I'm not missing something obvious, I would say 
>> the code allows sending to an IPv6 destination via an IPv4 socket :-/ 
>> ...which seems broken, IMHO. The code verifies only the compatibility 
>> (between destination and sending socket) when comes to the protocol, 
>> but not AF.
>> For this case, will you be willing to test a small patch? this will 
>> discard the forced socket if not compatible with the destination 
>> (this is also done for the proto mismatch) - and a new matching 
>> socket will be looked up.
>>
>> Now, about the multi IPs from DNS - if the DNS based fallback is not 
>> turned off (as flag to t_relay), opensips will try to do dns based 
>> failover (if the sending fails). But this will not change whatever 
>> outbound socket was set...
>>
>> Basically, to wrap this up, your dilemma is like this: you want to 
>> force a socket, but the DNS may give IPv4 or IPV6, so you have no 
>> idea which socket to force...
>>
>> Regards,
>> Bogdan-Andrei Iancu
>>
>> OpenSIPS Founder and Developer
>>    https://www.opensips-solutions.com
>>    https://www.siphub.com
>> On 02.01.2026 13:27, Ihor Olkhovskyi wrote:
>>> Bohdan,
>>>
>>> I've looked through code (resolve.c) and got an impression, that 
>>> only first resolved address is used along the way. Means if 
>>> destination address resolves to IPv6 with dns_try_ipv6=yes, it uses 
>>> only IPv6 in packet processing (namely for $du) and you cannot force 
>>> IPv4 outbound socket later, cause no info about IPv4 is present.
>>> I've made a small hack to have a possibility to choose, which 
>>> address family I want to use 
>>> (https://github.com/igorolhovskiy/opensips-v6/commit/527d8d3d010d3a5a1e4b68475df45cb4e9f44604) 
>>> but I don't like the solution.
>>> Maybe I'm wrong, but my impression, that when DNS resolution is 
>>> happens, only 1 address (which includes the family as well) is being 
>>> used later with no possibility to change it.
>>> I can provide more logs soon (for relaying part), but not sure it's 
>>> the case here.
>>>
>>> Regards,
>>> Ihor
>>>
>>> Le lun. 29 déc. 2025 à 10:33, Bogdan-Andrei Iancu 
>>> <bogdan at opensips.org> a écrit :
>>>
>>>     Hi Ihor,
>>>
>>>     So, you say OpenSIPS picks the IPv6 address as destination
>>>     (confirmed by the err log), but you are not sure what interface
>>>     is to be used (even if you forced the ipv4 one, it may be
>>>     discarded by the internal fwd logic).
>>>
>>>     Could you provide debug level logs for the relaying part ?
>>>
>>>     Regards,
>>>
>>>     Bogdan-Andrei Iancu
>>>
>>>     OpenSIPS Founder and Developer
>>>        https://www.opensips-solutions.com
>>>        https://www.siphub.com
>>>
>>>     On 10.12.2025 17:58, Ihor Olkhovskyi wrote:
>>>>     Hello!
>>>>
>>>>     I'm trying to build ipv4/ipv6 bridge with OpenSIPS 3.6.2.
>>>>     I've declared the sockets like this:
>>>>
>>>>     # v4 addresses
>>>>     socket=tls:OPENSIPS_IPV4_ADDR:TLS_PORT
>>>>     socket=wss:OPENSIPS_IPV4_ADDR:WSS_PORT
>>>>     # v6 addresses
>>>>     socket=tls:[OPENSIPS_IPV6_ADDR]:TLS_PORT
>>>>     socket=wss:[OPENSIPS_IPV6_ADDR]:WSS_PORT
>>>>     dns_try_ipv6=yes
>>>>     # Always listen on localhost v4
>>>>     socket=tls:127.0.0.1:TLS_PORT
>>>>
>>>>     Means explicit to start on v4 and v6 addresses for lately to
>>>>     change address family explicitly
>>>>
>>>>     OpenSIPS starts without any issues, but when I try to do socket
>>>>     forcing with
>>>>
>>>>     $socket_out = "wss:OPENSIPS_IPV4_ADDR:WSS_PORT";
>>>>     t_relay();
>>>>
>>>>     I'm getting
>>>>
>>>>     ERROR:proto_wss:ws_sync_connect: bind failed (22) Invalid argument
>>>>     ERROR:proto_wss:ws_connect: connect failed
>>>>     ERROR:proto_wss:proto_wss_send: connect failed
>>>>     tm:msg_send: send() to EXTERNAL_IPV6(sic!) for proto wss/6 failed
>>>>     tm:t_forward_nonack: sending request failed
>>>>
>>>>     So OpenSIPS is trying to send over IPv6. I guess that is cause
>>>>     network address of RURI is v6 already, but DNS answers in
>>>>     dual-stack. If I remove `dns_try_ipv6` it works, but how than I
>>>>     should work with v6?
>>>>
>>>>     What am I missing?
>>>>
>>>>     Thanks in advance!
>>>>
>>>>     -- 
>>>>     Best regards,
>>>>     Ihor (Igor)
>>>>
>>>>     _______________________________________________
>>>>     Users mailing list
>>>>     Users at lists.opensips.org
>>>>     http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>>
>>>
>>>
>>> -- 
>>> Best regards,
>>> Ihor (Igor)
>>
> -- 
> Regards,
> Ihor
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20260112/f3d65573/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: opensips_3_6_forced_sock_AF_fix.patch
Type: text/x-patch
Size: 769 bytes
Desc: not available
URL: <http://lists.opensips.org/pipermail/users/attachments/20260112/f3d65573/attachment.bin>


More information about the Users mailing list