我编写了一个简单的 Perl 服务器,它侦听 TCP 端口/套接字并接受连接。现在我想知道:
当想要实现基于地址的访问控制时,是否可以在接受连接之前检查请求连接的对等方的地址?
如果可能的话,我可以拒绝连接请求(我希望),而不是接受连接并立即再次关闭它。
我编写了一个简单的 Perl 服务器,它侦听 TCP 端口/套接字并接受连接。现在我想知道:
当想要实现基于地址的访问控制时,是否可以在接受连接之前检查请求连接的对等方的地址?
如果可能的话,我可以拒绝连接请求(我希望),而不是接受连接并立即再次关闭它。
TCP/IP 连接由内核建立,然后您的应用程序开始使用该连接。
过滤/阻止不需要的连接的唯一方法是使用内核防火墙。您还没有指定您的操作系统,但在 Linux 中,这将是 iptables/nftables。
不是真正的答案,但一些评论太长了:
在 MacOS X 上
man accept
说:(强调我的)
man recvmsg
但无法在或man getsockopt
有关该主题的更多详细信息中找到man tcp
。在 Debian 上,
man accept
说道:恕我直言,那里唯一能够提供更多信息的就是
epoll
。但即使您实际上可以获得信息,我也不太确定如果您不喜欢它,您将如何拒绝连接。
您最好在网络堆栈/防火墙级别(iptables 和朋友)进行过滤。
我并不声称拥有 Perl 方面的任何专业知识 - 但我怀疑这是不可能的。为了控制对服务器的访问,我会限制(按优先顺序):
鉴于目前不存在通过主机配置进行限制的设施,显然选择此作为起点似乎不寻常。
假设上面的 1 和 2 不是一个选项,那么我建议使用 Perl 代码中的 TCP 包装器。这应该可以让您以最少的代码更改启动并运行,同时利用灵活、标准和强大的网络访问控制机制。另请参阅https://metacpan.org/pod/Net::TCPwrappers
我相信它也可以通过在运行时调整 LD_LIBRARY_PATH (即没有任何代码更改)来应用 tcp 包装器,但在快速 Google 搜索中找不到对此的引用。
传输控制协议不用于访问控制。
我建议您检查 TLS https://en.m.wikipedia.org/wiki/Transport_Layer_Security
此外,看看 netfilter 防火墙输入挂钩。您可以删除和拒绝不需要的对等方。