You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为Docker添加新用户并限制其网络权限的技术咨询

解决Docker容器内禁止test用户访问互联网的问题

首先咱们先拆解你之前遇到的两个问题的根因:

  1. iptables命令失败的原因:Docker容器默认处于权限受限状态,没有授予NET_ADMIN能力——这是修改网络规则(比如iptables)必需的系统权限。所以你在容器内直接执行iptables命令会报权限错误,不是命令本身有问题,是容器的权限不够。

  2. 修改sudoer无效的原因ping这类工具默认不需要sudo就能执行,你添加的规则只是阻止test用户用sudo执行ping,但用户直接敲ping依然能正常运行。而且就算拦住了ping,其他联网工具(比如curlwgettelnet)还是能用,这个方法根本不彻底。

接下来给你两个可行的解决方案,按推荐程度排序:

方案一:给容器添加NET_ADMIN权限后用iptables拦截(最彻底)

直接从网络层阻断test用户的所有出站流量,这是最可靠的方法:

  1. 重启容器并授予NET_ADMIN权限
    如果是启动新容器,用这条命令:

    docker run --cap-add=NET_ADMIN -d --name your-container-name your-image-name
    

    如果容器已经在运行,先停掉再重启(注意会中断服务):

    docker stop your-container-name
    docker run --cap-add=NET_ADMIN -d --name your-container-name your-image-name
    
  2. 进入容器添加iptables过滤规则

    docker exec -it your-container-name bash
    

    执行过滤规则(用filter表专门做流量过滤,比mangle表更合适):

    # 按用户名拦截,不用记UID更直观
    iptables -t filter -A OUTPUT -o eth0 -m owner --uid-owner test -j DROP
    # 也可以按UID拦截(比如你之前的501)
    # iptables -t filter -A OUTPUT -o eth0 -m owner --uid-owner 501 -j DROP
    
  3. 保存规则防止容器重启后失效
    根据容器内的Linux发行版选择对应命令:

    • Debian/Ubuntu系:
      iptables-save > /etc/iptables/rules.v4
      # 安装iptables-persistent确保开机自动加载规则
      apt update && apt install -y iptables-persistent
      
    • RHEL/CentOS系:
      iptables-save > /etc/sysconfig/iptables
      systemctl enable --now iptables
      
  4. 验证效果
    切换到test用户测试:

    su - test
    ping 8.8.8.8  # 应该会卡住无响应
    curl google.com  # 应该会报连接超时或被拒绝
    

方案二:用受限shell限制工具访问(次选,适合无法加NET_ADMIN的场景)

从用户可执行的工具层面限制,虽然不如iptables彻底,但适合容器无法获取NET_ADMIN权限的情况:

  1. 把test用户的shell改成受限bash(rbash)

    usermod -s /bin/rbash test
    
  2. 清理test用户的PATH并禁用联网工具
    编辑test用户的~/.bashrc,只保留安全工具的路径:

    echo 'PATH=/usr/bin/coreutils:/usr/bin/util-linux' > /home/test/.bashrc
    

    然后移除普通用户对联网工具的执行权限:

    chmod o-x /bin/ping /usr/bin/curl /usr/bin/wget /usr/bin/telnet
    

    注意:这个方法有漏洞,如果test用户能获取root权限(比如有sudo权限),或者找到其他隐藏的联网工具,还是能绕开限制,所以仅作为备选方案。


内容的提问来源于stack exchange,提问作者Saurabh

火山引擎 最新活动