Mac下tun的测试

Mac下tun的测试

cargo.toml
tokio={version="1.0",features=["full"]}
tun = { version = "0.5", features = ["async"] }
futures="0.3"
tokio-util="0.6.9"
packet="0.1.4"
main.rs
use std::io::Error;
use futures::{SinkExt};
use packet::{builder::Builder, icmp, ip, Packet};
use tun::{self, Configuration, TunPacket};
use std::process::Command;
use futures::StreamExt;

#[tokio::main]
async fn main() {
    let mut config = tun::Configuration::default();

    config
        .address((10, 0, 0, 1))
        .netmask((255, 255, 255, 0))
        .up();

    #[cfg(target_os = "linux")]
        config.platform(|config| {
        config.packet_information(true);
    });

    let dev = tun::create_as_async(&config).unwrap();

    let upeth_str: String = "ifconfig utun3 10.0.0.13 10.0.0.1 up ".to_string();
    let routeadd_str: String = "sudo route -n add -net 18.10.49.3 -netmask 255.255.255.0 10.0.0.1".to_string();

    let upeth = Command::new("sh").arg("-c").arg(upeth_str).output().expect("sh exec error!");
    let ifconfigcmd = Command::new("sh").arg("-c").arg(routeadd_str).output().expect("sh exec error!");
    let cmd_str: String = " ifconfig|grep  flags=8051|awk -F ':' '{print $1}'|tail -1".to_string();

    let ifconfigcmd = Command::new("sh").arg("-c").arg(cmd_str).output().expect("sh exec error!");
    println!("{:?}", ifconfigcmd);
    let mut stream = dev.into_framed();

  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的TUN设备读写的示例代码: ```go package main import ( "fmt" "log" "net" "os" "syscall" ) const ( TUN_NAME = "tun0" TUN_IP = "10.0.0.1" TUN_MASK = "255.255.255.0" TUN_ROUTE = "10.0.0.0/24" ) func main() { // 创建TUN设备 fd, err := syscall.Open("/dev/net/tun", os.O_RDWR, 0) if err != nil { log.Fatal(err) } ifreq := &syscall.IFreq{Name: [16]byte{TUN_NAME[0], TUN_NAME[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} ifreq.Flags = syscall.IFF_TUN | syscall.IFF_NO_PI if err := syscall.IoctlSetInt(fd, syscall.TUNSETIFF, uintptr(unsafe.Pointer(ifreq))); err != nil { log.Fatal(err) } // 设置IP地址和路由 link, err := net.InterfaceByName(TUN_NAME) if err != nil { log.Fatal(err) } addr, err := netlink.ParseAddr(fmt.Sprintf("%s/%s", TUN_IP, TUN_MASK)) if err != nil { log.Fatal(err) } if err := netlink.AddrAdd(link, addr); err != nil { log.Fatal(err) } route := &netlink.Route{ LinkIndex: link.Index, Dst: &net.IPNet{ IP: net.ParseIP(TUN_ROUTE), Mask: net.CIDRMask(24, 32), }, } if err := netlink.RouteAdd(route); err != nil { log.Fatal(err) } // 读取数据 buf := make([]byte, 1500) for { n, err := syscall.Read(fd, buf) if err != nil { log.Fatal(err) } fmt.Printf("Received %d bytes from tunnel: %v\n", n, buf[:n]) // 处理数据 // ... // 发送数据 n, err = syscall.Write(fd, buf[:n]) if err != nil { log.Fatal(err) } fmt.Printf("Sent %d bytes to tunnel: %v\n", n, buf[:n]) } } ``` 需要注意以下几点: 1. 创建TUN设备需要打开`/dev/net/tun`设备文件,并使用`TUNSETIFF`命令设置设备类型和名称。 2. 设置IP地址和路由可以使用`netlink`包。 3. 读写数据可以使用`syscall.Read`和`syscall.Write`系统调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值