SELinux http 포트 허용하기
nginx로 3100번 포트에 서비스를 열려고 했더니 bind에 실패했다.
$ sudo service nginx start
Redirecting to /bin/systemctl start nginx.service
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.
$ systemctl status nginx.service
...
nginx[1172997]: nginx: [emerg] bind() to 0.0.0.0:3100 failed (13: Permission denied)
왜 그런가 찾아봤더니, SELinux(Security-Enhanced Linux)가 기본적으로 http에서 사용되는 포트를 제한하고 있었다. 또한 httpd(데몬)의 연결 여부도 설정해줘야 한다.
SELinux 확인
(1) http_port_t
# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
sestatus를 이용해 SELinux 상태를 확인할 수 있다. Current mode가 enforcing으로 나오면 SELinux가 적용중인 것이다
$ sudo semanage port -l | grep http_port_t
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
http가 허용되는 포트는 위 명령어로 확인 가능하다
(2) httpd_can_network_connect
$ sudo getsebool httpd_can_network_connect
httpd_can_network_connect --> off
getsebool을 사용해 http 데몬의 네트워크 연결 허용 여부를 확인할 수 있다
SELinux 설정값 변경
(1) http 포트 허용
보통 쓰이는 포트가 아닌 비표준 포트로 http를 허용하려면 아래 명령어를 사용한다
$ sudo semanage port -a -t http_port_t -p tcp {허용할_포트}
제거는 아래처럼 하면 된다
$ sudo semanage port -d -t http_port_t -p tcp {제거할_포트}
(2) httpd 연결 허용
$ sudo setsebool -P httpd_can_network_connect on
연결을 다시 막으려면 on 대신 off(또는 0, false)를 입력하면 된다