![](/img/trans.png)
[英]How to put socket file descriptor in a buffer and continue accepting incoming connections?
[英]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 條目,這些條目可能會干擾主機與訪問該端口的外部主機
禁用 SELinux
$ sudo setenforce 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.