apache httpd 無法連接到網際網路
我為 Dokuwiki 執行 Apache2 (httpd) 伺服器。Dokuwiki 無法使用其升級或安裝外掛功能(請參閱此處的問題)。
似乎使用者apache無法訪問網路/網際網路。
測試
作為根,例如 curl 工作正常:
root @alpha:~$ curl https://download.dokuwiki.org -L <html lang="en"> <head> <meta charset="utf-8" /> <title>Download DokuWiki</title> ...
但是當我嘗試與使用者 apache 相同時:
root @alpha:~$ sudo -H -u apache bash -c 'curl https://download.dokuwiki.org -L' curl: (7) Failed to connect to 2a01:4f8:172:3483::2: Network is unreachable
或以 wget 作為根:
root @alpha:~$ wget https://download.dokuwiki.org --2016-12-05 17:01:57-- https://download.dokuwiki.org/ Connecting to <proxy>:3128.... connected. Proxy request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: ‘index.html’ [ <=> ] 25,350 --.-K/s in 0.02s 2016-12-05 17:01:57 (1.40 MB/s) - ‘index.html’ saved [25350]
與使用者 apache 相比:
root @alpha:~$ sudo -H -u apache bash -c 'wget https://download.dokuwiki.org' --2016-12-05 17:02:26-- https://download.dokuwiki.org/ Resolving download.dokuwiki.org (download.dokuwiki.org)... 138.201.137.132, 2a01:4f8:172:3483::2 Connecting to download.dokuwiki.org (download.dokuwiki.org)|138.201.137.132|:443... failed: No route to host. Connecting to download.dokuwiki.org (download.dokuwiki.org)|2a01:4f8:172:3483::2|:443... failed: Network is unreachable.
代理
**伺服器位於代理後面。**對於 root 似乎知道這一點,但對於使用者 apache 則不然。
代理設置設置在
/etc/profile.d/proxy.sh
(代理是一個佔位符):MY_PROXY_URL="http://<proxy>:3128" HTTP_PROXY=$MY_PROXY_URL HTTPS_PROXY=$MY_PROXY_URL FTP_PROXY=$MY_PROXY_URL http_proxy=$MY_PROXY_URL https_proxy=$MY_PROXY_URL ftp_proxy=$MY_PROXY_URL export HTTP_PROXY HTTPS_PROXY FTP_PROXY export http_proxy https_proxy ftp_proxy
我還嘗試在/etc/profile中設置代理(使用與上面相同的程式碼)並重新啟動伺服器,但這沒有幫助。
對於 root,設置了變數:root @alpha:~ $ echo $ http_proxy http:// 但不適用於 apache:root @alpha:~ $ sudo -H -u apache bash -c ’echo $ http_proxy’ /無輸出/(del,因為是錯誤的測試方式)
/root/.bash_profile 或 /root/.bashrc 沒有什麼特別之處。(不重要)SELinux
似乎 SELinux 是原因。當我嘗試使用 Dokuwiki 中的“Wiki 升級”時,/var/log/audit/audit.log 中有兩個新條目:
type=AVC msg=audit(1481032251.392:768): avc: denied { name_connect } for pid=1368 comm="httpd" dest=3128 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:squid_port_t:s0 tclass=tcp_socket type=AVC msg=audit(1481032251.394:769): avc: denied { name_connect } for pid=1368 comm="httpd" dest=3128 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:squid_port_t:s0 tclass=tcp_socket
這裡有什麼問題?服務 httpd 不允許連接到 3128 埠?
修復
問題出在 SELinux 上。檢查設置:
getsebool -a | grep httpd_can_network_connect
我有:
httpd_can_network_connect --> off httpd_can_network_connect_cobbler --> off httpd_can_network_connect_db --> off
和:
setsebool -P httpd_can_network_connect on
您打開httpd 程序的網路訪問。(我必須先安裝policycoreutils-python,
rpm -qa | grep selinux
顯示你是否已經擁有它。)警告!
我還不熟悉 SELinux,而且這種更改可能會產生影響系統安全性的副作用!
邊注
我很困惑如何以 apache 使用者身份測試命令(請參閱問題中的已刪除內容),所以我將在這裡展示一種方法:只需為使用者 apache 啟動一個新 shell :):
sudo -u apache /bin/bash
請注意:在 SELinux 中更改後,curl 對 apache 使用者仍然不起作用,因為它只允許程序 httpd 訪問網路。
Centos 預設使用 SElinux,你查看過這個 IDS for apache 的任何規則嗎?
請原諒我的英語,它不是我的母語