nginx监听端口和反向代理端口的权限问题

Linux的SELinux安全性控制除做用于文件系统外还做用于端口,这使得那些做为服务启动的进程只能在规定的几个端口上监听。为叙述方便咱们称之为受控端口。nginx

nginx监听端口

要查看当前有哪些受控端口可执行:安全

# semanage port -l | grep '^http_port_t'
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

这里显示了八个端口号,其中包括80端口。因为nginx默认在80端口监听所以启动正常。socket

# service nginx start

咱们接下来可作个试验,看看nginx可否在其它端口上监听,好比8888端口。为此新加/etc/nginx/conf.d/test.conf文件:tcp

# /etc/nginx/conf.d/test.conf
server {
    listen       8888;
    server_name  localhost;
}

你也能够不新加本文件,而是直接修改/etc/nginx/conf.d/default.conf文件。ui

完成后让nginx从新加载配置:spa

# nginx -s reload

虽然该命令执行成功,但实际上8888端口并未处于监听状态:代理

# netstat -anp | grep 8888

上面的netstat命令无输出,这代表8888端口不在监听状态。进一步咱们查看一下审计日志:日志

vi /var/log/audit/audit.log

在文件尾部发现以下两行:code

1 type=AVC msg=audit(1452146884.454:2430): avc:  denied  { name_bind } for  pid=1268 comm="nginx" src=8888 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
2 type=SYSCALL msg=audit(1452146884.454:2430): arch=c000003e syscall=49 success=no exit=-13 a0=b a1=1b5cc60 a2=10 a3=7ffdaf0be83c items=0 ppid=1 pid=1268 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)

这里的详细含义我也不清楚,但确定的是nginx无权限在8888端口上监听。若是你确实但愿nginx在8888端口上监听,则可把8888端口号注册为受控端口。注册前请先检查一下8888端口是否已被登记:server

semanage port -l | grep 8888

若是有输出则表示8888端口已被注册,此时请换用其它端口。

要注册http 8888端口号请执行:

semanage port -a -t http_port_t -p tcp 8888

做为一种好习惯咱们应再次检查一下受控端口列表,看看有没有刚注册的端口号:

semanage port -l | grep '^http_port_t'

最后再让nginx从新加载配置:

# nginx -s reload

此时8888端口应处于监听状态:

# netstat -anp | grep 8888

 

nginx反向代理端口

若是你想让你的应用被nginx反向代理,则被反向代理的端口号也必须为已受控端口。

其它说明

不知何故,只当你把nginx启动为服务时端口才受Linux安全性控制,若是你直接运行nginx则不受此控制。

相关文章
相关标签/搜索