【问题标题】:Netty how to completely ignore TCP/UDP packets from unknown IPsNetty 如何完全忽略来自未知 IP 的 TCP/UDP 数据包
【发布时间】:2022-04-07 14:39:30
【问题描述】:

我正在尝试使用 Netty 创建一个 SOCKS 代理实现,我需要丢弃来自未知主机/IP 的数据包。如果从未知主机收到的数据包应该丢弃它并且不发送任何数据包作为响应,它应该像防火墙一样工作。

    IpFilterRule[] rules = new IpFilterRule[2];
    rules[0] = new IpSubnetFilterRule("127.0.0.1", 8, IpFilterRuleType.ACCEPT); 
    rules[1] = new IpSubnetFilterRule("127.0.0.1", 0, IpFilterRuleType.REJECT);

    ServerBootstrap bootstrap = new ServerBootstrap();
    bootstrap.group(boss, worker)
    .channel(NioServerSocketChannel.class)
    .option(ChannelOption.SO_BACKLOG, 1024)
    .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000)
    .childHandler(new ChannelInitializer<SocketChannel>() {
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {

            ch.pipeline().addFirst(ipFilter);

            ch.pipeline().addLast(new IdleStateHandler(3, 30, 0));
            ch.pipeline().addLast(new ProxyIdleHandler());
            // some socks channel pipeline initialization
        }
    });

编辑 1:将 IP 过滤器添加到通道管道后,我仍然可以看到来自 Netty 代理服务器 192.168.56.1 的 SYN ACK 响应和 FIN ACK、RST ACK 数据包

【问题讨论】:

    标签: java netty


    【解决方案1】:

    RuleBasedIpFilter.accept() 会有帮助吗?

     @Override
      protected boolean accept(ChannelHandlerContext ctx, InetSocketAddress remoteAddress) throws Exception {
        for (IpFilterRule rule : rules) {
          if (rule == null) {
            break;
          }
    
          if (rule.matches(remoteAddress)) {
            return rule.ruleType() == IpFilterRuleType.ACCEPT;
          }
        }
    
        return true;
      }
    }
    

    【讨论】:

    • 是的,我想稍后创建我自己的实现,但现在我想知道如何使用我的 ChannelInitializer 将它附加到引导程序。如果我这样做,netty 不会发送一些 TCP 响应吗?我是 netty 新手。
    • @zur13 您可以配置规则不发送 TCP 响应。 tabnine.com/code/java/classes/…
    • @zur13 另外,在这里查看stackoverflow.com/questions/31961506/…
    • 但是对于这个规则,无论如何你都会收到包裹。所以发件人可以在第 7 层进行 DDOS 攻击。最好是在收到包裹之前这样做。内核端 iptables ?还是java有这个能力?有人可以写一个想法吗? ?
    • 您需要在内核级别 (iptables) 执行此操作
    【解决方案2】:

    使用 Netty,您只能在应用层丢弃消息。您不能使用 Netty 在网络层丢弃数据包。操作系统的网络堆栈会在将 TCP 数据包推送到 Netty 之前确认该数据包。

    【讨论】:

      猜你喜欢
      • 2010-12-18
      • 2018-10-23
      • 1970-01-01
      • 2011-09-15
      • 2012-01-02
      • 1970-01-01
      • 2017-05-13
      • 2015-01-17
      • 2015-09-16
      相关资源
      最近更新 更多