[erlang-questions] Socket option FREEBIND

Andreas Schultz aschultz@REDACTED
Fri Oct 20 18:04:08 CEST 2017


Hi, 

----- On Oct 20, 2017, at 5:10 PM, Michael L Martin <mmartin4242@REDACTED> wrote: 

> Raw socket options looks like it should be the answer, but I'm not getting good
> results:

> iex( [ mailto:worker@REDACTED | worker@REDACTED ] )28> {:ok, s} =
> :gen_tcp.connect('localhost', 80, [{:raw, 6, 15, <<1>>}, {:ip, {10, 138, 69,
> 63}}])

> {:ok, #Port<0.12110>}

> iex( [ mailto:worker@REDACTED | worker@REDACTED ] )29> :inet.getopts(s,
> [{:raw, 6, 15, 32}])

> {:ok, []} <== option not set?

> iex( [ mailto:worker@REDACTED | worker@REDACTED ] )29> {:ok, s} =
> :gen_tcp.connect('localhost', 80, [{:raw, 6, 15, <<1>>}, {:ip, {10, 138, 69,
> 64}}])

> ** (MatchError) no match of right hand side value: {:error, :eaddrnotavail}
IP_FREEBIND on connect doesn't make sense, it's only really useful on listen sockets. 

The option lets you bind to an IP address that does not yet exist on the host. That is ok for listen, but when you attempt to build an outgoing connection from that IP, then it has to be configured. 

> It appears that the IP_FREEBIND option is simply not set. If I use
> IP_TRANSPARENT instead:

> iex( [ mailto:worker@REDACTED | worker@REDACTED ] )35> {:ok, s} =
> :gen_tcp.connect('localhost', 80, [{:raw, 6, 19, <<1>>}, {:ip, {10, 138, 69,
> 63}}])

> {:ok, #Port<0.12113>}

> iex( [ mailto:worker@REDACTED | worker@REDACTED ] )34> :inet.getopts(s,
> [{:raw, 6, 19, 32}])

> {:ok, [{:raw, 6, 19, <<0, 0, 0, 0>>}]}
IP_TRANSPARENT needs special iptables rules to work correctly and is for a very specific use case. I don't think it would be very useful for an Erlang application to use that. 

> In this case, the raw option 19 (IP_TRANSPARENT) is set, but to false rather
> than true. I believe this is because the beam file needs root or CAP_NET_ADMIN.
You need root and a specific iptables setup for it to work. 

> Any thoughts?
What are you attempting to achieve anyway? 

Regards 
Andreas 

> On 2017-10-16 01:18 PM, Guilherme Andrade wrote:

>> I believe you can use raw socket options[1] for that, but it won't be portable.

>> [1]: [ http://erlang.org/doc/man/inet.html#setopts-2 |
>> http://erlang.org/doc/man/inet.html#setopts-2 ] - {raw, Protocol, OptionNum,
>> ValueBin}

>> On 16 October 2017 at 15:09, Michael L Martin < [ mailto:mmartin4242@REDACTED |
>> mmartin4242@REDACTED ] > wrote:

>>> Hi all,

>>> Is there a way to specify the FREEBIND option when opening a socket? I don't see
>>> any reference to it in the documentation.

>>> Thanks,

>>> _______________________________________________
>>> erlang-questions mailing list
>>> [ mailto:erlang-questions@REDACTED | erlang-questions@REDACTED ]
>>> [ http://erlang.org/mailman/listinfo/erlang-questions |
>>> http://erlang.org/mailman/listinfo/erlang-questions ]

>> --
>> Guilherme

> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20171020/45e7b842/attachment.htm>


More information about the erlang-questions mailing list