Как отправить HTTP-запрос с помощью интерфейса Tun Tap - PullRequest
0 голосов
/ 15 февраля 2020

Я работаю над проектом сетевого прокси и новичком ie в этом поле. Я хочу создать интерфейс tun-tap и отправить HTTP-запрос через этот интерфейс. Вот мой подход.

use tun_tap::Iface;
use tun_tap::Mode;
use std::process:Command;

fn cmd(cmd: &str, args: &[&str]) {
    let ecode = Command::new(cmd)
        .args(args)
        .spawn()
        .unwrap()
        .wait()
        .unwrap();
    assert!(ecode.success(), "Failed to execte {}", cmd);
}

fn main() {

    let iface = Iface::new("tun1",Mode::Tun).unwrap();

    cmd("ip", &["addr", "add", "dev", 'tun1', '192.168.0.54/24']);
    cmd("ip", &["link", "set", "up", "dev", 'tun1']);    

    // 192.168.0.53:8000 is my development server created by python3 -m http.server command
    let sent = iface.send(b"GET http://192.168.0.53:8000/foo?bar=898 HTTP/1.1").unwrap();
}

Но мой сервер разработки не получает никаких запросов. И не отображаются какие-либо ошибки.

1 Ответ

0 голосов
/ 22 апреля 2020

Интерфейс TUN отправляет и получает IP-пакеты. Это означает, что данные, которые вы передаете iface.send, должны быть IP-пакетами для доставки. Вы можете видеть в своем коде, что вы не указываете, к какому серверу вы подключаетесь, потому что на этом уровне соединения «даже не существуют». IP-адрес в HTTP-запросе указан там, потому что HTTP-протокол говорит об этом, но вы уже должны быть подключены к серверу, когда отправляете эту информацию.

Для отправки и получения данных из интерфейса Tun вы Вам нужно будет создать IP-пакет.

После того, как вы сможете отправлять и получать IP-пакеты, вам нужно будет реализовать протокол TCP поверх этого, чтобы иметь возможность открыть соединение с HTTP-сервером. На этом уровне (TCP) появляется понятие «соединение».

После того, как вы сможете открывать и отправлять / получать данные по TCP-соединению, вам потребуется реализовать протокол HTTP, чтобы иметь возможность общаться с HTTP-сервером, т.е. "GET http://192.168.0.53:8000/foo?bar=898 HTTP/1.1".

...