#ip-address #compile #userspace #tailscale #listen #libtailscale #tailnet

tsnet

将 Tailscale 编译到您的程序中,并在 tailnet 上获得一个完全的用户空间 IP 地址

1 个不稳定发布

0.1.0 2023 年 3 月 12 日

#5 in #tailscale

BSD-3-Clause

35KB
875

tsnet - libtailscale 的绑定。

libtailscale 是一个 C 库,它将 Tailscale 嵌入到进程中。tsnet 是一个 Rust 包,它包装 libtailscale 并在顶部公开 Rust-y API。

使用此库将 Tailscale 编译到您的程序中,并在 tailnet 上获得一个 IP 地址,完全是用户空间的。

要求

  • Rust 编译器和 Cargo
  • Go v1.20 或更高版本

入门

在运行 cargo init 后,将以下行添加到您的 Cargo.toml 文件中

tsnet = "0.1.0"

开发

使用

cargo build

使用

cargo test

使用

cargo run --example echo_server
cargo run --example echo_client

错误

请在此 问题跟踪器 上提交有关此代码或托管服务的任何问题。

许可证

本仓库使用 BSD 3-Clause 许可证,请参阅 LICENSE。


lib.rs:

将 Tailscale 编译到您的程序中,并在 tailnet 上获得一个完全的用户空间 IP 地址。

从这里,您可以监听其他程序在您的 tailnet 上呼叫您,或直接连接到其他服务。

基于 libtailscale,它是围绕 Tailscale Go 包的 C 包装器。请参阅 https://pkg.go.dev/tailscale.com/tsnet 以获取 Go 模块文档。

示例

服务器

use std::net::TcpStream;
use tsnet::{ServerBuilder, Network};

fn main() {
    let ts = ServerBuilder::new().ephemeral().redirect_log().build().unwrap();
    let ln = ts.listen(Network::Tcp, ":1999").unwrap();

    for conn in ln {
        match conn {
            Ok(conn) => handle_client(conn),
            Err(err) => panic!("{err}"),
        }
    }
}

fn handle_client(mut stream: TcpStream) {
  // ...
}

客户端

use std::{env, io::Write};

use tsnet::{ServerBuilder, Network};

fn main() {
    let srv = ServerBuilder::new()
        .ephemeral()
        .build()
        .unwrap();

    let mut conn = srv.connect(Network::Tcp, "echo-server:1999").unwrap();
    write!(conn, "This is a test of the Tailscale connection service.\n").unwrap();
}

依赖关系

~2–14MB
~137K SLoC