2012-01-26 20 views
2

我有一個Netty TCP服務器,並且我想拒絕/拒絕傳入連接嘗試(基於它們的遠程地址)。我想我必須使用ServerBootstrap.setParentHandler(ChannelHandler),但是我在ChannelHandler中應該怎麼做?我正在處理什麼事件?我如何拒絕連接?如何拒絕Netty中的傳入連接?

回答

5

正如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:*")) 
2

如果您有多個網絡接口並且想要接受來自一個接口的連接,則只需要在ServerBootstrap中設置本地地址。如果您的服務器在連接到多個網絡的計算機上運行,​​並且您只想提供其中一個網絡,則這可能就足夠了。在這種情況下,來自其他網絡的任何連接嘗試都將被操作系統拒絕。

在應用程序層中建立連接後,拒絕它就太遲了。你可以做的最好的就是立即關閉它。

例如,如果您希望服務器僅在本地主機上可用且外部世界不可見,則這已足夠:環回網絡127.0.0.0/8由單獨的接口提供服務。

+0

權。但是在Netty中沒有辦法拒絕連接嗎? (再次,我確信這與'ServerBootstrap.setParentHandler()') – pron

+0

編輯注意,如果你有幾個網絡接口,你可以綁定一個,並讓操作系統拒絕其他連接。 – Joni

0

在Netty資源中查看org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink之後,我相當確定Netty接受所有傳入連接,並且沒有辦法拒絕它們(但是,當然,它們可以在被接受後關閉)。

+3

據我所知,沒有辦法從套接字API級別有選擇地拒絕來自端口的傳入連接。也許你需要配置iptables或類似的東西。 – trustin