V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Cineray
V2EX  ›  程序员

群晖下 docker 容器 bridge 隔离网可以直接访问宿主机

  •  
  •   Cineray · 3 天前 · 1200 次点击

    我在群晖中使用 docker 部署服务,网络 network 使用的默认的 bridge ,不是 host 也不是 bridge-host ,理论上是不是不应该可以访问宿主机网段?

    docker 服务的 network 是默认的:172.17.0.0/16

    我任意进入在这个网路的服务,/bin/sh 去 ping - 192.168.0.0/24 的服务都是可以 ping 通的。

    然后我去 用这个 172.17.0.0/16 - ping 另一个 docker 创建的网络 172.19.0.0/16 也是可以 ping 通的,完全没有隔离,是我哪里理解错了吗?

    我之所以纠结这个问题,就是如果我的某个 docker 有漏洞,有人拿了我 docker 的 shell ,是不是理论可以随意攻击我的局域网了。

    请各位指教一下。

    8 条回复    2025-01-30 20:38:17 +08:00
    yinmin
        1
    yinmin  
       3 天前 via iPhone   ❤️ 2
    ( 1 ) bridge 网络的容器当然可以访问局域网。
    ( 2 ) 2 个 bridge 网络仅网关是互通的,容器之间不通。
    ( 3 )被黑的容器可以做跳板机攻击局域网的。
    ( 4 )可以将容器配置成 internal 网络,这个网络是无法访问局域网的,当然也是无法访问 internet 的。
    ( 5 )可以设置 iptables 禁止 bridge 容器访问局域网 ip 地址段,容器能访问 internet 又能阻止访问局域网。
    ( 6 )最安全的方式是网络使用 none ,也就是无网卡,容器之间使用 unix socket 通信(使用-v 在容器之间共享 unix socket 的文件句柄)

    另外,很多网管都忽略的一个安全隐患:局域网的其他电脑将网卡网关配置成 docker 主机的 ip ,就能访问容器的内网 ip 了,所以别以为 bridge 内网 ip 安全就可以用弱密码。
    Cineray
        2
    Cineray  
    OP
       3 天前
    @yinmin 啊我以为你说的( 123 )是我的个人问题,好像默认确实是这样,我搜索了豆包应该给了我误导性答案。那这个默认行为确实会给宿主机带来巨大安全隐患,相当于提供了跳板机。我去尝试一下群晖实现你说的第 4/5 点试试。另外设置了 none 是不是也无法连接 internet 了
    Jacksu
        3
    Jacksu  
       2 天前   ❤️ 1
    nftables/iptables 可以配置容器无法访问主机所在的局域网段的其它主机,但无法禁止容器访问宿主机(本身容器上网需要走宿主机,除非设置无网络也就是 none )
    我自己的容器 nat 表下的 masquerade 规则如下
    ```ini
    chain POSTROUTING {
    type nat hook postrouting priority srcnat; policy accept;
    ip saddr 172.18.0.118 ip daddr 192.168.0.6 tcp dport {8080, 8096} masquerade comment "允许 moviepilot 容器访问 windiws 主机 qb 网页端口和 emby 网页端口"
    ip saddr 172.18.0.113 ip daddr 192.168.0.0/24 masquerade comment "允许 homepage 容器访问局域网(监控)"
    ip saddr 172.18.0.0/16 ip daddr {192.168.0.0/24, 10.0.0.0/24} drop comment "禁止其它容器访问局域网"
    oifname != "br-52a1ae707854" ip saddr 172.18.0.0/16 masquerade comment "允许容器访问外网"
    ip saddr 172.18.0.103 ip daddr 172.18.0.103 tcp dport 3306 masquerade comment "端口开放"
    ip saddr 172.18.0.116 ip daddr 172.18.0.116 tcp dport 8066 masquerade comment "端口开放"
    ip saddr 172.18.0.115 ip daddr 172.18.0.115 tcp dport 8060 masquerade comment "端口开放"
    oifname "ens32" masquerade comment "接受局域网机器的设备的透明"
    }
    ```
    我这里因为需要自定义容器的 IP ,所以使用了自定义的桥接网络,不使用默认的 docker0 网络
    Jacksu
        4
    Jacksu  
       2 天前   ❤️ 1
    针对 2 楼说的问题,防止局域网其它机器把网关改成 docker 宿主机去直接访问容器 IP ,可以添加一条规则(仅允许 192.168.0.6 这台电脑访问容器):

    ```ini
    ip saddr {192.168.0.1-192.168.0.5, 192.168.0.7-192.168.0.254} ip daddr 172.18.0.0/16 drop comment "禁止局域网其它机器访问容器"
    ```
    n2l
        5
    n2l  
       2 天前 via iPhone
    [ [入门篇] Docker 网络模式 Linux - Bridge | Host | None-哔哩哔哩] https://b23.tv/y7w5B72
    julyclyde
        6
    julyclyde  
       7 小时 35 分钟前
    @Cineray 不要把学习和工作推给别人(工智能)
    学习是你自己的责任
    Cineray
        7
    Cineray  
    OP
       6 小时 37 分钟前
    @julyclyde 我遇到问题都是先搜索网络包括询问 GPT4/豆包/Kimi/deepseek 没找到我想要的答案才来问的。如果这里问问题都是错的话我想要不人均先考个网络工程师证再来注册?
    julyclyde
        8
    julyclyde  
       3 小时 53 分钟前
    @Cineray 看着不像
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1221 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:31 · PVG 00:31 · LAX 08:31 · JFK 11:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.