0

我正在从事网络代理项目和该领域的新手。我想创建一个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();
}

但是我的开发服务器没有收到任何请求。并且不显示任何错误。

4

1 回答 1

1

TUN接口发送和接收IP报文。这意味着您提供的数据iface.send必须是 IP 数据包才能被传递。你可以在你的代码中看到你没有指出你正在连接的服务器,因为在这一层连接“甚至不存在”。HTTP 请求中的 IP 恰好在那里,因为 HTTP 协议是这样说的,但是当您发送此信息时,您必须已经连接到服务器。

为了从 tun 接口发送和接收数据,您必须构建一个 IP 数据包。

一旦您可以发送和接收 IP 数据包,您就必须在此之上实现 TCP 协议才能打开与 HTTP 服务器的连接。在这一层(TCP)上出现了“连接”的概念。

一旦您可以通过 TCP 连接打开和发送/接收数据,您就必须实现 HTTP 协议才能与 HTTP 服务器通信,即"GET http://192.168.0.53:8000/foo?bar=898 HTTP/1.1".

于 2020-04-22T19:16:44.790 回答