Apache不接受来自本地主机外部的传入连接

我在机架空间启动了一个CentOS服务器并执行了yum install httpd httpd'd。 然后services httpd start 。 所以,只是准系统。

我可以通过ssh(22)远程访问它的IP地址没有问题,所以没有问题的DNS或任何东西(我认为…),但是当我尝试连接端口80(通过浏览器或其他),我得到拒绝连接。

然而,从本地主机,我可以使用telnet(80),甚至是山猫本身,并得到没有问题。 从外面(我的房子,我的学校,一家当地的咖啡店等),telnet连接22,而不是80。

我使用netstat -tulpn (< – 我不会说谎,我不明白-tulpn部分,但这就是互联网告诉我要做的事情),看看

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

因为我相信我应该。 httpd.confListen 80

我有services httpd restart很多次。

老实说,我不知道该怎么做。 rackspace在传入的80端口请求上没有防火墙。 我觉得我错过了一些愚蠢的东西,但是现在我已经启动了一个准系统服务器两次,并且已经完成了这个function的思考,我已经用我的修补程序把事情弄糟了,但是都没有成功。

任何帮助是极大的赞赏! (对于冗长的post感到抱歉…)

编辑我被要求发布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说:

状态RELATED,ESTABLISHED

这意味着它只允许通过已经build立的连接……这是由你build立的,而不是由远程机器build立的。 那么你可以在下面的规则中看到这个例外:

 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 

(在这种情况下,我select在第四行添加新规则)

请记住,编辑文件后,你应该像这样保存它:

 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服务重新启动时,它将回到默认规则。 在继续之前,您应该使用此临时规则来testing并确保它解决了您的连接问题。

永久允许公共区域上的http连接:

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

如果你在不执行“临时”命令的情况下执行“永久”命令,则需要重新启动firewalld才能获得新的默认规则(对于非CentOS系统,这可能会有所不同):

  sudo systemctl restart firewalld.service 

如果这还没有解决你的连接问题,可能是因为你的界面不在“公共区域”。 以下链接是学习firewalld的一个很好的资源。 它会详细介绍如何检查,分配和configuration区域: 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。

现在试试。

在apacheconfiguration文件(httpd.conf,apache2.conf,listen.conf,…)中searchLISTEN指令,如果你看到localhost或127.0.0.1,那么你需要用你的公共ip覆盖。

尝试禁用iptables:服务iptables停止

如果工作正常,请启用TCP端口80到您的防火墙规则:从root运行system-config-selinux,并在防火墙上启用TCP端口80(HTTP)。

这将工作: – 为REDHAT使用:猫“/ 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

如果你使用的是RHEL / CentOS 7(OP没有,但是我认为我会分享解决scheme),那么你需要使用firewalld而不是其他答案中提到的iptables服务。

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

然后检查它是否正在运行:

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

它应该在ports 80/tcp

禁用SELinux

 $ sudo setenforce 0