在所有接口上接受本地客户端的套接字; rejcct远程客户端

时间:2009-05-16 09:40:13

标签: windows linux sockets

我需要编写一个小型套接字服务器代理应用程序,它接受来自所有接口上本地应用程序的连接(套接字应绑定到0.0.0.0)。

我不知道如何实现这一目标(我有其他要求阻止绑定到127.0.0.1)。

首次尝试执行以下操作:

绑定(0.0.0.0) ... s =接受() ... //拒绝远程连接 if(s.src_addr不在local_interfaces中)close() ... //正常进行本地联络

此实现对远程应用程序有副作用 - 它们看到接受/关闭组合。系统需要表现得远程应用程序认为“没有任何东西”: - > SYN < - RST / ACK

为了实现这个行为,我使用了SOKCALITIONAL_ACCEPT和WSAAccept回调(LPCONDITIONPROC lpfnCondition)的winsock API组合来接受/拒绝基于其原始接口的连接(即它是否是本地地址之一)。

这会产生所需的功能行为:本地应用程序工作;远程应用程序获取所需的WSAECONNREFUSED错误。

这带来了一定的价格:SO_CONDITIONAL_ACCEPT有一定的副作用(参见MSDN),但更重要的是,我们需要一个LINUX实现,以后可能需要将其移植到其他UNIX。

我的首要任务是LINUX解决方案。请注意,如果需要,我愿意超越套接字API。

4 个答案:

答案 0 :(得分:1)

一个简单的解决方案是使用和外部防火墙。

答案 1 :(得分:0)

也许您可能需要安装适当的数据包筛选器,或者您的应用程序可能会自行安装这些筛选器。有关iptables命令的详细信息,请参阅http://www.netfilter.org/(还有一个libnfnetlink提供了用于过滤器管理的API,但这显然不适用于通用应用程序)。

您是否考虑过使用AF_UNIX套接字?

答案 2 :(得分:0)

执行此操作的标准方法是接受连接,然后如果它们来自您不喜欢的地址,请立即关闭它们而不进行任何通信。

如果这真的是你迫切需要做的事情,那么它不是BSD套接字做事方式的一部分。

答案 3 :(得分:0)

Netfilters / iptables已经提到了所以我没有进入 - 它可能是处理这个问题的最简单的方法,但它又不是“你的程序”的一部分,而是内核的一个特性。

但是有一个名为tcpwrappers的工具,许多系统守护进程也使用它 - 你知道那些hosts.allow& / etc文件夹中的hosts.deny文件 - 它们是tcpwrappers的一部分,可以归档您描述的确切方案。