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則不受此控制。

相關文章
相關標籤/搜索