Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
pc10201
V2EX  ›  Linux

Linux 服务器上有多个 ip,程序本身不能指定接口,有第三方程序可以强制让程序使用指定接口吗?

  •  
  •   pc10201 · Mar 13 · 4169 views
    This topic created in 236 days ago, the information mentioned may be changed or developed.

    像 libbind 、proxychains 、部分 tsocks 这类基于 LD_PRELOAD 劫持 libc 的办法,不适合 golang 编写的程序

    有比较便捷的解决方案吗?

    17 replies  •  2026-03-16 13:43:58 +08:00
    lingling47
    lingling47
    Mar 13❤️1
    1
    docker 端口映射
    pc10201
    pc10201
    OP
    Mar 13
    2
    @lingling47 是客户端程序,不是服务器端的
    smallparking
    smallparking
    Mar 13 via Android
    3
    有代码吗?让 ai 改一下呗
    FabricPath
    4
    如果你知道你程序的远端 IP ,最简单的就是加路由表:

    ip route add 你程序要访问的远端 IP via 你想让你程序用的接口的网关 dev 你想让你程序用的接口 src 你想让你程序用的接口的 IP

    如果你内核版本足够高,比如 5.10 往上,那你让 AI 给你写一个 cgroup v2 的 ebpf hook ,去 hook 掉 sockops ,强制给你的进程 bind 到某个接口就行(也许可以,没试过)
    v2exgo
    v2exgo
    Mar 13
    5
    加路由表,然后 iptables 指定用户 走那个路由表,然后用那个用户 运行你的程序,即可
    ovoo
    ovoo
    Mar 13 via Android
    6
    namespace
    chingyat
    chingyat
    Mar 13❤️1
    7
    把接口移到一个 net namespace 里,然后在那个 namespace 里启动你的程序。
    unused
    unused
    Mar 13
    8
    简单点就 ip rule 走单独的路由表,规则就看 ip rule 支持的匹配条件,或者 iptables/nftables 打 mark
    暴力点就 ptrace syscall 拦截,然后 pidfd_getfd 拿到 socket
    yanqiyu
    yanqiyu
    Mar 13
    9
    1. 写几条规则路由,针对包的 tag 路由到不同网卡
    2. 写一个 nft 规则,针对连接的不同 tag 给所有包打 tag ,并且对于某个 cgroups/uid 等等的所有 outbound 连接打连接 tag 。
    3. 用 systemd-run/systemd.unit + NFTSet (系统服务)或者手动切换个用户执行相应的命令
    julyclyde
    julyclyde
    Mar 14
    10
    @FabricPath 路由表也可能会影响到其他程序,万一其他程序也和这个服务器有通信呢

    @chingyat net namespace 的颗粒度是 interface 吧。但是一个 interface 也可能不止一个 IP 地址哦
    julyclyde
    julyclyde
    Mar 14
    11
    我觉得还是改改程序,别没事找事
    你现在这提问,把一切正确答案都排除了,如果不是面试题我都不敢信有这么极端的情况
    tkl
    tkl
    Mar 14
    12
    如果你想直接强制 Socket 绑定到某个物理接口(如 eth0 、wlan0 ),而不关心它的 IP 是什么,可以使用 Linux 特有的 setsockopt 选项。

    适用场景:当网卡没有固定 IP ,或者在进行底层链路测试时。

    注意:通常需要 root 权限(或 CAP_NET_RAW 权限)

    Go,使用 net.ListenTCP 时指定 LocalAddr,通过 ListenConfig 的 Control 函数调用 setsockopt
    pagxir
    pagxir
    Mar 14 via Android
    13
    chingyat
    chingyat
    Mar 15
    14
    @julyclyde OP 也没提 IP 地址啊,他就是想指定接口。
    julyclyde
    julyclyde
    Mar 16
    15
    @chingyat 他既然提到了服务器有多个 IP ,那可以猜想其实是想挑 IP 而不是挑接口
    只是他在挑接口的道路上( setsockopt )遇到了困难
    liaohongxing
    16
    golang 不是天生能指定出口的接口吗?
    Jobcrazy
    Jobcrazy
    Mar 16
    17
    localTCPAddr := &net.TCPAddr{
    IP: localIP, // 要绑定的本地 IP
    Port: locPort, // 若为 0 则自动选可用端口,可选
    }
    dialer = &net.Dialer{
    LocalAddr: localTCPAddr,
    }
    dialer.Dial("tcp", remoteTCPAddr.String())
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2370 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 15:45 · PVG 23:45 · LAX 07:45 · JFK 10:45
    ♥ Do have faith in what you're doing.