限制本地主机上的入站访问:TCP 端口

限制本地主机上的入站访问:TCP 端口

由于我无法控制的原因,我有一个绑定到 TCP“localhost:$PORT”的二进制文件。 (Unix 套接字绑定将使这个问题变得毫无意义)。

如果我理解正确的话,这意味着虽然没有网络机器可以连接,但该机器上的其他用户(包括非特权守护程序用户)可以连接到该端口。

有什么方法可以让我指定只允许以 $me 运行的二进制文件连接到此端口?我可以成为 root 来指定配置,但侦听二进制文件和连接二进制文件都以非 root $me 用户身份运行

答案1

iptables 中有一个owner匹配扩展,但它只能在 OUTPUT 和 POSTROUTING 链中使用。因此,您可以在 iptables OUTPUT 链的最开头添加两个规则,如下所示(需要 root 访问权限):

iptables -I OUTPUT 1 -o lo -p tcp --dport $PORT -m owner --uid-owner $me -j ACCEPT
iptables -I OUTPUT 2 -o lo -p tcp --dport $PORT -j DROP
  • 规则 1:如果数据包通过 TCP 从环回接口发出,并且目标端口为 $PORT,且数据包所有者为 $me,则让它通过(并且不处理此链中的任何其他规则)。
  • 规则 2:如果数据包通过 TCP 从环回接口发出,并且目标端口为 $PORT,但它与规则 1 不匹配(即数据包为除 $me 之外的任何人所拥有),则丢弃该数据包。

如果您的系统有一些服务可以为您管理 iptables 设置(例如,ufw对于 Debian/Ubuntu 或firewalldRedHat/Fedora 系统),您可能需要配置该服务来为您创建这些 iptables 规则,而不是直接手动添加它们。

答案2

Nftables参考:https://wiki.nftables.org/wiki-nftables/index.php/Matching_packet_metainformation#Matching_by_socket_UID_.2F_GID

在这种情况下http://127.0.0.1:8000只能由 root 访问,其他用户不能访问

table inet filter {
        # [...]
        chain output {
                type filter hook output priority filter; policy accept;
                oif "lo" tcp dport 8000 meta skuid 0 accept
                oif "lo" tcp dport 8000 drop
        }
}

您可以使用以下方法进行测试:

# dropped
curl http://127.0.0.1:8000/

# accepted
sudo curl http://127.0.0.1:8000/

相关内容