簡體   English   中英

apache 不接受來自本地主機外部的傳入連接

[英]apache not accepting incoming connections from outside of localhost

我已經在機架空間上啟動了一個 CentOS 服務器並執行了yum install httpd 'd。 然后services httpd start 所以,只是准系統。

我可以通過 ssh (22) 遠程訪問它的 IP 地址沒問題,所以 DNS 或任何東西都沒有問題(我認為......),但是當我嘗試連接端口 80(通過瀏覽器或其他東西)時,我得到連接被拒絕。

然而,從本地主機,我可以使用 telnet (80),甚至 lynx 本身,並且可以毫無問題地得到服務。 從外面(我的房子、我的學校、當地的咖啡店等),telnet 連接到 22,但不是 80。

我使用netstat -tulpn (<- 我不會撒謊,我不明白-tulpn部分,但這是互聯網告訴我要做的......)然后看看

tcp    0    0 :::80     :::*    LISTEN    -                   

我相信我應該這樣做。 httpd.conf Listen 80

我有很多次services httpd restart

老實說,我不知道該怎么做。 機架空間在傳入端口 80 請求上沒有防火牆。 我覺得我錯過了一些愚蠢的東西,但我現在已經啟動了兩次准系統服務器,並且已經做了絕對最少的事情來獲得這個功能,認為我已經把事情搞砸了,但都沒有奏效。

任何幫助是極大的贊賞! (對於冗長的帖子感到抱歉......)

編輯我被要求發布iptables -L的輸出。 所以這里是:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

萬一還沒有解決。 你的 iptables 說:

狀態相關,已建立

這意味着它只允許通過已經建立的連接……這是由您建立的,而不是由遠程機器建立的。 然后你可以在接下來的規則中看到例外情況:

state NEW tcp dpt:ssh

這僅對 ssh 有效,因此您應該為 http 添加類似的規則/行,您可以這樣做:

state NEW tcp dpt:80

你可以這樣做:

sudo iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

(在這種情況下,我選擇在第四行添加新規則)

請記住,在編輯文件后,您應該像這樣保存它:

sudo /etc/init.d/iptables save

CentOS 7 現在默認使用 firewalld。 但是所有的答案都集中在 iptables 上。 所以我想添加一個與 firewalld 相關的答案。

由於 firewalld 是 iptables 的“包裝器”,因此使用 antonio-fornie 的答案似乎仍然有效,但我無法“保存”該新規則。 因此,一旦防火牆重新啟動,我就無法連接到我的 apache 服務器。 幸運的是,使用 firewalld 命令進行等效更改實際上要簡單得多。 首先檢查 firewalld 是否正在運行:

firewall-cmd --state

如果它正在運行,響應將只是一行顯示“正在運行”。

要在公共區域上臨時允許 http(端口 80)連接:

sudo firewall-cmd --zone=public --add-service=http

以上不會被“保存”,下次firewalld服務重新啟動時,它會回到默認規則。 在繼續之前,您應該使用此臨時規則進行測試並確保它解決了您的連接問題。

要永久允許公共區域上的 http 連接:

sudo firewall-cmd --zone=public --permanent --add-service=http

如果您執行“永久”命令而不執行“臨時”命令,則需要重新啟動 firewalld 以獲取新的默認規則(對於非 CentOS 系統,這可能會有所不同):

 sudo systemctl restart firewalld.service

如果這還沒有解決您的連接問題,那可能是因為您的接口不在“公共區域”中。 以下鏈接是了解 firewalld 的絕佳資源。 它詳細介紹了如何檢查、分配和配置區域: https : //www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7

默認情況下,SELinux 會阻止 Apache(以及所有 Apache 模塊)進行遠程連接。

# setsebool -P httpd_can_network_connect=1

嘗試在 iptables.config 表中使用以下設置

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

運行以下命令重啟iptable服務

service iptables restart

將 httpd.config 文件更改為

Listen 192.170.2.1:80

重新啟動apache。

現在試試。

如果您使用的是 RHEL/CentOS 7(OP 不是,但我想我會為我的案例分享解決方案),那么您將需要使用 firewalld 而不是其他答案中提到的 iptables 服務。

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

然后檢查它是否正在運行:

firewall-cmd --permanent --zone=public --list-all

它應該在ports 80/tcp

在 apache 配置文件(httpd.conf、apache2.conf、listen.conf...)中搜索 LISTEN 指令,如果您看到 localhost 或 127.0.0.1,那么您需要用您的公共 IP 覆蓋。

嘗試禁用 iptables:service iptables stop

如果可行,請為防火牆規則啟用 TCP 端口 80:從 root 運行 system-config-selinux,並在防火牆上啟用 TCP 端口 80 (HTTP)。

這會起作用:--對於REDHAT 使用:cat "/etc/sysconfig/iptables"

iptables -I  RH-Firewall-1-INPUT -s 192.168.1.3  -p tcp -m tcp --dport 80 -j ACCEPT

其次是

sudo /etc/init.d/iptables save

這就是我們從外部訪問 apache 的方法:

sudo iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
sudo service iptables restart

將 apache 設置為列出特定接口和端口,如下所示:

Listen 192.170.2.1:80

還要檢查 Iptables 和 TCP Wrappers 條目,這些條目可能會干擾主機與訪問該端口的外部主機

Apache 的綁定文檔

禁用 SELinux

$ sudo setenforce 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM