为Docker添加新用户并限制其网络权限的技术咨询
首先咱们先拆解你之前遇到的两个问题的根因:
iptables命令失败的原因:Docker容器默认处于权限受限状态,没有授予
NET_ADMIN能力——这是修改网络规则(比如iptables)必需的系统权限。所以你在容器内直接执行iptables命令会报权限错误,不是命令本身有问题,是容器的权限不够。修改sudoer无效的原因:
ping这类工具默认不需要sudo就能执行,你添加的规则只是阻止test用户用sudo执行ping,但用户直接敲ping依然能正常运行。而且就算拦住了ping,其他联网工具(比如curl、wget、telnet)还是能用,这个方法根本不彻底。
接下来给你两个可行的解决方案,按推荐程度排序:
方案一:给容器添加NET_ADMIN权限后用iptables拦截(最彻底)
直接从网络层阻断test用户的所有出站流量,这是最可靠的方法:
重启容器并授予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进入容器添加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保存规则防止容器重启后失效:
根据容器内的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
- Debian/Ubuntu系:
验证效果:
切换到test用户测试:su - test ping 8.8.8.8 # 应该会卡住无响应 curl google.com # 应该会报连接超时或被拒绝
方案二:用受限shell限制工具访问(次选,适合无法加NET_ADMIN的场景)
从用户可执行的工具层面限制,虽然不如iptables彻底,但适合容器无法获取NET_ADMIN权限的情况:
把test用户的shell改成受限bash(rbash):
usermod -s /bin/rbash test清理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




