Estou tentando programar uma especie de VPN do zero e estou tendo dificuldades em tratar os pacotes lidos e escritos na interface.
O cliente se conecta com o servidor autentica com PAM, em seguida o servidor responde com um IP disponivel na linha 10.11.0.1/16
O Cliente configura a propria interface com tal IP (ex: 10.11.0.2/32)
Na parte do cliente eu leio os pacotes vindos da interface e envio o pacote para o socket que está ligado ao servidor.
No servidor eu recebo o tamanho do pacote, leio o socket do cliente até completar o tamanho e em seguida escrevo o tamanho do pacote e o pacote no fd da interface do servidor.
O problema está na parte de leitura da interface do servidor, nunca chega os pacotes destinados ao IP vinculado ao cliente, apenas recebo destinado a 10.11.0.1 e 0.0.0.0 então o cliente nunca recebe resposta.
Minha duvida é, se isso seria um problema de programação ou seria alguma regra de iptables ou rota sei la...
Não sou expert em rede nem em programação, mas tenho uma ideia em mente e queria faze-la funcionar, ficaria muito grato se algum experiente me desse uma luz.
Leitura da interface do servidor
ipListStr possue chave contendo o IP do cliente com o FD do socket desse cliente
std::map<std::string, int> ipListStr;
// Loop de saida da interfaçe
size_t plen;
uint_fast8_t pacote[BUFFER];
while (true){
// Lê os pacotes vindo do tunnel
if ((plen=(size_t) read(tunFd,pacote,(size_t) BUFFER)) < 1 ) break;
// Deve extrair o IP de destino do pacote
// E enviar para o socket vinculado ao endereço
write(ipListStr.at(inet_ntoa(addr)), &plen, sizeof(plen));
write(ipListStr.at(inet_ntoa(addr)), pacote, plen);
}
close(mainSckt);
}
Leitura do socket do cliente
ssize_t plen;
uint_fast8_t pacote[BUFFER];
while (true){