V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
bybyte
V2EX  ›  Linux

如何让 TCP 包从指定网卡出口

  •  
  •   bybyte ·
    golangboy · 356 天前 · 3539 次点击
    这是一个创建于 356 天前的主题,其中的信息可能已经有所发展或是发生改变。

    linux 下多张网卡(都能通外网),想从指定网卡口出去 HTTP 请求。 网上的一个办法是创建 socket 的时候 bind 在某个网卡的 IP 上,但是我测试过了,这样只是源 IP 地址改变了(变成 bind 的那个网卡上的 IP 地址),但是最终出口就是包上的源 MAC 地址不变, 还是由路由表上的出口网卡决定的。。想问下 V 友有啥办法没

    18 条回复    2022-08-12 11:41:36 +08:00
    refraction
        1
    refraction  
       356 天前
    ip rule?
    izoabr
        2
    izoabr  
       356 天前
    iptables 先给指定的包打一个标记,然后用 ip route2 做策略路由
    shayuvpn0001
        3
    shayuvpn0001  
       356 天前
    这个需求弄一下路由表就可以了。
    huangmingyou
        4
    huangmingyou  
       356 天前
    iptables fwmark 对 tcp 流量做标记,然后 ip rule 根据 fwmark 路由。
    ch2
        5
    ch2  
       356 天前
    用 docker 跑那个进程,用 ip route 改容器内部的路由表
    设置不同网卡的 metrics 优先级,即可让你进程的流量走你想要的网卡
    效果是 ip 协议级别的
    seers
        6
    seers  
       356 天前
    可以参考下 vlan,给包打 tag
    weyou
        7
    weyou  
       356 天前 via Android
    socket 使用 SO_BINDTODEVICE 选项绑定网卡,会忽略路由,直接从指定的网卡出去,缺点是需要 root 权限。
    shoaly
        8
    shoaly  
       356 天前
    如果只是 http 请求的话 就简单了, 你在目标出口 ip 地址上 搭建一个 socks5 代理, 然后 http 请求的方法里面把这个 s5 的代理用上就行了
    bybyte
        9
    bybyte  
    OP
       356 天前
    @shoaly 这个方法我用过,但是好像只是改变了源 ip 地址,但是好像出口的网卡还是系统根据路由表决定的,源 MAC 还是不变
    bybyte
        10
    bybyte  
    OP
       356 天前
    @weyou
    @seers
    @ch2
    @shayuvpn0001
    @izoabr 谢谢大佬们的建议,有方向了
    julyclyde
        11
    julyclyde  
       356 天前
    首先,这就不是 tcp 的事
    bybyte
        12
    bybyte  
    OP
       354 天前
    @izoabr
    @huangmingyou
    @shayuvpn0001
    @refraction
    想请教下大佬们,我试着用 ip rule 做了下,但出现了点小问题
    ![alt]( https://i.bmp.ovh/imgs/2021/10/2b64107b8d31c8c4.png)
    ![alt]( https://i.bmp.ovh/imgs/2021/10/52406852fb731ca6.png)
    ![alt]( https://www.hualigs.cn/image/615e508bb3b5f.jpg)
    这样设置好了按理说本机发出的数据流量会被标记为 20 然后在策略路由的时候走路由表 li,然后根据路由表的规则走 eth1 出口的吧?

    但是最后发现本机发出的数据并没有走路由表 li 依然还是按照 route -n 路由表的默认路由项走
    不知道怎么回事,请教下大佬们🙇‍
    bybyte
        13
    bybyte  
    OP
       354 天前
    @bybyte 最后那个图是主路由表的信息
    localhost:~/Desktop # route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0 192.168.123.96 0.0.0.0 UG 100 0 0 eth0
    192.168.123.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
    192.168.123.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
    bybyte
        14
    bybyte  
    OP
       354 天前
    ![alt]( https://i.bmp.ovh/imgs/2021/10/fe3089019ae0e6ca.png)
    随机打 mark 随机走出口,出口是变了,源 MAC 是变了,,但是源 IP 还是固定的不变的。
    bybyte
        15
    bybyte  
    OP
       354 天前
    解决了,在 nat 表的 POSTROUTING 链里根据出口网卡做 SNAT 即可。。。。终于解决了。。。

    mangle

    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination
    MARK all -- anywhere anywhere statistic mode random probability 0.50000000000 MARK set 0x10
    MARK all -- anywhere anywhere statistic mode random probability 0.50000000000 MARK set 0x11

    nat

    Chain POSTROUTING (policy ACCEPT)
    target prot opt source destination
    SNAT all -- anywhere anywhere to:192.168.123.75
    SNAT all -- anywhere anywhere to:192.168.123.85
    ttvast
        16
    ttvast  
       290 天前
    没必要用到 iptables
    为每张网卡设定一个 table
    ip route add default via gw_nicX table tb_nicX
    ip rule add from ip_nicX lookup tb_nicX
    有多少块网卡就创建多少条策略
    ttvast
        17
    ttvast  
       290 天前
    晕,你居然把两张网卡放同一个网段?
    溜了
    sx5486510
        18
    sx5486510  
       45 天前
    @ttvast 时隔一年 竟然用到了 感谢
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4493 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 06:48 · PVG 14:48 · LAX 23:48 · JFK 02:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.