Estou tentando configurar uma rede para uma biblioteca VPN CLIENT personalizada.
O que não consigo descobrir
Eu preciso poder encaminhar o tráfego em uma configuração normal de VPN para que meu script C ++ possa ler / gravar no túnel. Se não me engano, a configuração deve ser algo 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 o meu script C ++ não faz isso atualmente, atualmente apenas lê os dados do adaptador tun1
. Por enquanto, é tudo o que estou tentando alcançar. No entanto, parece que não consigo fazer as rotas funcionarem corretamente.
Quando visito o link do sistema do meu cliente, quero ver esses pacotes exibidos no script C ++ e o tráfego não deve ser onde .
Depois que eu conseguir rotear corretamente todo o tráfego excluindo a porta em que a VPN está conectada por meio do script C ++ usando a interface de túnel, começarei a enviá-lo por meio da biblioteca cliente VPN. / p>
O script C ++ funciona atualmente, tanto quanto eu sei. Quando eu pingar 10.0.0.2 (o adaptador tun1
), posso ver os pacotes passarem.
Eu tentei algumas coisas diferentes, a saber:
sudo iptables -t nat -A POSTROUTING --out-interface tun1 -j MASQUERADE
sudo iptables -A FORWARD --in-interface enp0s3 -j ACCEPT
Isso não funcionou.
Note: I've already made sure that net.ipv4.ip_forward
is set to 1
and I've run sudo sysctl -p
.
Veja abaixo as informações sobre a configuração atual.
Note: I'm running Ubuntu 16.04 Desktop.
Meus adaptadores atuais
Note: enp0s3 is my primary adapter. This is running on a virtual machine. enp0s3 is my connection to the 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 eu configuro meu adaptador tun1
$ sudo ip tuntap add dev tun1 mode tun
$ sudo ifconfig tun1 10.0.0.1 dstaddr 10.0.0.2 up
O script em C ++ que eu escuto tun1
// 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;
}
Essa finalidade somente de scripts é travar no adaptador tun1
e ler continuamente a partir dele.