#tokio #wireguard #networking #wg

tokio-wireguard

为 Tokio 提供的进程内 WireGuard 实现

4 个版本

0.1.3 2024 年 8 月 4 日
0.1.2 2024 年 8 月 4 日
0.1.1 2024 年 8 月 4 日
0.1.0 2024 年 8 月 3 日

#1384网络编程

Download history 198/week @ 2024-08-03 7/week @ 2024-08-10

每月 205 次下载

MIT/Apache

94KB
2.5K SLoC

tokio-wireguard

为 Tokio 提供的进程内 WireGuard 实现

crates.io Documentation


lib.rs:

为 Tokio 提供的进程内 WireGuard 实现

本 crate 提供 WireGuard 的 Tokio 基于进程内实现。每个 Interface 都由独立的 TCP/IP 堆栈支持,通过 WireGuard 隧道传输所有流量,并可用来创建 TCP (TcpStreamTcpListener) 以及 UDP (UdpSocket) 套接字,这些套接字尽可能遵循 tokio::net 的 API。

接口可以在运行时动态配置,同一进程中可以存在任意数量的接口。这使得应用程序能够在任何 Tokio 支持的平台上的细粒度控制下支持 WireGuard,而无需 root 权限。

接口还可以将流量转发到远程 WireGuard 对等节点。然而,目前它们不能将流量转发到 WireGuard 网络外的其他接口。

use tokio::io::AsyncWriteExt;
use tokio_wireguard::{
    config::{Config, Interface, Peer},
    interface::ToInterface,
    TcpStream,
};

let config = Config {
    interface: Interface {
        private_key,
        // Our address on the WireGuard network
        address: "100.64.0.2/32".parse().unwrap(),
        // Let the interface pick a random port
        listen_port: None,
        // Let the interface pick an appropriate MTU
        mtu: None,
    },
    peers: vec![Peer {
        public_key: remote_public_key,
        // This is where the tunneled WireGuard traffic will be sent
        endpoint: Some("198.51.100.30:51820".parse().unwrap()),
        // IP addresses the peer can handle traffic to and from on the WireGuard network
        // The /32 suffix indicates that the peer only handles traffic for itself
        allowed_ips: vec!["100.64.0.1/32".parse().unwrap()],
        // Send a keepalive packet every 15 seconds
        persistent_keepalive: Some(15),
    }],
};
let interface = config.to_interface().await.unwrap();

let mut stream = TcpStream::connect("100.64.0.1:8080", &interface)
    .await
    .unwrap();
stream.write_all(b"Bonjour").await.unwrap();

此库基于 smoltcpboringtun 构建,没有这些出色的项目,本库将无法存在。

依赖项

~16–28MB
~512K SLoC