![限制本地主机上的入站访问:TCP 端口](https://linux22.com/image/141392/%E9%99%90%E5%88%B6%E6%9C%AC%E5%9C%B0%E4%B8%BB%E6%9C%BA%E4%B8%8A%E7%9A%84%E5%85%A5%E7%AB%99%E8%AE%BF%E9%97%AE%EF%BC%9ATCP%20%E7%AB%AF%E5%8F%A3.png)
由于我无法控制的原因,我有一个绑定到 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 或firewalld
RedHat/Fedora 系统),您可能需要配置该服务来为您创建这些 iptables 规则,而不是直接手动添加它们。
答案2
在这种情况下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/