pymumu / smartdns

A local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH. 一个本地DNS服务器,获取最快的网站IP,获得最佳上网体验,支持DoH,DoT。
https://pymumu.github.io/smartdns/
GNU General Public License v3.0
7.92k stars 1.05k forks source link

nftset.h 封装求助 #1754

Closed mokeyish closed 2 weeks ago

mokeyish commented 2 weeks ago

大佬,我想实现 rust 版 smartdns 添加 IP 到 nftset。 nftset 的 c 库看着用不来,太复杂了。

看到你这里定义的接口简单直白。

https://github.com/pymumu/smartdns/blob/07c13827bb523519a638214ed7ad76180f71a40a/src/include/nftset.h#L26-L29

但是对应 c 代码实现,有依赖这些文件 https://github.com/pymumu/smartdns/blob/07c13827bb523519a638214ed7ad76180f71a40a/src/lib/nftset.c#L21-L22

看着是日志相关的?


大佬你是否可以调整下这块代码,使用条件编译,启用依赖 dns_conf.h 和 tlog.h ?让我那编译时直接下载你这两个代码文件,不要调整。

这教程还没尝试过,不知道可不行。

https://medium.com/dwelo-r-d/using-c-libraries-in-rust-13961948c72a

pymumu commented 2 weeks ago

rust应该有nfset的库吧

mokeyish commented 2 weeks ago

他们是用工具根据 nftset 的 c 头文件生成一堆函数,然后封装的也不全。 比如这个 https://gitlab.com/rustwall/rustables/-/blob/master/rustables/build.rs?ref_type=heads

看不明白怎么用,看你这有,除了上面提到日志相关的依赖,其他都是的系统和nft类库依赖吧,这样只要用这头文件里定义的函数生成对应的两个 rust 函数,这样也精简,不用生成一堆用不到的函数定义。

pymumu commented 2 weeks ago

lib.tar.gz

试试吧

mokeyish commented 2 weeks ago

@pymumu 非常感谢。我前面的意思是,日志相关的用个条件编译。你这边编译就把条件开启来,我那边就下载你主分支对应文件,只不过编译时不开,这样后续就共用一份代码了,也不用单独维护。

pymumu commented 2 weeks ago

这个改的不多,直接copy吧

mokeyish commented 2 weeks ago

@pymumu 大佬,我这样调用不对? https://github.com/mokeyish/nftcli/blob/ce7fed148ab52abacef94ac9afaf225ce71a7f5c/src/main.rs#L107

image

family_name 我试了 ip inet 都不行。。。它返回的时 -1。IP 地址我写的是 4 个字节的数组指针,这个字节序应该是 big endian 吧?

#!/usr/sbin/nft -f

table inet ray
delete table inet ray

table inet ray {
  set directlist_v4 {
    type ipv4_addr
    flags interval
  }
}

table ip ray
delete table ip ray

table ip ray_v4 {
  set directlist_v4 {
    type ipv4_addr
    flags interval
  }

}
pymumu commented 2 weeks ago

ip是二进制数据,不是字符串 v4地址4字节,v6地址16字节

mokeyish commented 2 weeks ago

是这样的这里转成 4 字节了。https://github.com/mokeyish/nftcli/blob/ce7fed148ab52abacef94ac9afaf225ce71a7f5c/src/main.rs#L17 打印控制台打印确定程序是执行到 ret = _nftset_socket_send(buf, buffer_len);,它返回 —1

难道 addr_len 是ip字节长度(只能填4和16)?还是地址前缀长度?

pymumu commented 2 weeks ago

mokeyish commented 2 weeks ago

可以添加成功和删除成功了。不过返回值都是 -1。c 语言里面貌似正常是 0,错误是 1?

image

addr_len 既然是根据 ip 定的,封装后,可以省略了,直接填 IP,这样更简洁 https://github.com/mokeyish/nftcli/blob/main/src/main.rs#L108 image

pymumu commented 2 weeks ago

成功是返回0,-1是错误

mokeyish commented 2 weeks ago

那就奇怪了,IP 是进去了,但是返回都是 -1。 如果 IP 字节没问题,那就是字符串了。 字符串传入的是 cstring 的指针,c 里面有特殊字节表示结尾(长度)的?

mokeyish commented 2 weeks ago

大佬有时间帮我看看, 仓库:https://github.com/mokeyish/nftcli c 代码有变更运行 cargo clean。 编译 cargo build 运行 sudo ./target/debug/nftapp

pymumu commented 2 weeks ago
static int _nftset_socket_send(void *msg, int msg_len)
{
    return _nftset_socket_request(msg, msg_len, NULL, 0);
}

这个改成这样,给你的代码,之前有错误。

mokeyish commented 2 weeks ago

@pymumu 程序搞定了,测试可行。

还有两个小问题。

  1. 按你上面的改后,不论是否成功,全部都返回 0 了(如果没有对应table set,没添加上去也是 0)

  2. 这个执行 nftset_add, 程序端是否有缓存判断已经加入 nftset 了,还是直接调用此函数,剩下的有系统自己判断是否重复添加?

pymumu commented 2 weeks ago

之前代码是有确认结果的,但一般请netlink通信不会有问题。所以就只发送没有接收确认结果。 重复加入如果timeout>0是会先删除的,否则也没必要判断重复。

mokeyish commented 2 weeks ago

Ok, 非常感谢🙇‍

mokeyish commented 2 weeks ago

https://github.com/mokeyish/nftapp