Как отказаться от входящих подключений в Netty? - PullRequest
2 голосов
/ 27 января 2012

У меня есть Netty TCP-сервер, и я хочу выборочно отклонять / отклонять входящие попытки подключения (на основе их удаленного адреса) Я думаю, я должен использовать ServerBootstrap.setParentHandler(ChannelHandler), но что мне делать в ChannelHandler? С каким событием я справляюсь? Как отказаться от подключения?

Ответы [ 3 ]

6 голосов
/ 27 января 2012

Как сказал Норман, отказать в соединении невозможно, но вы можете немедленно закрыть его, добавив IpFilterHandler от Netty в конвейер сервера в качестве первого обработчика.Это также прекратит распространение событий состояния восходящего канала и для фильтрованного соединения.

@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:*"))
2 голосов
/ 27 января 2012

Если у вас несколько сетевых интерфейсов и вы хотите принимать соединения только от одного интерфейса, вам просто нужно установить локальный адрес в ServerBootstrap.Этого может быть достаточно, если ваш сервер работает на машине, подключенной к нескольким сетям, и вы хотите обслуживать только одну из них.В этом случае ОС будет отказывать в любых попытках подключения из других сетей.

Если у вас есть соединение на уровне приложений, уже слишком поздно от него отказываться.Лучшее, что вы можете сделать, это немедленно закрыть его.

Этого достаточно, если, например, вы хотите, чтобы сервер был доступен только на локальном хосте и не был виден внешнему миру: петлевая сеть 127.0.0.0/8 обслуживается отдельныминтерфейс.

0 голосов
/ 27 января 2012

Посмотрев на org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink в источниках Netty, я вполне уверен, что Netty принимает все входящие соединения, и от них невозможно отказаться (но, конечно, они могут быть закрыты после принятия). 1002 *

...