有个 Docker 的网络问题想问问大家 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TravisMtg
V2EX    Docker

有个 Docker 的网络问题想问问大家

  •  
  •   TravisMtg 2024-01-06 12:58:04 +08:00 1713 次点击
    这是一个创建于 646 天前的主题,其中的信息可能已经有所发展或是发生改变。


    ---

    背景:如图,B 机器是 ArchLinux ,systemd-networkd 未开启 IPForward 。
    1. 图中黑色的 ip 地址为校内局域网,A/B 处于 10.112.0.0/16 子网内,而 C 在另一个子网
    2. 橙色地址为 tailscale 创建的局域网,B 和 C 都在 tailscale 创建的网络中

    此时在 B 机器上启动一个 docker 服务,映射到 8080 端口,A 机器和 B 机器都可以正常通过 http://10.112.91.240:8080 访问;但是在机器 C 上则不行,通过 tailscale 的 ip 可以正常访问。

    查阅文档后发现是 ArchLinux 的 systemd-networkd 默认没开 IPForward ,开启后一切正常。

    ---

    问题:想询问下,为什么开启 IPForward 后就正常了?我理解是因为网络请求没有被宿主机转发到 docker0 上,但是这样解释不了相同网段的机器可以正常访问。查了点 docker 的资料感觉也云里雾里,求求各位指个路。
    17 条回复    2024-01-08 08:26:42 +08:00
    bruce0
        1
    bruce0  
       2024-01-06 14:17:54 +08:00
    我的理解, docker 默认是桥接模式, 黑色的 IP 默认和 docker 的虚拟网卡做了转发, 橙色的 IP 没有和 docker 的网络做转发

    如果不正确 还请指正 我好学习一下
    Andim
        2
    Andim  
       2024-01-06 14:56:33 +08:00
    我脑中的信息过时了么? 10.112.0.0/16 10.129.0.0/16 这是两个不同的网段呀
    This is what you need when you have for example a system setup that is sitting between two different networks and needs to pass traffic between them
    Honkaiteio
        3
    Honkaiteio  
       2024-01-06 15:39:45 +08:00
    B 机器上运行,就能让 10.129.0.0/16 网段访问 10.112.0.0/16

    ```bash
    sudo tailscale up --advertise-routes=10.112.0.0/16
    ```


    https://tailscale.com/kb/1019/subnets
    IvanLi127
        4
    IvanLi127  
       2024-01-06 16:19:45 +08:00 via Android
    因为 b 机子没开转发的话,就不能像路由一样在两个网口之间交换数据。

    大概这样,不太专业,我最近也在折腾组网,我是这么理解的
    klo424
        5
    klo424  
       2024-01-06 16:41:53 +08:00
    @Andim 建议先去了解一下 tailscale 。
    Jat001
        6
    Jat001  
       2024-01-06 16:53:39 +08:00/span>
    systemd-networkd 的 IPForward 跟 sysctl 直接修改 net.ipv4.ip_forward 等参数有什么区别?

    sysctl -a | grep forward 我懒得试了,你看看开启前后有什么变化

    参考资料:
    https://wiki.archlinux.org/title/Systemd-networkd#[Network]
    https://wiki.archlinux.org/title/Internet_sharing#Enable_packet_forwarding
    Andim
        7
    Andim  
       2024-01-06 17:35:49 +08:00
    @klo424 tailscale 可以从 C 以 http://10.112.91.240:8080 访问 B 么?没用过 tailscale
    Andim
        8
    Andim  
       2024-01-06 17:47:12 +08:00
    @Andim 花了几分钟搜了下,这个 tailscale 确实有路由 可以网段转换
    TravisMtg
        9
    TravisMtg  
    OP
       2024-01-06 20:35:16 +08:00
    @Jat001
    > systemd-networkd 的 IPForward 跟 sysctl 直接修改 net.ipv4.ip_forward 等参数有什么区别?
    > sysctl -a | grep forward 我懒得试了,你看看开启前后有什么变化

    这个我看 archlinux 论坛还有官方文档里面说的是 systemd-networkd 会把 sysctl 设置的东西覆盖掉,systemd-networkd 的 ipforward 默认 off ,修改为 on 之后应该是和 net.ipv4.ip_forward 的效果是一样的。

    之前我试了试,前后的这个 net.ipv4.ip_forward 是一致的。
    TravisMtg
        10
    TravisMtg  
    OP
       2024-01-06 20:36:16 +08:00
    @Andim 确实是两个不同网段。我这儿的表现是,相同网段的机器可以正常访问,但是不同网段则访问不了。
    TravisMtg
        11
    TravisMtg  
    OP
       2024-01-06 20:40:59 +08:00
    @IvanLi127 嗯嗯,我大概也能理解到这儿。
    我不太能理解的是如果我的流量是从 tailscale 的网口进来的话,按道理也需要路由转发到 docker 才能访问到 docker 中的服务。但是在我开启 IPForward 之前,确实是可以通过 http://100.64.70.88:8080 访问的(也就是通过 tailscale 访问)。
    (这儿的请求貌似没有吃到这个 IPForward=off 的规则
    IvanLi127
        12
    IvanLi127  
       2024-01-07 02:00:48 +08:00 via Android
    @TravisMtg 我猜测是 docker 自己或者他配的规则已经能把所有网卡的这个端口的流量转给容器内了,所以 100.64.70.88 能访问,不能访问是出在 100.96.113.29 -> 100.64.70.88 -x -> 10.112.91.240 这个不能的地方需要机子开转发。
    Jat001
        13
    Jat001  
       2024-01-07 12:25:47 +08:00 via iPhone
    tailscale 为什么能转发我知道,ip route show table all 看看就知道了,它给每个 ip 都配置了路由

    不同网段,不同 interface 之间转发,要用 ip route add <cidr> via <gateway> dev <interface> 指定路由
    Jat001
        14
    Jat001  
       2024-01-07 12:30:43 +08:00 via iPhone
    然后你再看看 tailscale 的 iptables 规则,还要加 iptables -t nat -A POSTROUTING -s <cidr> -j MASQUERADE 起到 nat 的效果
    Jat001
        15
    Jat001  
       2024-01-07 13:05:53 +08:00
    再讲个好玩的,ip route add default via <gateway> dev <interface> 是添加默认路由,但你可以用 ip route add default via <gateway> dev <interface> table <table_id> 的方式只给某个 table 添加默认路由

    table 有什么用呢,你可以用 ip rule 看看

    ip rule add from <cidr> table <table_id> priority <更小的值> 可以让来自某个网段的流量走特定 table
    同理,ip rule add to <cidr> ...,ip rule add fwmark <id> ... 等都可以
    TravisMtg
        16
    TravisMtg  
    OP
       2024-01-07 23:01:23 +08:00
    @Jat001 ( ̄ ̄)
    klo424
        17
    klo424  
       2024-01-08 08:26:42 +08:00
    @Andim tailscale 可以从 C 以 http://100.64.70.88:8080 访问 B 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     927 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 21:05 PVG 05:05 LAX 14:05 JFK 17:05
    Do have faith in what you're doing.
    ubao 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