12 个版本
0.1.0 | 2024 年 7 月 24 日 |
---|---|
0.0.10 | 2024 年 5 月 12 日 |
0.0.9 | 2024 年 4 月 16 日 |
0.0.7 | 2024 年 3 月 30 日 |
0.0.0 | 2023 年 10 月 22 日 |
481 在 网络编程 中排名
每月 363 次下载
在 2 个包 中使用
69KB
1.5K SLoC
IpStack
为 Tun 设备提供的 TCP/IP 栈的异步轻量级用户空间实现。不稳定,处于开发中。
用法
use etherparse::{IcmpEchoHeader, Icmpv4Header, IpNumber};
use ipstack::stream::IpStackStream;
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use tokio::net::TcpStream;
use udp_stream::UdpStream;
#[tokio::main]
async fn main() {
const MTU: u16 = 1500;
let ipv4 = Ipv4Addr::new(10, 0, 0, 1);
let netmask = Ipv4Addr::new(255, 255, 255, 0);
let mut config = tun2::Configuration::default();
config.address(ipv4).netmask(netmask).mtu(MTU).up();
#[cfg(target_os = "linux")]
config.platform_config(|config| {
config.ensure_root_privileges(true);
});
#[cfg(target_os = "windows")]
config.platform_config(|config| {
config.device_guid(Some(12324323423423434234_u128));
});
let mut ipstack_config = ipstack::IpStackConfig::default();
ipstack_config.mtu(MTU);
let mut ip_stack =
ipstack::IpStack::new(ipstack_config, tun2::create_as_async(&config).unwrap());
while let Ok(stream) = ip_stack.accept().await {
match stream {
IpStackStream::Tcp(mut tcp) => {
let mut rhs = TcpStream::connect("1.1.1.1:80").await.unwrap();
tokio::spawn(async move {
let _ = tokio::io::copy_bidirectional(&mut tcp, &mut rhs).await;
});
}
IpStackStream::Udp(mut udp) => {
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(1, 1, 1, 1)), 53);
let mut rhs = UdpStream::connect(addr).await.unwrap();
tokio::spawn(async move {
let _ = tokio::io::copy_bidirectional(&mut udp, &mut rhs).await;
});
}
IpStackStream::UnknownTransport(u) => {
if u.src_addr().is_ipv4() && IpNumber::from(u.ip_protocol()) == IpNumber::ICMP {
let (icmp_header, req_payload) = Icmpv4Header::from_slice(u.payload()).unwrap();
if let etherparse::Icmpv4Type::EchoRequest(req) = icmp_header.icmp_type {
println!("ICMPv4 echo");
let echo = IcmpEchoHeader {
id: req.id,
seq: req.seq,
};
let mut resp = Icmpv4Header::new(etherparse::Icmpv4Type::EchoReply(echo));
resp.update_checksum(req_payload);
let mut payload = resp.to_bytes().to_vec();
payload.extend_from_slice(req_payload);
u.send(payload).unwrap();
} else {
println!("ICMPv4");
}
continue;
}
println!("unknown transport - Ip Protocol {}", u.ip_protocol().0);
}
IpStackStream::UnknownNetwork(pkt) => {
println!("unknown transport - {} bytes", pkt.len());
}
}
}
}
我们还建议您查看完整的 示例。
依赖关系
~6–8MB
~144K SLoC