증상

 

[info] jk_open_socket::jk_connect.c (626): connect to 127.0.0.1:11009 failed (errno=13)
[Wed Mar 06 13:31:46 2013] [1690:140513832994784] [info] ajp_connect_to_endpoint::jk_ajp_common.c (1008): Failed opening socket to (127.0.0.1:11009) (errno=13)
[Wed Mar 06 13:31:46 2013] [1690:140513832994784] [error] ajp_send_request::jk_ajp_common.c (1630): (kwiki) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=13)
[Wed Mar 06 13:31:46 2013] [1690:140513832994784] [info] ajp_service::jk_ajp_common.c (2607): (kwiki) sending request to tomcat failed (recoverable), because of error during request sending (attempt=1)

 

원인

  1. Web Server가 뚫릴 경우 침입자는 이를 통해 내부망에 침입할 수가 있으므로 SELinux 는 httpd 에 대해서 엄격하게 제어하고 있음
  2. SELinux 의 context 에 의해 apache httpd 가 연결 할 수 있는 port 는 기본적으로 다음 포트임

    # semanage port -l|grep http_port_t
    http_port_t tcp 80, 443, 488, 8008, 8009, 8443
    CODE

     

  3. apache 와 tomcat 을 한 서버에서 구동할 경우 8009 이외의 port 에 tomcat 을 구동했다면 SELinux 정책에 의해 apache 는 tomcat 을 연결할 수가 없어서 위의 에러가 발생

 

처리방법 #1

이 방법대로 하면 httpd 가 모든 port 에 연결할 수 있으므로 보안에 취약해 질수 있으므로 추천하지 않음

  1. 다음 명령어로 httpd 의 network 연결을 허용하도록 설정

    setsebool httpd_can_network_connect 1

  2. getsebool httpd_can_network_connect 하여 on 인지 확인

-P 옵션일 줄 경우 리부팅시에도 적용됨

 

처리방법 #2

  1. tomcat 의 AJP port 를 확인후에 semanage 명령어로 httpd 가 해당 포트로 연결가능하게 수정(예: 11009 일 경우)

    semanage port -a -t http_port_t -p tcp 11009
    CODE
  2. apache 를 재구동하여 정상동작 여부 확인

 

참고