我有一个Netty TCP服务器,我想有选择地拒绝/拒绝传入连接尝试(基于他们的远程地址)。我想我必须使用ServerBootstrap.setParentHandler(ChannelHandler)
,但我在ChannelHandler
怎么办?我处理什么事?我该如何拒绝连接?
答案 0 :(得分:6)
正如Norman所说,没有办法拒绝连接,但你可以通过将Netty的IpFilterHandler作为第一个处理程序添加到服务器管道来立即关闭它。它也将停止传播用于过滤连接的上游信道状态事件。
@ChannelHandler.Sharable
public class MyFilterHandler extends IpFilteringHandlerImpl {
private final Set<InetSocketAddress> deniedRemoteAddress;
public MyFilterHandler(Set<InetSocketAddress> deniedRemoteAddress) {
this.deniedRemoteAddress = deniedRemoteAddress;
}
@Override
protected boolean accept(ChannelHandlerContext ctx, ChannelEvent e, InetSocketAddress inetSocketAddress) throws Exception {
return !deniedRemoteAddress.contains(inetSocketAddress);
}
}
如果你有要阻止的IP地址模式列表,你可以使用IpFilterRuleHandler,
//Example: allow only localhost:
new IPFilterRuleHandler().addAll(new IpFilterRuleList("+n:localhost, -n:*"))
答案 1 :(得分:2)
如果您有多个网络接口,并且只想从一个接口接受连接,则只需在ServerBootstrap
中设置本地地址。如果您的服务器在连接到多个网络的计算机上运行并且您只想提供其中一个网络,则这可能就足够了。在这种情况下,操作系统将拒绝来自其他网络的任何连接尝试。
在应用程序层中建立连接后,拒绝它就太晚了。你能做的最好就是马上关闭它。
如果您希望服务器仅在localhost上可用且对外部世界不可见,这就足够了:环回网络127.0.0.0/8由单独的接口提供。
答案 2 :(得分:0)
在Netty消息来源中查看org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink
后,我相当确定Netty接受所有传入的连接,并且没有办法拒绝它们(当然,它们可以在被接受后关闭)