Ubuntu 22.04下通过UFW添加持久化自定义iptables规则以阻止特定用户网络访问的问题
Ubuntu 22.04下通过UFW添加持久化自定义iptables规则以阻止特定用户网络访问的问题
嗨,我来帮你搞定这个问题!你想通过UFW持久化阻止特定UID用户的外部网络访问,之前把规则加到before.rules里没生效对吧?这其实是因为UFW的规则加载顺序和链的优先级问题,咱们一步步来调整:
一、正确调整规则在before.rules里的位置
before.rules确实是存放自定义前置规则的地方,但规则的放置位置很关键——必须放在UFW默认的OUTPUT链定义之后、自身默认规则之前,不然会被后面的允许规则覆盖。
具体操作:
- 打开
/etc/ufw/before.rules文件:sudo nano /etc/ufw/before.rules - 找到
*filter块里的:OUTPUT ACCEPT [0:0]这一行,在它后面直接添加你的规则::OUTPUT ACCEPT [0:0] # 阻止UID为130的用户访问外部网络(本地回环lo除外) -A OUTPUT ! -o lo -m owner --uid-owner 130 -j DROP - 保存文件后,重启UFW让规则生效:
sudo ufw reload
二、验证规则是否生效
- 先检查iptables的OUTPUT链,确认规则已加载:
sudo iptables -L OUTPUT -n -v,你应该能看到那条DROP规则出现在列表的靠前位置。 - 切换到目标用户测试:如果是普通用户可以用
su -l -u 130,系统用户的话用sudo -u 130 bash,然后尝试ping外部地址(比如ping 8.8.8.8),正常情况下应该会被完全阻止。
三、更规范的备选方案:使用UFW自定义规则目录
如果你不想直接修改before.rules,可以用UFW专门的自定义规则目录/etc/ufw/rules.d/,步骤如下:
- 创建一个自定义规则文件,文件名建议以
00-开头(确保规则优先加载),比如:sudo nano /etc/ufw/rules.d/00-block-user.rules - 写入完整的iptables规则结构:
*filter -A OUTPUT ! -o lo -m owner --uid-owner 130 -j DROP COMMIT - 同样执行
sudo ufw reload让规则生效,这个方式的好处是不会和UFW默认的before.rules内容混在一起,更便于维护。
四、需要注意的坑点
- 规则必须放在
*filter块内部,否则UFW会忽略它; - DROP规则一定要在任何允许OUTPUT流量的规则之前,不然用户的流量已经被允许通过,DROP规则就起不到作用了;
- 如果目标用户拥有sudo权限,他们可以自行修改UFW规则突破限制,这个方法只对无sudo权限的用户有效。
备注:内容来源于stack exchange,提问作者Rusty Weber
相关产品推荐
相关产品推荐

