我希望你能用owner
iptables 模块来做到这一点……
在单台机器上,如果:
userA
serverA
在(随机)端口上启动 TCP1111
userB
serverB
在(随机)端口上启动 TCP2222
… 我怎么能够:
- 禁止
userB
连接到serverA
,仅基于所有者serverA
是不是userB
而是其他用户, - 并且仍然允许
userB
连接到serverB
,因为userB
拥有的过程serverB
?
答案1
TCP 连接使用 IP 地址和端口号。它对“用户”一无所知。因此,除非每个用户都有唯一的固定 IP 地址,否则无法阻止用户 A 创建与服务器 B 的 TCP 连接。你为什么要这么做?如果服务器托管一个网站,请让它请求身份验证。用户 B 将无法登录服务器 A 上的网站,所以没有问题。
答案2
所有者 iptables 扩展的限制比你想象的要多。从iptables-扩展手册页:
所有者
此模块尝试匹配本地生成的数据包的数据包创建者的各种特征。此匹配仅在 OUTPUT 和 POSTROUTING 链中有效。转发的数据包没有任何与之关联的套接字。
- 仅限制 OUTPUT,因此必须限制传出连接。
- 不仅
userB
而且每一个您不想建立连接的用户。 - 在每个主机上,因为如果
userB
从那里建立了这种连接,serverC
就没有什么可以阻止它们。 userB
如果要访问网络, 您还需要做出例外。因此,您仍然需要根据端口等连接元组来定义您的服务。- 另外显然所有者扩展对群组成员身份的行为不直观。
更好的解决方案是在网络协议中使用身份验证。
如果必须限制特定用户的任意网络访问,请考虑编写类似于布尔值的 SELinux 策略 httpd_can_network_connect_db
。