假设局域网中有两个用户,A 和 B。如何使用 iptables 规则限制用户 A 访问互联网并保存规则,以便在重新启动后它们仍然有效。还假设我想在某个时刻授予该用户访问权限;我如何再次启用它?我使用的是 Ubuntu Linux 10.04。如果有人告诉我如何从命令行执行此操作,那就太好了,因为我经常使用本地 ssh 登录来登录计算机。
答案1
我假设用户 A 和 B 使用您作为管理员的同一台 Linux 计算机。 (从你的问题来看,这并不完全清楚。如果A和B都有自己的计算机,并且他们是管理员,那么这是一个完全不同的问题。)
以下命令将阻止 uid 1234 的用户在接口上发送数据包eth0
:
iptables -t mangle -A OUTPUT -o eth0 -m owner --uid-owner 1234 -j DROP
ip6tables -t mangle -A OUTPUT -o eth0 -m owner --uid-owner 1234 -j DROP
我建议阅读Ubuntu iptables 指南基本熟悉该工具(并参阅手册页了解 mangle 表等高级内容)。
用户仍然可以运行 ping(因为它是 setuid root),但不能执行其他任何操作。如果本地代理是由其他用户启动的,则用户仍然能够连接到该代理。
要删除此规则,请添加-D
到上面的命令。
要使规则永久存在,请将其添加到/etc/network/if-up.d/my-user-restrictions
(使其成为以 开头的可执行脚本#!/bin/sh
)。或者使用iptables-save
(参见Ubuntu iptables 指南了解更多信息)。
答案2
我不会为此使用 iptables。
我假设 A 和 B 与固定 IP ClientA 和 ClientB 关联。我假设您的互联网代理是 ServerI(您的 Ubuntu 服务器?)。
因此,我将添加一个从 ClientA 到 ServerI 的拒绝/丢弃路由条目。
我不使用 Ubuntu - 所以我无法告诉您使用哪个配置文件来使该设置永久存在(重新启动后仍然存在)。
也许有人可以添加这个细节?
答案3
如果防火墙是您设置的一部分,您可以使用直接规则阻止特定用户的网络访问,IE:
/etc/firewalld/direct.xml
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
<?xml version="1.0" encoding="utf-8"?>
<direct>
<chain ipv="ipv4"
table="filter"
chain="restrict_user_ipv4"/>
<rule ipv="ipv4"
table="filter"
chain="OUTPUT"
priority="1">-m owner --uid-owner user -j restrict_user_ipv4</rule>
<rule ipv="ipv4"
table="filter"
chain="restrict_user_ipv4"
priority="3">-j DROP</rule>
<chain ipv="ipv6"
table="filter"
chain="restrict_user_ipv6"/>
<rule ipv="ipv6"
table="filter"
chain="OUTPUT"
priority="1">-m owner --uid-owner user -j restrict_user_ipv6</rule>
<rule ipv="ipv6"
table="filter"
chain="restrict_user_ipv6"
priority="3">-j DROP</rule>
</direct>
不要忘记重新加载
# firewall-cmd --reload