2012-01-26 2 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에 로컬 주소 만 설정하면됩니다. 서버가 여러 네트워크에 연결된 시스템에서 실행 중이며 둘 중 하나만 제공하려는 경우이 방법으로 충분할 수 있습니다. 이 경우 다른 네트워크로부터의 연결 시도는 OS에 의해 거부됩니다.

응용 프로그램 계층에 연결되면 해당 응용 프로그램 계층을 거부하기에는 너무 늦습니다. 당신이 할 수있는 최선은 바로 그것을 닫는 것입니다.

예를 들어 로컬 호스트에서만 서버를 사용할 수 있고 바깥 세상에서는 보이지 않게하려면 루프백 네트워크 127.0.0.0/8에 별도의 인터페이스가 제공됩니다.

+0

오른쪽. 그러나 Netty에서 연결을 거부 할 수있는 방법이 없을까요? (다시 말하지만,'ServerBootstrap.setParentHandler()'와 관련이있다) – pron

+0

여러 개의 네트워크 인터페이스를 가지고 있다면 하나만 바인드하고 다른 하나는 OS가 다른 커넥션을 거절 할 수 있음을주의해서 편집했다. – Joni

0

Netty 소스에서 org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink을보고 난 후에 Netty가 들어오는 모든 연결을 허용하고 거부 할 수있는 방법이 없다는 사실을 확신합니다 (물론 받아 들일 수는 있지만 닫을 수는 있습니다).

+3

내가 아는 한, 소켓 API 레벨로부터 선택적으로 포트로 들어오는 연결을 거절 할 수있는 방법이 없다. 아마도 iptables 또는 비슷한 것을 구성해야합니다. – trustin

관련 문제