在接受 TCP 连接之前是否可以检查对等地址?

U. *_*ndl 4 perl tcp socket

我编写了一个简单的 Perl 服务器,它侦听 TCP 端口/套接字并接受连接。现在我想知道:

当想要实现基于地址的访问控制时,是否可以在接受连接之前检查请求连接的对等方的地址?

如果可能的话,我可以拒绝连接请求(我希望),而不是接受连接并立即再次关闭它。

Art*_*nov 6

TCP/IP 连接由内核建立,然后您的应用程序开始使用该连接。

过滤/阻止不需要的连接的唯一方法是使用内核防火墙。您还没有指定您的操作系统,但在 Linux 中,这将是 iptables/nftables。


jca*_*ron 5

不是真正的答案,但一些评论太长了:

在 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 和朋友)进行过滤。