我有一個Netty TCP服務器,並且我想拒絕/拒絕傳入連接嘗試(基於它們的遠程地址)。我想我必須使用ServerBootstrap.setParentHandler(ChannelHandler)
,但是我在ChannelHandler
中應該怎麼做?我正在處理什麼事件?我如何拒絕連接?如何拒絕Netty中的傳入連接?
2
A
回答
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資源中查看org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink
之後,我相當確定Netty接受所有傳入連接,並且沒有辦法拒絕它們(但是,當然,它們可以在被接受後關閉)。
+3
據我所知,沒有辦法從套接字API級別有選擇地拒絕來自端口的傳入連接。也許你需要配置iptables或類似的東西。 – trustin
相關問題
- 1. 如何拒絕傳入連接?
- 2. uwsgi --reload拒絕傳入連接
- 3. 如何拒絕websocket連接?
- 4. 拒絕連接
- 5. 拒絕連接?
- 6. Rserve:拒絕連接:連接
- 7. 拒絕連接:連接jijerster
- 8. Apache拒絕連接
- 9. KSOAP2 - 拒絕連接
- 10. SignalR拒絕連接
- 11. Cassandra拒絕連接
- 12. 拒絕primepush連接
- 13. 拒絕連接RubyGems
- 14. Hadoop連接拒絕
- 15. 連接拒絕Postgresql
- 16. ssh連接拒絕
- 17. Mongolab拒絕連接
- 18. 拒絕Netcat連接
- 19. kubectl:拒絕連接
- 20. HBase連接拒絕
- 21. Telnet連接拒絕
- 22. 連接被拒絕
- 23. SFTP連接拒絕
- 24. Postgres:連接拒絕
- 25. PostgreSQL拒絕連接
- 26. Tokbox - 拒絕連接
- 27. 拒絕RMI連接
- 28. 連接被拒絕
- 29. Redis - 連接拒絕
- 30. 如何瞭解MySQL的「拒絕連接」
權。但是在Netty中沒有辦法拒絕連接嗎? (再次,我確信這與'ServerBootstrap.setParentHandler()') – pron
編輯注意,如果你有幾個網絡接口,你可以綁定一個,並讓操作系統拒絕其他連接。 – Joni