繁体   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