option dhcp119 – Search Domains

 Sans catégorie  Commentaires fermés sur option dhcp119 – Search Domains
Fév 022019
 

Je voulais passer plusieurs domaines de recherche dans l’option dhcp 119. Après plusieurs essais, mon client dhcp me dit toujours « suspect value in domain_search option – discarded »

Je cherche un peu sur le net, et il s’avère qu’il y a une syntaxe
rigolotte décrite dans la RFC3397

ci dessous un encodeur fait à l’arrache pour générer la chaine en hexadécimal correspondant a une liste

#include <stdio.h>

int main(void) {

    const char * StrToEncode = "lan chez.moi.net ailleurs.com";

    const char * ptrA = StrToEncode;
    const char * ptrB = StrToEncode;

    printf("\nSTART\n");

    printf("Chaine initiale : '%s'\n", StrToEncode);
    printf("Chaine resultat : '0x");

    while (1) {
        int cpt=0;
        const char * ptrB=ptrA;

        while (1) {
            if ( *ptrA =='\0' ) break;
            if ( *ptrA =='.' ) break;
            if ( *ptrA ==' ' ) break;
            cpt++;
            ptrA++;
        }

        printf("%02x", cpt);

        while ( ptrB != ptrA ) {
            printf("%02x", *ptrB);
            ptrB++;
        }

        if ( *ptrA ==' ' ) printf("00");        //separateur
        if ( *ptrA =='\0' ) { printf("00'\n");  break; }   //Fin de chaine

        ptrA++;
    }

    printf("END\n");
    return 0;
}

Client OpenVpn sur routeur Mikrotik

 Sans catégorie  Commentaires fermés sur Client OpenVpn sur routeur Mikrotik
Jan 162017
 

Petites mises au point

Mikrotik ne permet pas toutes ce que openVPN permet usuellement.
Pour faire simple :

  • Mode TCP obligatoire (même pas réglable)
  • Utiliser exclusivment le mode IP (mode ethernet au comportement plus qu’étrange si on tente du bridging donc, si c’est pour finir par faire du L3 dessus, c’est sans intéret)
  • Il y a une seule instance du serveur (On ne peut pas en mettre polusieurs sur plusieurs ports avec des conf différentes
  • Utilisation du mode d’authentification « user/password » (presque) obligatoire

Donc.

Etape1 : Générer les certificats.
C’est plus simple en SSH

/certificate
add ca-template key-usage=key-cert-sign,crl-sign days-valid=3650 key-size=4096
country=FR organization=orgName common-name=CA+orgName

ça, ça crée juste un template (cert request avec tout les params)
A noter que ca-template est en fait un nom tout à fait libre. C’est juste un identifiant. Mais c’est plus parlant de mettre un nom qui correspond à ce qu’on va faire et d’y integrer le mot clé « template » pour bien piger que c’est pas un certificat fini.

(auto) Signature

sign ca-template name=CA+orgName

A noter que le champs name est en fait libre. C’est juste un identifiant. Mais c’est plus parlant de le rendre égal au common-name.
Comme il n’y a aucun ca spécifié, il crée un autosigné.

set trusted=yes

Tada! Ce certif est desormais un CA.

export-certificate CA+orgName

Le certificat CA est exporté sous forme de fichier (section /files)
Il y en aura besoin pour le client openVPN

Création d’un Certif serveur pour OpenVpn

add name=server-template key-usage=digital-signature,key-encipherment,data-encipherment,crl-sign,tls-server,tls-client days-valid=3650 key-size=2048
country=FR organization=orgName common-name=OvpnServer

Idem, le champs name est en fait libre. C’est juste un identifiant.

sign server-template name=OvpnServer ca=CA+orgName

Re-Idem, le champs name est en fait libre. Mais c’est plus parlant de le rendre égal au common-name.
la signature se fait avec la clé du CA spécifié. (Il faut que cette clé ait l’attribut key-cert-sign, ce qu’on a fait plus haut)

Configuration du serveur OpenVpn

/ppp profile
add change-tcp-mss=yes name=default_ovpn use-compression=no use-encryption=yes use-mpls=no
/interface ovpn-server server
set certificate=OvpnServer cipher=aes256 default-profile=default_ovpn enabled=yes keepalive-timeout=30 max-mtu=1400

Configuration du client OpenVpn

Installer le client openvpn sur la machine.

Aller dans le dossier de configuration (Il n’y a pas de GUI config)
Y déposer le fichier CA.crt créé plus haut.

créer un fichier texte monvpn.ovpn

client
dev tun
proto tcp
remote 89.83.98.218 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca nomdufichier.crt ///// a  modifier
auth-user-pass login.txt
tun-mtu 1400
mssfix
route-nopull
route 10.25.0.0 255.255.0.0 ///// a  modifier : Réseau auquel le client accède
cipher AES-256-CBC
verb 4

créer un fichier texte login.txt

myusername
mekmitasdigoat

Cliquez sur connecter,
C’est fini

Comment virer APIPA

 Trucs et astuces techniques  Commentaires fermés sur Comment virer APIPA
Août 312012
 

Parmi les trucs automatiques crétin-friendly de l’informatique, il y a un truc qui m’insupporte, ce sont les adresses IP automatiques APIPA décrites ici http://tools.ietf.org/html/rfc3927 .

Les systèmes d’exploitation n’ont que 2 modes : Automatique et manuel.
Alors que de mon point de vue il y a 2 mode automatique :
Le mode « neu-neu » sans rien du tout et le mode « normal » avec un DHCP.

Autant je peux comprendre l’existence d’un mode autonome pour les lan à 3 machines maxi, Autant je trouve que c’est une une vraie plaie pour les réseaux « normaux » parce que

  • Ca ne sert à rien dans un réseau qui se rattache à internet, c’est à dire un bon 90% à mon avis.
  • Ca fait croire que ça marche alors que ça ne marche pas. Si par exemple le DHCP est injoignable, ça remplace une adresse qui marche par une adresse pourrie plutôt que de dire qu’il y a un problème de configuration réseau.
  • C’est persistant. Quand on a pris une adresse pourrie, on essaye surtout pas de voir si le DHCP est revenu, on garde l’adresse merdeuse.

Voici donc comment désactiver APIPA sous windows

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{000000ID-00DE-VOTRE-0000-000CARTE0RZO}
IPAutoconfigurationEnabled = 0

Terminologie IPv6

 Sans catégorie  Commentaires fermés sur Terminologie IPv6
Août 292012
 

Extraits de la RFC4862

  • IP – Internet Protocol Version 6. The terms IPv4 and IPv6 are used only in contexts where necessary to avoid ambiguity.
  • node – a device that implements IP.
  • router – a node that forwards IP packets not explicitly addressed to itself.
  • host – any node that is not a router.
  • upper layer – a protocol layer immediately above IP. Examples are transport protocols such as TCP and UDP, control protocols such as ICMP, routing protocols such as OSPF, and Internet or lower-layer protocols being « tunneled » over (i.e., encapsulated in) IP such as IPX, AppleTalk, or IP itself.
  • link – a communication facility or medium over which nodes can communicate at the link layer, i.e., the layer immediately below IP. Examples are Ethernets (simple or bridged); PPP links; X.25, Frame Relay, or ATM networks; and Internet (or higher) layer « tunnels », such as tunnels over IPv4 or IPv6 itself.
  • interface – a node’s attachment to a link.
  • address – an IP-layer identifier for an interface or a set of interfaces.
  • unicast address – an identifier for a single interface. A packet sent to a unicast address is delivered to the interface identified by that address.
  • multicast address – an identifier for a set of interfaces (typically belonging to different nodes). A packet sent to a multicast address is delivered to all interfaces identified by that address.
  • anycast address – an identifier for a set of interfaces (typically belonging to different nodes). A packet sent to an anycast address is delivered to one of the interfaces identified by that address (the « nearest » one, according to the routing protocol’s measure of distance). See [RFC4291].
  • solicited-node multicast address – a multicast address to which Neighbor Solicitation messages are sent. The algorithm for computing the address is given in [RFC4291].
  • link-layer address – a link-layer identifier for an interface. Examples include IEEE 802 addresses for Ethernet links and E.164 addresses for Integrated Services Digital Network (ISDN) links.
  • link-local address – an address having link-only scope that can be used to reach neighboring nodes attached to the same link. All interfaces have a link-local unicast address.
  • global address – an address with unlimited scope.
  • communication – any packet exchange among nodes that requires that the address of each node used in the exchange remain the same for the duration of the packet exchange. Examples are a TCP connection or a UDP request-response.
  • tentative address – an address whose uniqueness on a link is being verified, prior to its assignment to an interface. A tentative address is not considered assigned to an interface in the usual sense. An interface discards received packets addressed to a tentative address, but accepts Neighbor Discovery packets related to Duplicate Address Detection for the tentative address.
  • preferred address – an address assigned to an interface whose use by upper-layer protocols is unrestricted. Preferred addresses may be used as the source (or destination) address of packets sent from (or to) the interface.
  • deprecated address – An address assigned to an interface whose use is discouraged, but not forbidden. A deprecated address should no longer be used as a source address in new communications, but packets sent from or to deprecated addresses are delivered as expected. A deprecated address may continue to be used as a source address in communications where switching to a preferred address causes hardship to a specific upper-layer activity e.g., an existing TCP connection).
  • valid address – a preferred or deprecated address. A valid address may appear as the source or destination address of a packet, and the Internet routing system is expected to deliver packets sent to a valid address to their intended recipients.
  • invalid address – an address that is not assigned to any interface. A valid address becomes invalid when its valid lifetime expires. Invalid addresses should not appear as the destination or source address of a packet. In the former case, the Internet routing system will be unable to deliver the packet; in the latter case, the recipient of the packet will be unable to respond to it.
  • preferred lifetime – the length of time that a valid address is preferred (i.e., the time until deprecation). When the preferred lifetime expires, the address becomes deprecated.
  • valid lifetime – the length of time an address remains in the valid state (i.e., the time until invalidation). The valid lifetime must be greater than or equal to the preferred lifetime. When the valid lifetime expires, the address becomes invalid.
  • interface identifier – a link-dependent identifier for an interface that is (at least) unique per link [RFC4291]. Stateless address autoconfiguration combines an interface identifier with a prefix to form an address. From address autoconfiguration’s perspective, an interface identifier is a bit string of known length. The exact length of an interface identifier and the way it is created is defined in a separate link-type specific document that covers issues related to the transmission of IP over a particular link type (e.g., [RFC2464]). Note that the address architecture [RFC4291] also defines the length of the interface identifiers for some set of addresses, but the two sets of definitions must be consistent. In many cases, the identifier will be derived from the interface’s link-layer address.

Le besoin de hasard en cryptographie

 Trucs et astuces techniques  Commentaires fermés sur Le besoin de hasard en cryptographie
Août 182011
 

Les ordinateurs sont totalement déterministes.
En dépit du fonctionnement souvent incohérent des programmes informatiques mal conçus, le matériel informatique est souvent cohérent et fiable.
La cryptographie nécessite pour être efficace de disposer de nombres à peu près aléatoires mais surtout très difficilement prévisibles, ce qui est loin d’être évident sur un système déterministe.
Les programmeurs ont conçu de nombreuses méthodes pour que les ordinateurs génèrent des nombres apparemment aléatoires.
Ces algorithmes sont regroupés sous le nom générique de générateurs de nombres pseudo-aléatoires (PRNG).
Les générateurs de nombres pseudo-aléatoires suffisent pour des applications simples, comme la création d’événements « aléatoires » dans des jeux vidéo. Le générateur de congruence linéaire (GCL), est un exemple classique de ce type d’algorithme.
Pourtant, rien n’est vraiment imprévisible dans les calculs effectués, et là réside le problème : un attaquant peut facilement utiliser sa propre copie du générateur pour
connaître tous les résultats que notre PRNG créera.
Même si notre PRNG part d’un état initial inconnu de l’attaquant, il est souvent possible de déduire des propriétés importantes de cette valeur initiale en observant les sorties produites puis d’utiliser ces informations pour régler son propre PRNG. Une méthode générale pour reconstruire et prédire tous les polynômes des générateurs de congruence a été établie dans les années 1990. Ce problème crée un trou béant dans la sécurité des algorithmes de cryptage.

La seule méthode qu’un ordinateur peut employer pour produire des données quasiment imprévisibles consiste à rassembler autant d’informations non prévisibles que possible à partir de ‘environnement physique et de les utiliser comme valeurs à transférer à tous les programmes qui nécessitent une bonne part de hasard. C’est pourquoi on récupère des événements vraisemblablement peu prévisibles comme les I/O clavier/souris, réseau et disques.

Le problème est que dans des conditions particulières, ces événements vraisemblablement peu prévisibles le sont en fait assez (prévisibles).

De nos jours, un certain nombre de plates-formes matérielles implémentent des générateurs de nombres aléatoires physiques, appelés vrais générateurs de nombres aléatoires (TRNG, de l’anglais True Random Number Generators). Ils font appel à certaines caractéristiques physiques d’un composant qui changent en raison d’un bruit thermique comme par exemple le courant dans un résistor. Cette solution simple à base de semi-conducteur est assez fiable.
Une des techniques les plus sure mais des plus tordues à mettre en œuvre est la mesure de la décroissance radioactive d’un isotope instable. Ces périphériques offrent un moyen plus fiable de générer des données vraiment imprévisibles par rapport à la collecte d’informations dont on ne fait simplement qu’espérer qu’elles soient difficiles à prédire.

Postfix Virtual map

 Trucs et astuces techniques  Commentaires fermés sur Postfix Virtual map
Jan 262011
 

Pour régénérer les databases il faut utiliser la commande « postmap »
exemple :

postmap /etc/postfix/virtual.cf

cela permet de parser le fichier virtual.cf pour régénérer un fichier database

/etc/init.d/postfix restart

Consulter ensuite /var/log/mail.info et /var/log/mail.err

Netstat et ses options sympa

 Trucs et astuces techniques  Commentaires fermés sur Netstat et ses options sympa
Fév 092010
 

Pour avoir des statistiques réseau sous linux, vous connaissez certainement netstat

Certaines combinaisons d’options sont plus faciles à retenir avec des moyens mnemotechniques
Parmis les options intéressantes :

netstat -lapute

ou encore

netstat -pantalon

Ce sont évidemment des options composées, pour plus d’infos RTFM.

Monitoring CPU temps réel

 Trucs et astuces techniques  Commentaires fermés sur Monitoring CPU temps réel
Fév 082010
 

voici un petit bout de code C qui mesure l’activité CPU d’une machine et envoie les statistiques à une machine de monitoring

#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#define BUFSIZE 1024


enum { CURRENT , OLD , DIFF , PERCENT , TABSIZE };
enum { USR, NICE, SYSTEM , IDLE , IOWAIT , IRQ , SOFTIRQ , TOTAL , NBCOLS };
enum { ERROR, OK };

unsigned long long int table[NBCOLS][TABSIZE];

void setcolor(int f, int b) { printf("%c[0;%d;%dm",27,30+f,40+b); }
void setfcolor(int f) { printf("%c[%d;%dm", 27, f/8, 30+(f%8) ); }
void setbcolor(int b) { printf("%c[%d;%dm", 27, b/8, 40+(b%8) ); }
void setdefault(void) { printf("%c[m",27); }
char thishostname[BUFSIZE];



int s;
struct sockaddr_in srvAddr;
struct hostent *h;

void recuphostname(void)
{	FILE * f;
	f=fopen("/etc/hostname" ,"r");
	fgets(thishostname , BUFSIZE-1 , f);
	if ( thishostname[strlen(thishostname)-1] == '\n') thishostname[strlen(thishostname)-1] ='\0';
	fclose(f);
}

int recup(void)
{   FILE * f;
    char cpuline[BUFSIZE];
    unsigned int i;
    
    f=fopen("/proc/stat" ,"r");
    if (!f) return ERROR;    
    fgets(cpuline , BUFSIZE-1 , f);
    fclose(f);

    for ( i=0 ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; 
    sscanf(cpuline+i, "%llu", &( table[USR][CURRENT] )        );
    for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; 
    sscanf(cpuline+i, "%llu", &( table[NICE][CURRENT] )       );
    for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; 
    sscanf(cpuline+i, "%llu", &( table[SYSTEM][CURRENT] )     );
    for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; 
    sscanf(cpuline+i, "%llu", &( table[IDLE][CURRENT] )       );
    for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; 
    sscanf(cpuline+i, "%llu", &( table[IOWAIT][CURRENT] )     );
    for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; 
    sscanf(cpuline+i, "%llu", &( table[IRQ][CURRENT] )        );
    for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; 
    sscanf(cpuline+i, "%llu", &( table[SOFTIRQ][CURRENT] )    );
    return OK;
}


void affiche(void)
{   printf("USR=%03lu ",     table[USR][PERCENT]);
    printf("NICE=%03lu ",    table[NICE][PERCENT]);
    printf("SYSTEM=%03lu ",  table[SYSTEM][PERCENT]);
    printf("IDLE=%03lu ",    table[IDLE][PERCENT]);
    printf("IOWAIT=%03lu ",  table[IOWAIT][PERCENT]);
    printf("IRQ=%03lu ",     table[IRQ][PERCENT]);
    printf("SOFTIRQ=%03lu\n", table[SOFTIRQ][PERCENT]);
}

void affiche2(void)
{   int i;
    int cpt=0;

    printf("[");   
    //setfcolor(0);
    setfcolor(2);
    for ( i=0 ; i < table[USR][PERCENT] ; i++ ) { putc('U',stdout); cpt++; }
    setfcolor(1);
    for ( i=0 ; i < table[SYSTEM][PERCENT] ; i++ ) { putc('S',stdout); cpt++; }
    setfcolor(4);
    for ( i=0 ; i < table[IOWAIT][PERCENT] ; i++ ) { putc('W',stdout); cpt++; }
    setfcolor(6);
    for ( i=0 ; i < table[IRQ][PERCENT]+table[SOFTIRQ][PERCENT] ; i++ ) { putc('I',stdout); cpt++; }
    setdefault();
    for ( i=cpt ; i < 100 ; i++ ) putc(' ',stdout);
    printf("] CHARGE CPU : %4lu%% \n", 100 - table[IDLE][PERCENT] );

   
}

void affichenet(void)
{   char outbuffer[2000];

    sprintf(outbuffer , "%s|",thishostname);
    sprintf(outbuffer+strlen(outbuffer) , "%lu|",     table[USR][PERCENT]);
    sprintf(outbuffer+strlen(outbuffer) , "%lu|",    table[NICE][PERCENT]);
    sprintf(outbuffer+strlen(outbuffer) , "%lu|",  table[SYSTEM][PERCENT]);
    sprintf(outbuffer+strlen(outbuffer) , "%lu|",    table[IDLE][PERCENT]);
    sprintf(outbuffer+strlen(outbuffer) , "%lu|",  table[IOWAIT][PERCENT]);
    sprintf(outbuffer+strlen(outbuffer) , "%lu|",     table[IRQ][PERCENT]);
    sprintf(outbuffer+strlen(outbuffer) , "%lu\n", table[SOFTIRQ][PERCENT]);

    printf("%s", outbuffer);

    sendto(s, outbuffer, strlen(outbuffer)+1, 0, (struct sockaddr *) &srvAddr, sizeof(srvAddr));

}

void submain(void)
{       
    unsigned int i=0;
   
    
    if ( ! recup() ) return;
    
    for ( i=USR ; i<TOTAL ; i++)
    {       if (table[i][CURRENT]<table[i][OLD]) return;
    }

    table[TOTAL][CURRENT] = 0;
    for ( i=USR ; i<TOTAL ; i++ ) 
        table[TOTAL][CURRENT] += table[i][CURRENT];           /*genere le total       */
    for ( i=USR ; i<=TOTAL ; i++) 
        table[i][DIFF] = table[i][CURRENT] - table[i][OLD];   /*genere différences */

    if ( table[TOTAL][DIFF] == 0 ) return;
    for ( i=USR ; i<=TOTAL ; i++) 
        table[i][PERCENT] = ( table[i][DIFF] * 100 ) / table[TOTAL][DIFF];    /*calcul pourcentages */

    //affiche2();
    affichenet();
    
    for ( i=USR ; i<=TOTAL ; i++ ) 
        table[i][OLD]=table[i][CURRENT];     /*archive les anciennes valeur pour la prochaine mesure */
    
}


int main(void)
{       
    unsigned int i=0;
    unsigned int j=0;
    struct timespec ts;
    ts.tv_sec=0;
    ts.tv_nsec=100000000;
   
     
    for ( i=USR ; i<=TOTAL ; i++) for (j=CURRENT ; j<NBCOLS ; j++ ) table[i][j]=0;
    
    recuphostname();

    srvAddr.sin_family = AF_INET;
    srvAddr.sin_port = htons(31857);
    srvAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    

    s=socket(AF_INET,SOCK_DGRAM,0);
    if ( s<0 ) return 1;

    while (1)
    {   nanosleep(&ts, NULL);
        submain();
    }
     return 0;
}

Rsync en specifiant une clé RSA

 Trucs et astuces techniques  Commentaires fermés sur Rsync en specifiant une clé RSA
Jan 202010
 

L’astuce est de specifier la commande ssh que rsync doit utiliser pour se connecter et de donner les bonnes options à ssh

exemple

rsync -av -e "ssh 
-o UserKnownHostsFile=/dev/null 
-o StrictHostKeyChecking=no 
-o PasswordAuthentication=no 
-i $RSAKEYFILE" 
--delete-before 
$LOCALPATH 
user@$BACKUPSRV:$REMOTEBACKUPPATH

(Supprimer les retour de ligne pour utiliser)