Bonjour,

Je m'intéresse au protocole SSH pour la sécurisation de la transmission de données (O Rly?), je pense avoir bien potassé le sujet et quelques documentations. J'ai un peu bidouillé quelques trucs de base pour mettre en pratique, comme configurer le serveur SSH, me connecter en utilisant des clés publiques/privées, exécuter avec succès quelques exemples de libssh2. Jusque là tout va bien, je comprends bien tout ce qui se passe.
Mon but ultime étant d'utiliser un tunnel SSH pour accéder à un SGBD postgresql, une page de leur doc explique bien le principe. Pour l'implémentation dans un client, j'ai commencé à regarder l'exemple "tcpip-forward.c" de la lib. Et là, c'est le drame. Je n'arrive pas à me représenter ce qui est fait au niveau des connexions serveur distant-serveur ssh-client dans ce pavé:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
    printf("Asking server to listen on remote %s:%d\n", remote_listenhost,
        remote_wantport);
 
    listener = libssh2_channel_forward_listen_ex(session, remote_listenhost,
 
        remote_wantport, &remote_listenport, 1);
    if (!listener) {
        fprintf(stderr, "Could not start the tcpip-forward listener!\n"
                "(Note that this can be a problem at the server!"
                " Please review the server logs.)\n");
        goto shutdown;
    }
 
    printf("Server is listening on %s:%d\n", remote_listenhost,
        remote_listenport);
 
    printf("Waiting for remote connection\n");
    channel = libssh2_channel_forward_accept(listener);
 
    if (!channel) {
        fprintf(stderr, "Could not accept connection!\n"
                "(Note that this can be a problem at the server!"
                " Please review the server logs.)\n");
        goto shutdown;
    }
 
    printf("Accepted remote connection. Connecting to local server %s:%d\n",
        local_destip, local_destport);
    forwardsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    sin.sin_family = AF_INET;
    sin.sin_port = htons(local_destport);
    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(local_destip))) {
        perror("inet_addr");
        goto shutdown;
    }
    if (-1 == connect(forwardsock, (struct sockaddr *)&sin, sinlen)) {
        perror("connect");
        goto shutdown;
    }
 
    printf("Forwarding connection from remote %s:%d to local %s:%d\n",
        remote_listenhost, remote_listenport, local_destip, local_destport);
J'essaie de m'aider des noms de variables, mais ça ne m'éclaire pas vraiment...

Avis à ceux qui sont déjà passé par là