博文

sing-box的IPv4优先 IPv6优先行为受 gai.conf 控制?

图片
前言 群友反馈在Deiban13下不能设置IPv4优先 通过进一步的交流, 群友的意思是 sing-box 向外访问, 无法通过 gai.conf 来设置是 IPv4优先 还是 IPv6优先 群友用的是fakeip的模式, 翻墙客户端发给梯子的数据包中只有域名, 没有IP. 技术基础 用 curl socks5h 模拟翻墙客户端 fakeip 行为 编译getaddrinfo钩子 钩Go程序 编译sing-box https://sing-box.sagernet.org/zh/installation/build-from-source/ 准备测试环境 搭建一个简单的sing-box服务端 官方安装脚本  curl -fsSL https://sing-box.app/install.sh | sh 配置文件 nano /etc/sing-box/test-config.json {   "log": {     "level": "debug",     "output": "test-box.log",     "timestamp": true   },   "inbounds": [     {       "type": "socks",       "tag": "socks-in",       "listen": "127.0.0.1",       "listen_port": 1080     }   ],   "outbounds": [     {       "type": "direct"     }   ] } 命令行前台运行sing-box(不能Ctrl+C中断, 就这么放着) /usr/bin/sing-box -D /var/lib/sing-box -c /etc/sing-box/test-config.json run 新开一个SSH终端窗口. cur...

编译getaddrinfo钩子 LD_PRELOAD加载 钩Python程序 钩Go程序 GODEBUG=netdns=cgo

图片
上一篇, 我们用钩子拦截系统接口调用的方法验证某个程序是否调用了getaddrinfo系统接口. 这样的钩子技术可以应用在很多其它情况下. 并不会因为钩子的源代码是C, 就只能钩C写的程序 (curl 是 C写的). 编译钩子请参考 上一篇 , 略. 钩子文件是 /root/ hook_getaddrinfo.so 钩 Python 程序 感谢 Debian中文群的群友的 python 代码  https://t.me/c/1039975886/766756 python3 -c 'import sys, socket; [print(res) for res in socket.getaddrinfo(sys.argv[1], int(sys.argv[2] if len(sys.argv) > 2 else 80))]' api.myip.la 上面的代码是python调用系统 getaddrinfo. 我们在开头加上钩子, 得到 LD_PRELOAD=/root/ hook_getaddrinfo.so  python3 -c 'import sys, socket; [print(res) for res in socket.getaddrinfo(sys.argv[1], int(sys.argv[2] if len(sys.argv) > 2 else 80))]' api.myip.la 日志如下 钩 Go 程序 让GPT写一个Go程序, 实现简单的功能: 访问一个域名, 打印HTTP结果.  看起来就像curl 代码如下,  gurl.go package main import (   "fmt"   "io/ioutil"   "log"   "net/http"   "os"   "strings" // 导入 strings 包用于字符串操作   "time" ) func main() {   // --- 1. 处理命令行参数 ---   if len(os.Args) < 2 {     log.Fatalf("❌ 缺少参数。用法: gur...

编译钩子 LD_PRELOAD加载 拦截系统接口调用getaddrinfo 验证socks5和socks5h的区别

图片
前言 群友反馈在Deiban13下不能设置IPv4优先 分析 感谢 Debian中文群的群友 提供信息  https://t.me/c/1039975886/766705 感谢233群的群友提供信息  https://t.me/tg233boy/1228524 我们知道了, gai.conf 控制的是 getaddrinfo 系统接口的行为 /etc/gai.conf 怎么证明某个程序调用了 getaddrinfo(被gai.conf控制) 呢?  钩子拦截系统接口调用 感谢Debian中文群的群友的灵感  https://t.me/c/1039975886/766779 gdb调试我不会, 但是我会编译啊. 我问了一下GPT, getaddrinfo的库是 libc.so.6 可以在这里面查找到 getaddrinfo 的符号, 如 nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep getaddrinfo 我本来想找到源码自己编译一份 libc.so.6 文件. 思路是不影响原有的getaddrinfo功能, 只是在命令行多打印一份日志. 这样就可以确定某个软件 是不是 调用了 getaddrinfo , 于是就受到 gai.conf 的控制 (IPv4优先 / IPv6优先). 我拿这个想法去问GPT. 回答超出我的预期. GPT告诉我,  1. 最好不要替换系统库, 因为会影响整个系统. 2. 有办法可以针对 某个程序 挂个钩子. 在钩子 里监控 调用系统 getaddrinfo 的行为, 然后打印日志. 然后在钩子里原样 调用系统原本的 getaddrinfo, 不影响实际行为. 相关代码如下, 例如  hook_getaddrinfo.c #define _GNU_SOURCE #include <stdio.h> #include <dlfcn.h> #include <netdb.h> int getaddrinfo(const char *node, const char *service,                 con...

curl socks5h 模拟翻墙客户端 fakeip 行为

图片
前言 群友反馈在Deiban13下不能设置IPv4优先 通过进一步的交流, 群友的意思是 sing-box 向外访问, 无法通过 gai.conf 来设置是 IPv4优先 还是 IPv6优先 群友用的是fakeip的模式, 翻墙客户端发给梯子的数据包中只有域名, 没有IP. 需求 如果自己搭全套测试环境挺麻烦的. 而且自己到VPS之间的网络如果不稳定的话, 影响测试效率. 那么, 我们怎么在VPS上模拟这个fakeip行为呢? 问GPT 在"翻墙"领域, 有一种客户端 模式叫 fakeip  在这种模式下, 最终从客户端 发往服务端的数据包里面只有域名, 没有IP.  我需要在linux命令行模拟 这样的行为, 我可以用 curl 工具做到吗? 答案是使用 socks5h curl -x socks5h://proxy.example.com:1080 https://www.example.com/ 实践 sing-box 搭建一个简单的sing-box服务端 官方安装脚本  curl -fsSL https://sing-box.app/install.sh | sh 配置文件 nano /etc/sing-box/config.json {   "log": {     "level": "debug",     "output": "box.log",     "timestamp": true   },   "inbounds": [     {       "type": "socks",       "tag": "socks-in",       "listen": "127.0.0.1",       "listen_port": 1080     }   ],   "outbounds": [     {       "type": "direct"   ...

Debian13 IPv4优先 IPv6优先 curl api.myip.la

图片
需求 群友反馈在Deiban13下不能设置IPv4优先 1. 核实问题 a. 判断是否Debian13 cat /etc/os-release b. 判断是否同时有 ipv4 和 ipv6 出站 curl -4 api.myip.la  curl -6 api.myip.la  c. 判断当前是什么出站优先 curl api.myip.la  d. 设置为 IPv4 优先 bash <(curl -sL https://raw.githubusercontent.com/crazypeace/warp.sh/main/ipv4v6.sh) 4 * 本质上是 echo "precedence ::ffff:0:0/96  100" >> /etc/gai.conf e. 检测效果 curl api.myip.la  Debian12 环境下 curl 返回 IPv4 Debian13 环境下 curl 返回 IPv6 2. curl的版本不同 在与各大GPT交流一番后, GPT提示我用 curl -v 来获取更详细的信息. curl -v api.myip.la  可以发现  Debian12 使用的是 curl/7.88.1 Debian13 使用的是 curl/8.14.1 并且 Debian13 的 curl/8.14.1 在一开始多了2行 解析IP的结果 我们可以尝试在 Debian12 环境下测试 curl/8.14.1 3. Debian12 用C编译 curl v8.14.1 https://zelikk.blogspot.com/2025/10/debian12-c-curl-v8141.html 4. Debian12环境下测试 curl/8.14.1  Debian12 的 curl/8.14.1 的结果是 返回 IPv6  5. Debian13环境下测试 curl/7.88.1 可以看到 Debian13 的 curl/7.88.1 的结果是返回 IPv4 所以可以确定是 代码的变化导致结果发生了变化 . 而不是Debian12与13的环境差异. 6. 从哪个版本发生的变化 我们可以编译不同版本的 curl 观...

Debian12 用C编译 curl v8.14.1

图片
curl的 Github代码库 https://github.com/curl/curl 这是一个C语言的项目 参考 以前的C编译经验 大部分操作是一样的, 记录一下不同的地方 ./configure 的时候报错 checking for library containing psl_builtin... no configure: error: libpsl was not found 找GPT问了一下, 说要安装 apt install libpsl-dev 然后还会报错 configure: error: select TLS backend(s) or disable TLS with --without-ssl. 于是需要 ./configure --with-openssl 无错完成以后就可以 make 了 生成的 curl 在 src 目录下 * 注意 这个 curl 不是可执行文件 你可以cat看一下文件的内容 但你可以当作像可执行文件一样的去用, 只是不能挪位置. 如 ~/curl-8.14.1/src/curl -v api.myip.la

AutoHotKey 实现 CapsLock 一键双用 长按=Ctrl 短按=Esc

图片
逛B站的时候看到 <告别腱鞘炎!Vim 党必看! CapsLock 一键双用:Ctrl + Esc 全搞定> 目的是 长按CapsLock实现 Ctrl 的效果, 短按CapsLock实现 Esc 的效果 里面的AutoHotKey代码如下: SendMode Input SetWorkingDir %A_ScriptDir% SetCapsLockState, AlwaysOff CapsLock::   Send {Ctrl Down}   KeyWait, CapsLock   Send {Ctrl Up}      if (A_PriorKey = "CapsLock")     Send {Esc} return 走读代码就能发现问题, 不管是长按还是短按, 都会发出 Ctrl Down 和 Ctrl Up 信号 在大部分环境下, 这个多余的 Ctrl 信号没关系, 但是如果某个环境对这个多余的Ctrl信号有关系的话, ... 我想到的是, 应该加个延迟来判断是短按还是长按. 准备面向GPT开发的时候, 我想到, 不如给GPT一个开放的问题. 分析这段代码有什么问题, 可以怎样改进 结果超出我的期望. 1. 首先来看加延迟的方案 SendMode Input SetWorkingDir %A_ScriptDir% SetCapsLockState, AlwaysOff CapsLock::     KeyWait, CapsLock, T0.2  ; 等待释放 等待0.2秒          if (ErrorLevel)  { ; 长按超过0.2秒         Send {Ctrl Down}         KeyWait, CapsLock  ; 等待释放         Send {Ctrl Up}     }     else  { ; 轻按(短于0.2秒)   ...

The Hot3 in Last 7 Days

搭 Docker版 Sub-Store 带 http-meta 实现 集合订阅 测延迟 排序 筛选 生成新订阅 定时任务上传Gist

极简一键脚本 搭NaiveProxy梯子 自定义端口 与Caddy V2前置的VLESS/Vmess V2Ray共存 可开CDN