如何配置 CentOS 6.4 服务器,以便某些用户只能在某些端口上运行服务器?例如,如果我有一个用于运行服务器的用户,并且我只希望他能够绑定到端口 1036。
答案1
我知道你可以使用网络命名空间来做到这一点,因为我就是这么做的。但这相当复杂。
过程是这样的。
- 使用创建网络命名空间
unshare
- 使用以下方式创建 veth 设备
ip link add type veth ....
- 使用
ip link set vethX netns ${PIDOFUNSHARE}
- 在新的命名空间中启动环回(如果尚未启动)。
- 在新的命名空间和设备中设置一个 IP 地址(如果尚未设置)
vethX
。 - 将新网络命名空间中的默认路由设置为父命名空间中的 IP。
- 设置一条静态路由到您在子命名空间中添加的 IP,以便
vethX
沿着父命名空间向下走。
现在,不受信任的用户当然拥有该 IP 的完全所有权,但您可以在父命名空间中使用 IPtables 对允许他们绑定到的特定端口进行 DNATing,并将通信限制在该端口。用户不可能有效地拒绝另一个用户在另一个端口上的服务,因为他有一个只能在该用户命名空间内工作的特定 IP。
请注意,如果您使用nslcd
或nscd
进行名称解析服务,事情会变得更加复杂,因为用于进程间通信的 unix 套接字在子命名空间中无效。我能够修复此问题的唯一方法是修补这些程序以提供 TCP 传输并通过 TCP 在父命名空间中执行名称解析服务。
我还用 C 语言编写了一个程序,使用 netlink 调用来设置上述所有内容。该程序是闭源的,所以很遗憾我不能与你分享。
顺便说一下,在 Fedora 中执行此操作稍微容易一些,因为您可以在其中创建命名网络命名空间。但 EL6 不提供/proc/<pid>/ns
执行此操作的功能。