티스토리 뷰

non-root user로 80 포트를 띄우면 java.net.SocketException: Permission denied 같은 에러가 날겁니다.

그렇다면, iptables를 배제한다면 setcap을 써야 하는데, 이게 아파치 웹 서버의 httpd 파일 처럼 단일 바이너리를 setcap 처리하는 것은 수월하지만 궁극적으로 java 파일을 통해 기동되는 톰캣은 이야기가 다소 복잡한 사항이 야기됩니다.

일단 다음과 같이 처리는 가능합니다.

setcap 'cap_net_bind_service=+ep' /u01/jdk1.8.0_60/bin/java


하지만 이후 톰캣 기동 시 다음과 같은 라이브러리 문제가 발생할 수 있습니다

/u01/jdk1.8.0_60/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory


---------------------------오류 해결법--------------------------------------------------------------------------------------------------------------

setcap(set file capabilities)으로 처리 가능합니다. 다만 소켓에 특권을 부여하는 CAP_NET_BIND_SERVICE의 경우 최신 커널부터 사용 가능합니다. (2.6.xx)

jeeg님의 libjli.so 오류는 다음과 같이 조치 가능합니다.

1. etc/ld.so.conf.d/java.conf 파일에 libjli.so 파일의 절대 경로를 입력 (단 파일이 위치하고 있는 상위 디렉토리까지만, 예를 들어 /u01/jdk1.8.0_60/lib/amd64/jli)
2. /sbin/ldconfig 실행

하지만 iptables 사용이 가능하다면 fragile님의 답변과 같이 iptables를 통해 처리하는 것이 더 좋겠습니다.

< 참고자료 >

Is there a way for non-root processes to bind to “privileged” ports (<1024) on Linux?
stackoverflow.com/questions/413807/is-th...rts-1024-on-l#414258

How to get Oracle java 7 to work with setcap cap_net_bind_service+ep
unix.stackexchange.com/questions/87978/h...p-net-bind-serviceep

JDK-7076745 : JRE doesn't work with Linux capabilities
bugs.java.com/view_bug.do?bug_id=7076745

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함