
像 libbind 、proxychains 、部分 tsocks 这类基于 LD_PRELOAD 劫持 libc 的办法,不适合 golang 编写的程序
有比较便捷的解决方案吗?
1 lingling47 3 月 13 日 docker 端口映射 |
2 pc10201 OP @lingling47 是客户端程序,不是服务器端的 |
3 smallparking 3 月 13 日 via Android 有代码吗?让 ai 改一下呗 |
4 FabricPath 3 月 13 日 如果你知道你程序的远端 IP ,最简单的就是加路由表: ip route add 你程序要访问的远端 IP via 你想让你程序用的接口的网关 dev 你想让你程序用的接口 src 你想让你程序用的接口的 IP 如果你内核版本足够高,比如 5.10 往上,那你让 AI 给你写一个 cgroup v2 的 ebpf hook ,去 hook 掉 sockops ,强制给你的进程 bind 到某个接口就行(也许可以,没试过) |
5 v2exgo 3 月 13 日 加路由表,然后 iptables 指定用户 走那个路由表,然后用那个用户 运行你的程序,即可 |
6 ovoo 3 月 13 日 via Android namespace |
7 chingyat 3 月 13 日 把接口移到一个 net namespace 里,然后在那个 namespace 里启动你的程序。 |
8 unused 3 月 13 日 简单点就 ip rule 走单独的路由表,规则就看 ip rule 支持的匹配条件,或者 iptables/nftables 打 mark 暴力点就 ptrace syscall 拦截,然后 pidfd_getfd 拿到 socket |
9 yanqiyu 3 月 13 日 1. 写几条规则路由,针对包的 tag 路由到不同网卡 2. 写一个 nft 规则,针对连接的不同 tag 给所有包打 tag ,并且对于某个 cgroups/uid 等等的所有 outbound 连接打连接 tag 。 3. 用 systemd-run/systemd.unit + NFTSet (系统服务)或者手动切换个用户执行相应的命令 |
10 julyclyde 3 月 14 日 @FabricPath 路由表也可能会影响到其他程序,万一其他程序也和这个服务器有通信呢 @chingyat net namespace 的颗粒度是 interface 吧。但是一个 interface 也可能不止一个 IP 地址哦 |
11 julyclyde 3 月 14 日 我觉得还是改改程序,别没事找事 你现在这提问,把一切正确答案都排除了,如果不是面试题我都不敢信有这么极端的情况 |
12 tkl 3 月 14 日 如果你想直接强制 Socket 绑定到某个物理接口(如 eth0 、wlan0 ),而不关心它的 IP 是什么,可以使用 Linux 特有的 setsockopt 选项。 适用场景:当网卡没有固定 IP ,或者在进行底层链路测试时。 注意:通常需要 root 权限(或 CAP_NET_RAW 权限) Go,使用 net.ListenTCP 时指定 LocalAddr,通过 ListenConfig 的 Control 函数调用 setsockopt |
13 pagxir 3 月 14 日 via Android 试试这位老哥的杰作 t/476594?from=timeline |
16 liaohongxing 3 月 16 日 golang 不是天生能指定出口的接口吗? |
17 Jobcrazy 3 月 16 日 localTCPAddr := &net.TCPAddr{ IP: localIP, // 要绑定的本地 IP Port: locPort, // 若为 0 则自动选可用端口,可选 } dialer = &net.Dialer{ LocalAddr: localTCPAddr, } dialer.Dial("tcp", remoteTCPAddr.String()) |