Estou tentando configurar uma rede para uma VPN personalizadaCLIENTEbiblioteca.
O que eu não consigo descobrir
Preciso ser capaz de encaminhar o tráfego em uma configuração VPN normal para que meu script C++ possa ler/gravar no túnel. Se não me engano, a configuração deveria ser mais ou menos assim:
Normal Setup How I think my setup should be
------------------------------------------------------------
Start → Aplication → Finish Start → Aplication → Finish
↓ ↑ ↓ ↑
iface-enp0s3 iface-enp0s3
↓ ↑ ↓ ↑
interwebs iface-tun1
↓ ↑
c++ script
↓ ↑
vpn-server
↓ ↑
interwebs
Eu sei que meu script C++ atualmente não faz isso, atualmente ele apenas lê dados do tun1
adaptador. Por enquanto, isso é tudo o que estou tentando alcançar. No entanto, não consigo fazer as rotas funcionarem corretamente.
Quando eu visitohttp://google.comdo meu sistema cliente, quero ver esses pacotes exibidos no script C++ e o tráfego não ir para nenhum outro lugar.
Assim que eu conseguir rotear corretamente todo o tráfegoexcluindo o portoSe a VPN estiver conectada por meio do script C++ usando a interface de túnel, começarei a enviá-la por meio da biblioteca do cliente VPN.
O script C++ funciona atualmente, até onde eu sei. Quando faço ping em 10.0.0.2 (o tun1
adaptador), posso ver os pacotes chegando.
Eu tentei algumas coisas diferentes, nomeadamente o seguinte:
sudo iptables -t nat -A POSTROUTING --out-interface tun1 -j MASQUERADE
sudo iptables -A FORWARD --in-interface enp0s3 -j ACEITAR
Isso não funcionou.
Nota: já me certifiquei de que
net.ipv4.ip_forward
está definido1
e executei osudo sysctl -p
.
Veja abaixo informações sobre a configuração atual.
Nota: estou executando o Ubuntu 16.04 Desktop.
Meus adaptadores atuais
Nota: enp0s3 é meu adaptador principal. Isso está sendo executado em uma máquina virtual. enp0s3 é minha conexão com a internet.
enp0s3 Link encap:Ethernet HWaddr 08:00:27:ea:97:d2 inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet6 addr: fe80::8ec8:60b7:f404:77c5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:58668 errors:0 dropped:0 overruns:0 frame:0 TX packets:39067 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:39002535 (39.0 MB) TX bytes:7442839 (7.4 MB) tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.0.0.1 P-t-P:10.0.0.2 Mask:255.255.255.255 inet6 addr: fe80::fed9:4107:8688:8501/64 Scope:Link UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:0 (0.0 B) TX bytes:984 (984.0 B)
Como configuro meu tun1
adaptador
$ sudo ip tuntap adicionar dev tun1 modo tun
$ sudo ifconfig tun1 10.0.0.1 dstaddr 10.0.0.2 up
O script C++ que estou ouvindotun1
// Includes ommited.
using namespace std;
typedef void data_receiver(char* data, int length);
struct receive_handle {
data_receiver* receiver;
} typedef receive_handle;
// Function used to retrieve the interface.
static int if_nametofd(char *name)
{
int interface = open("/dev/net/tun", O_RDWR | O_NONBLOCK);
ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
if (ioctl(interface, TUNSETIFF, &ifr)) {
perror("Cannot get TUN interface");
exit(1);
}
return interface;
}
// Called when a packet is received from the tun0 interface.
void received_data(char* data, int length)
{
// Truncate the packet so that we only see the first 15 bytes.
// This way we don't spam the console.
for(int i=0; i<15; ++i)
std::cout << std::hex << (int)data[i];
std::cout << endl;
}
int main()
{
cout << "Getting interface..." << endl;
int iface = if_nametofd("tun1");
cout << "Using interface: " << iface << endl;
cout << "Creating handler..." << endl;
receive_handle* handle = (receive_handle*)malloc(sizeof(receive_handle));
handle->receiver = received_data;
char packet[1024];
cout << "Listening..." << endl;
while (true)
{
if (read(iface, packet, sizeof(packet)) > 0) {
handle->receiver(packet, sizeof(packet));
}
}
return 0;
}
O único objetivo deste script é travar o tun1
adaptador e lê-lo continuamente.
Responder1
Você precisa alterar o gateway padrão da sua estação de trabalho. Se você emitir o comando a seguir, verá o gateway padrão do sistema.
ip route show table main
default via 1.2.3.4 dev wanif
Você pode alterá-lo usando ip route replace (man ip-route).
Melhor, você pode usar o truque open vpn para substituir a rota padrão, sem precisar excluí-la (--redirect-gateway def1).
Isso funciona adicionando duas rotas cobrindo todo o espaço de endereços IPv4. Como cada uma dessas duas rotas é mais específica que a rota padrão, a rota padrão é praticamente substituída.
Isso é feito assim:
ip route add 0.0.0.0/1 via 10.0.2.15 dev tun1
ip route add 128.0.0.0/1 via 10.0.2.15 dev tun1
onde 10.0.2.15 é o endpoint local do seu túnel.
como seu script precisa se conectar em algum lugar "por meio da interweb normal" para fornecer algum serviço de tunelamento significativo, você precisa adicionar seu endpoint remoto assim para evitar ser coberto pela regra acima:
ip route add 7.8.9.10/32 via 1.2.3.4 dev wanif
onde 7.8.9.10 é seu endpoint remoto e 1.2.3.4 é seu gateway padrão do ISP.
Lembre-se das regras básicas das regras de roteamento: as mais específicas se aplicam às menos específicas