如何对 Linux 进行防火墙,使得非特权帐户只能访问网络?

如何对 Linux 进行防火墙,使得非特权帐户只能访问网络?

我有一台允许用户登录的 Debian 服务器。我不介意他们访问网络或下载文件,但我想限制他们从该机器访问互联网。我应该如何设置 IPTABLES 或其他防火墙才能轻松完成这项工作?

答案1

从技术角度来看,这实际上非常棘手(网络层通常对用户一无所知;网络数据包中没有“用户”字段)。

但是,Linux 非常棒,它确实为您提供了解决方案。您需要 iptables“所有者”模块,以及类似这样的规则:

iptables -A OUTPUT -o eth0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o eth0 -m owner --uid-owner 500 -j DROP

其中“500”是您要阻止其上网的用户的 UID。第一条规则仅允许所有出站端口 80 流量。

您可能需要加载所有者模块才能使其正常工作:

modprobe ipt_owner

因此,将其添加到您的 rc.local 文件或类似文件中。当然,这假设您的系统已安装此模块。我不知道 Debian 上的哪个软件包提供了它。它可能在标准 iptables 软件包中。

答案2

另一个选择是配置代理服务器(Squid),允许一般匿名互联网访问,但需要登录才能执行其他任何操作。然后在防火墙处阻止来自服务器的访问,但允许代理通过。

如果您只有一台机器,我会赞同 swelljoe 的建议。或者,如果您愿意,可以将这两个想法结合起来,让一切变得更加细化 :)

答案3

我怀疑你会简单地阻止主机的所有入站和出站端口,除了端口 22(ssh)和 80(web)。如果你将这台计算机用于自己以及帮助一些朋友学习,并且需要电子邮件、即时消息等功能,我建议为他们创建一个只能访问特定应用程序列表的特殊组。我认为你可能需要指定这是独立服务器还是你的工作站 + 他们的服务器。

答案4

我曾经使用 squid 和“name”的组合做过这件事 - 一个提供当前用户名的非常古老的 linux/unix 服务。一般来说,name 是一个非常糟糕的主意(因为它未加密,你可以很容易地修改它;顺便说一下,它是 irc 使用的),但对于一组已知的机器来说,它工作得很好

相关内容