Bonjour,
je voudrais améliorer les performances d' un projet (en C).
le projet permet d'analyser des règles de politique de sécurité réseau;
la version actuelle du projet utilise (Flex et Bison) pour parser un fichier qui contient les règles et initialise une structure de donnée "tab_donnée" qui est une transcription d'une règle
voila le format d'une règle:
type_de_règle : (addr_src = @ipsrc ) & (addr_dest = @ipdst ) & ( (type_service portinf ... portsup) -> action ;
tel que:
- type_de_regle: (LAN,IN,OUT)
- typeservice: (tcp,http,udp...)
- action: (permit,deny,alert)
exempe:
lan : (addr_src = 192.168.1.1/24) & (addr_dest = 192.168.1.0/20) & ( http 80 ) -> permit ;
et voila la structure de données utilisée:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| // structure pour representer adresse ipv4 avec cidr ou sans
typedef struct _addr{
short egal; // 0 pour representer != ou n'appartient pas, 1 autrement
struct in_addr addr4;
struct in6_addr addr6;
int cidr;
int ipversion;
unsigned long haddr;
unsigned long hnetmask;
} addresse;
// structure pour representer port ou plage de ports
typedef struct _port{
short egal ; // 0 pour representer != ou n'appartient pas, 1 autrement
long inf;
long sup;
} port;
// structure pour representer reste selon type de protocole (TCP-UDP ou ICMP)
typedef struct s_proto{
struct s_tcp_udp {
port port_s;
port port_d;
short flags ;
short egal_flags;
} tcp_udp;
struct s_icmp{
short egal_type;
short type;
short egal_code;
short code;
} icmp;
} proto_packet;
// ligne du tableau pour representer la politique de securite
typedef struct s_tableau {
unsigned short action; // permit,deny,alert
unsigned short proto; // tcp,udp,http...
addresse addr_s; // ip_src
addresse addr_d; // ip_dest
proto_packet proto_protocole; // reste de protocole (port)
} tab_donnees;
typedef struct
{
tab_donnees **policy_in; // regle IN
tab_donnees **policy_out; // regle OUT
tab_donnees **policy_lan; // regle LAN
int policy_in_size;
int policy_out_size;
int policy_lan_size;
} access_policy; |
PS: le principe de fonctionnement: les éléments d'une règle (ip_src,ip_dest,protocole,port) sont matchés avec les caractéristiques d'une paquet réseau pour appliquer l'action indiquée dans la règle.
je voudrais convertir cette structure en un "Radix Trie" pour une recherche efficace , car actuellement c'est on a beaucoup de règles, les performances diminues gravement .
si vous avez des idées, aidez moi svp.
merci
Partager