如何让 TCP 包从指定网卡出口 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
bybyte
V2EX    Linux

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

  •  
  •   bybyte
    golangboy 2021-10-04 19:31:51 +08:00 5677 次点击
    这是一个创建于 1516 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    18 条回复    2022-08-12 11:41:36 +08:00
    refraction
        1
    refraction  
       2021-10-04 19:37:58 +08:00
    ip rule?
    izoabr
        2
    izoabr  
       2021-10-04 19:40:41 +08:00
    iptables 先给指定的包打一个标记,然后用 ip route2 做策略路由
    shayuvpn0001
        3
    shayuvpn0001  
       2021-10-04 19:57:53 +08:00
    这个需求弄一下路由表就可以了。
    huangmingyou
        4
    huangmingyou  
       2021-10-04 19:59:58 +08:00
    iptables fwmark 对 tcp 流量做标记,然后 ip rule 根据 fwmark 路由。
    ch2
        5
    ch2  
       2021-10-04 21:02:54 +08:00
    用 docker 跑那个进程,用 ip route 改容器内部的路由表
    设置不同网卡的 metrics 优先级,即可让你进程的流量走你想要的网卡
    效果是 ip 协议级别的
    seers
        6
    seers  
       2021-10-04 21:03:09 +08:00
    可以参考下 vlan,给包打 tag
    weyou
        7
    weyou  
       2021-10-04 23:34:07 +08:00 via Android
    socket 使用 SO_BINDTODEVICE 选项绑定网卡,会忽略路由,直接从指定的网卡出去,缺点是需要 root 权限。
    shoaly
        8
    shoaly  
       2021-10-04 23:43:55 +08:00
    如果只是 http 请求的话 就简单了, 你在目标出口 ip 地址上 搭建一个 socks5 代理, 然后 http 请求的方法里面把这个 s5 的代理用上就行了
    bybyte
        9
    bybyte  
    OP
       2021-10-05 00:32:05 +08:00
    @shoaly 这个方法我用过,但是好像只是改变了源 ip 地址,但是好像出口的网卡还是系统根据路由表决定的,源 MAC 还是不变
    bybyte
        10
    bybyte  
    OP
       2021-10-05 00:32:35 +08:00
    @weyou
    @seers
    @ch2
    @shayuvpn0001
    @izoabr 谢谢大佬们的建议,有方向了
    julyclyde
        11
    julyclyde  
       2021-10-05 13:10:36 +08:00
    首先,这就不是 tcp 的事
    bybyte
        12
    bybyte  
    OP
       2021-10-07 09:44:01 +08:00
    @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
       2021-10-07 09:45:58 +08:00
    @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
       2021-10-07 11:27:26 +08:00
    ![alt]( https://i.bmp.ovh/imgs/2021/10/fe3089019ae0e6ca.png)
    随机打 mark 随机走出口,出口是变了,源 MAC 是变了,,但是源 IP 还是固定的不变的。
    bybyte
        15
    bybyte  
    OP
       2021-10-07 11:47:33 +08:00
    解决了,在 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  
       2021-12-09 18:45:58 +08:00
    没必要用到 iptables
    为每张网卡设定一个 table
    ip route add default via gw_nicX table tb_nicX
    ip rule add from ip_nicX lookup tb_nicX
    有多少块网卡就创建多少条策略
    ttvast
        17
    ttvast  
       2021-12-09 18:48:27 +08:00
    晕,你居然把两张网卡放同一个网段?
    溜了
    sx5486510
        18
    sx5486510  
       2022-08-12 11:41:36 +08:00
    @ttvast 时隔一年 竟然用到了 感谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2518 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 05:03 PVG 13:03 LAX 21:03 JFK 00:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86