Re: How to read all traffic received on one network interface using Erlang

Papa Tana <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <CAGoraXRyhz+5twZVFLK_HCQY7pnO9P25DWf+Cm=2UR+eAzUN=w@mail.gmail.com>
Hi All,

Excuse-me to talk about it again, because it becomes more interesting now,
as I can see the deep functions provided by Erlang.

As I said previously, https://github.com/msantos/epcap.git is solving my
need.

Anyway, I tried all the suggestions of Lukasz:

1/[WORKING] Unix-Domain + gen_udp/gen_tcp:
{ok, Server} = gen_udp:open(0, [{ifaddr,{local,"/tmp/socket"}}])
gen_udp:send(UnixSock, {local, "/tmp/socket"}, 0, "Hello Unix-Domain
World").
%% it's pretty useful.

2/[WORKING] Allocate a named pipe by mkfifo and listen/send in Erlang:
mkfifo dump.unix
open_port("dump.unix", [eof]).
port_command(HelloFifo, <<"Hey! Hello again\n">>).
%% I can even pipe the output of tcpdump, which is doing all the job for
me, and I can get all data from Erlang, Great!! :-)
%% This was solving my need as well!

3/ Anyway, I hope I did not misunderstood, but I was undesrtanding that it
was feasible to connect to an existing named pipe "allocated by mkfifo" via
gen_udp/gen_tcp?
because for this, I always fail, since the named pipe has the same name as
my unix-domain socket.

{error, eaddrinuse} when listen , {error, econnrefused} when send

==> So my question is, How do you connect to an existing named pipe
allocated by mkfifo, via gen_udp/gen_tcp, not using open_port?

Thank you!

PS: I will try to understand socat and cap_net_raw as well later on :-p

Best Regards,

Le mar. 11 août 2020 à 18:52, Łukasz Niemier <[email protected]> a écrit :

> > To make a direct pipe, I'm getting from 'tcpdump' and 'replay' on the
> other side like below:
> >
> > # tcdump -i eth0 -w -'..... | tcpreplay -i eth1 - ....
>
> This is "unnamed pipe", what I meant is named pipe:
>
> $ mkfifo dump.pcap
> $ # start VM that will read from `dump.pcap`
> # tcpdump -i eth0 -w dump.pcap
>
> Alternatively you can use socat and UNIX socket
>
> # tcpdump -i eth0 -w - | socat stdin unix-sendto:dump.unix # it will use
> datagram UNIX socket, use unix-listen for stream socket
> $ # start VM and connect to the dump.unix via gen_udp/gen_tcp
>
> You can also use socat for sending data to the named pipe if you want
> using pipe:dump.pcap. In that form you will not need to run VM with any
> raised privileges, just regular user that can read named pipe/UNIX socket.
>
> --
>
> Łukasz Niemier
> [email protected]
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.