我编写了一个简单的 Perl 服务器,它侦听 TCP 端口/套接字并接受连接。现在我想知道:
当想要实现基于地址的访问控制时,是否可以在接受连接之前检查请求连接的对等方的地址?
如果可能的话,我可以拒绝连接请求(我希望),而不是接受连接并立即再次关闭它。
TCP/IP 连接由内核建立,然后您的应用程序开始使用该连接。
过滤/阻止不需要的连接的唯一方法是使用内核防火墙。您还没有指定您的操作系统,但在 Linux 中,这将是 iptables/nftables。
不是真正的答案,但一些评论太长了:
在 MacOS X 上man accept
说:
通过发出 msg_iovlen 为 0 且 msg_controllen 非零的 recvmsg(2) 调用,或者发出 getsockopt(2) 请求,无需确认连接即可获取用户连接请求数据。类似地,可以通过发出仅提供控制信息的 sendmsg(2) 调用或通过调用 setsockopt(2) 来提供用户连接拒绝信息。
(强调我的)
man recvmsg
但无法在或man getsockopt
有关该主题的更多详细信息中找到man tcp
。
在 Debian 上,man accept
说道:
为了获得套接字上传入连接的通知,可以使用 select(2)、poll(2) 或 epoll(7)。当尝试新连接时,将传递一个可读事件,然后您可以调用accept()来获取该连接的套接字。或者,您可以将套接字设置为在套接字上发生活动时传递 SIGIO;详细信息请参见套接字(7)。
恕我直言,那里唯一能够提供更多信息的就是epoll
。
但即使您实际上可以获得信息,我也不太确定如果您不喜欢它,您将如何拒绝连接。
您最好在网络堆栈/防火墙级别(iptables 和朋友)进行过滤。