Centos

apache httpd 無法連接到網際網路

  • February 9, 2019

我為 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-pythonrpm -qa | grep selinux顯示你是否已經擁有它。)

警告!

我還不熟悉 SELinux,而且這種更改可能會產生影響系統安全性的副作用!

邊注

我很困惑如何以 apache 使用者身份測試命令(請參閱問題中的已刪除內容),所以我將在這裡展示一種方法:只需為使用者 apache 啟動一個新 shell :):

sudo -u apache /bin/bash

請注意:在 SELinux 中更改後,curl 對 apache 使用者仍然不起作用,因為它只允許程序 httpd 訪問網路。

Centos 預設使用 SElinux,你查看過這個 IDS for apache 的任何規則嗎?

請原諒我的英語,它不是我的母語

引用自:https://unix.stackexchange.com/questions/328174