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 在 网络编程
每月 205 次下载
94KB
2.5K SLoC
tokio-wireguard
为 Tokio 提供的进程内 WireGuard 实现
lib.rs
:
为 Tokio 提供的进程内 WireGuard 实现
本 crate 提供 WireGuard 的 Tokio 基于进程内实现。每个 Interface
都由独立的 TCP/IP 堆栈支持,通过 WireGuard 隧道传输所有流量,并可用来创建 TCP (TcpStream
和 TcpListener
) 以及 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();
依赖项
~16–28MB
~512K SLoC