Netlink & Perl problem investigated/revisited

Alexander Reelsen ar at rhwd.net
Mon Sep 11 23:19:52 CEST 2000


Moin

Vorwort: Diese Mail ist ziemlich lang und fuer Leute die nicht so viel mit
Perl machen am besten mit der D-Taste zu lesen. Falls jemand eine bessere
Mailingliste kennt, wo ich dieses Problem breitschlagen koennte, her mit
der addresse.

Ich bin immer noch am basteln, machen und werkeln an meinem problem, das
netlink device angemessen auszulesen.


Ich habe mit dem autor von fwdumpd gesprochen (ein tool was das netlink
device ausliest, aber 'leider' in C) und der sagte u.a. folgendes:

Reading from fwmonitor is deprecated, you should use the netlink
socket interface (this is what I do in fwdumpd)
The netlink device is a socket which commmunicates with
the kernel firewall driver.


Soweit, sogut. Ergo: bind() calls.
In C sieht das dann so aus:

--- snip ---
struct sockaddr_nl snl;
netlink = socket( PF_NETLINK, SOCK_RAW, NETLINK_FIREWALL );
if (bind ( netlink, (struct sockaddr *) &snl, sizeof snl) ) { ... }
--- snap ---

Auch klar soweit. Dann habe ich mit perl bzw h2ph aus dem netlink.h file
ein perl header file erstellt, um an PF_NETLINK und NETLINK_FIREWALL zu
kommen. Funktioniert auch. Das erste grosse Problem stellt sich nun mit
dem eigentlichen bind() call unter perl.

1. Problem - Wo kriege ich 'struct sockaddr_nl' her?
2. Problem - Wie sieht der bind call aus?

1. Auch da hat Francis J. Lacoste, der autor von fwdumpd (der aber auch
hier nicht mehr weiter weiss, da er das ganze nie in perl gemacht hat)
mit folgendem weitergeholfen. Nur leider kann ich damit nicht wirklich was
anfangen, denn wo soll ich das einsetzen?

--- snip ---
The sockaddr_nl can be created using pack.

>From linux/netlink.h :

struct sockaddr_nl
{
        sa_family_t     nl_family;      /* AF_NETLINK   */
        unsigned short  nl_pad;         /* zero         */
        __u32           nl_pid;         /* process pid  */
        __u32           nl_groups;      /* multicast groups mask */
};

So using pack :

# sa_family_t is u16 on my system (from bits/sockaddr.h)
# S is 16 unsigned short , L is 32 unsigned long
my $sockaddr_nl = pack( "SSLL", AF_NETLINK, 0, 0, -1 );
--- snap ---

2. Jaaaaaaaaaaa. Any ideas? :-)
bind(SOCKET, ##need_idea##);
Wo soll ich da das sockaddr_nl unterbringen?


Eigentlich wollte ich nur meine firewall scripts mit ein paar kleinen
features erweitern, aber anscheinend dehnt sich das irgendwie aus.. ;-)
Fuer jegliche Hilfen bin ich momenten unendlich dankbar, da ich hier in
einer totalen Sackgasse stecke...


MfG/Regards, Alexander

-- 
Alexander Reelsen   http://joker.rhwd.de
ref at linux.com       GnuPG: pub 1024D/F0D7313C  sub 2048g/6AA2EDDB
ar at rhwd.net         7D44 F4E3 1993 FDDF 552E  7C88 EE9C CBD1 F0D7 313C
Securing Debian:    http://joker.rhwd.de/doc/Securing-Debian-HOWTO

-
Hinweise zur Benutzung dieser (und anderer Mailing-Listen) bitte beachten:
--> http://lug-owl.de/mailinglist_hints.html <--



More information about the Linux mailing list