× Join the Stack and Retry Community
sarc.io is a community of engineers or programmers, just like you, helping each other.

톰캣 띄울 때 non-root user 로 80 포트 띄우는 법?

  • dolphin
    (돌고래)
  • dolphin's Avatar 이 글의 작성자
  • Offline
  • ★★ Staff ★★
  • ★★ Staff ★★
더보기
17 Jun 2016 21:56 #797 작성자: dolphin
dolphin 님의 글: 톰캣 띄울 때 non-root user 로 80 포트 띄우는 법?
톰캣을 띄우려는데 root가 아닌 일반 유저로 띄우니까
80 / 443 과 같은 낮은 수의 포트를 띄울 수가 없더라구요.
현재 웹이 http로 들어와도 https로 전환되게끔 설정을 해놨는데요,
iptables 를 이용해서 80으로 들어오면 8080으로 redirect 하게 하는 방법을 썼더니
redirect는 되는데 http -> https 전환이 안되고...
방법이 없을까요???
더보기
18 Jun 2016 22:36 - 19 Jun 2016 01:30 #805 작성자: jeeg
jeeg 님의 답글: 톰캣 띄울 때 non-root user 로 80 포트 띄우는 법?
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
더보기
18 Jun 2016 23:14 - 19 Jun 2016 12:34 #806 작성자: fragile
fragile 님의 답글: 톰캣 띄울 때 non-root user 로 80 포트 띄우는 법?
위에분 말씀대로 CAP_NET_BIND_SERVICE 를 통해서 조치할 수도 있지만 RHEL 4, 5 의 경우 CAP_NET_BIND_SERVICE capacity 를 지원하지 않습니다.
따라서 port forwarding 설정을 통해 프리라우팅을 설정하는 방법이 나을 것 같습니다.

통캣은 기존대로 1024 보다 높은 숫자의 번호로 기동하고 iptables 를 통해 프리라우팅 설정을 해줍니다.

먼저 /etc/sysctl.conf 에 net.ipv4.ip_forward 값을 1 로 변경합니다 (default 0)

# vi /etc/sysctl.conf

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# sysctl -p (변경한 설정 값 적용)

그리고 iptables 에 적용

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
# iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443

# service iptables restart

iptables 룰은 순서대로 적용되니 꼭 80 을 443 룰 위에 적용해 주세요.
좋아요를 누른 살쾡이: nastyboy, c4016675
더보기
19 Jun 2016 01:36 - 19 Jun 2016 01:38 #807 작성자: nastyboy
nastyboy 님의 답글: 톰캣 띄울 때 non-root user 로 80 포트 띄우는 법?
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
좋아요를 누른 살쾡이: scenic, c4016675
Time to create page: 0.130 seconds
Powered by Kunena Forum