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.conf
说Listen 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