nginx監聽端口和反向代理端口的權限問題


Linux的SELinux安全性控制除作用於文件系統外還作用於端口,這使得那些作為服務啟動的進程只能在規定的幾個端口上監聽。為敘述方便我們稱之為受控端口。

nginx監聽端口

要查看當前有哪些受控端口可執行:

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

這里顯示了八個端口號,其中包括80端口。由於nginx默認在80端口監聽因此啟動正常。

# service nginx start

我們接下來可做個試驗,看看nginx能否在其它端口上監聽,比如8888端口。為此新加/etc/nginx/conf.d/test.conf文件:

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

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

完成后讓nginx重新加載配置:

# nginx -s reload

雖然該命令執行成功,但實際上8888端口並未處於監聽狀態:

# netstat -anp | grep 8888

上面的netstat命令無輸出,這表明8888端口不在監聽狀態。進一步我們查看一下審計日志:

vi /var/log/audit/audit.log

在文件尾部發現如下兩行:

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端口是否已被登記:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM