【问题标题】:apache not accepting incoming connections from outside of localhostapache不接受来自本地主机外部的传入连接
【发布时间】:2012-05-30 13:12:48
【问题描述】:

我在 rackspace 上启动了一个 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'd。

老实说,我不知道该怎么做。机架空间不可能对传入的端口 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   

【问题讨论】:

  • 你为什么要责怪 Apache(Tomcat)?必须有一些防火墙或 iptable 设置在端口 80 上丢弃外部数据包。我认为 Apache 不会进入那个级别来过滤数据包,最好让底层操作系统提供的网络实用程序完成这项工作。还是这样做的?
  • 哎呀我明白了!绑定文档,tomcat 提供这些选项。最好通过它找到它的详细信息。
  • SO 题外话;属于Server Fault

标签: linux apache webserver centos


【解决方案1】:

万一还没有解决。你的 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 6.5(64位)默认安装了防火墙……
  • 您先生,是人类真正的英雄和救世主,是最黑暗时代文明的最后希望。谢谢!!11
  • 呃,顺便说一句,保存命令不起作用(找不到命令):(
  • 在 Fedora 中,使用 sudo /sbin/iptables-save 保存 iptables 中的更改
【解决方案2】:

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

【讨论】:

  • 你可以像firewall-cmd --zone=public --add-port=12345/tcp那样添加端口
【解决方案3】:

SELinux 默认阻止 Apache(以及所有 Apache 模块)进行远程连接。

# setsebool -P httpd_can_network_connect=1

【讨论】:

    【解决方案4】:

    在 iptables.config 表中尝试以下设置

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

    运行以下命令重启iptable服务

    service iptables restart
    

    将 httpd.config 文件更改为

    Listen 192.170.2.1:80
    

    重新启动apache。

    立即尝试。

    【讨论】:

      【解决方案5】:

      如果您使用的是 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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 我检查了 httpd.conf,里面没有任何可疑之处(再次,使用默认的 EVERYTHING 来限制我的错误)。虽然我找不到 apache2 文件夹......很奇怪。我想知道这是怎么回事吗?它通常不是在 /etc/ 中吗? “yum install httpd”不应该解决这个问题吗?奇怪...
        【解决方案7】:

        尝试禁用 iptables:service iptables stop

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

        【讨论】:

        • 感谢您的回复!我禁用了 iptables,但它仍然无法工作...... :( 还有其他想法吗?
        • 已经尝试禁用selinux?尝试:setenforce 0。您是否阅读过 /var/log/messages syslog 日志文件或 /var/log/httpd/error_log httpd 错误日志?
        【解决方案8】:

        这会起作用: -- 对于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
        

        【讨论】:

          【解决方案9】:

          这是让我们从外部访问 apache 的方法:

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

          【讨论】:

            【解决方案10】:

            将 apache 设置为列出特定接口和端口,如下所示:

            Listen 192.170.2.1:80
            

            同时检查 Iptables 和 TCP Wrappers 条目,这些条目可能会干扰主机与访问该端口的外部主机

            Binding Docs For Apache

            【讨论】:

            • 我将其设置为“监听 5.95.203.157”,然后运行“服务 httpd 重启”和 99)无法分配请求的地址:make_sock:无法绑定到地址 5.95.203.157:80 没有可用的监听套接字, 关机。知道这可能意味着什么吗?
            • 该地址是否已分配给该主机上的接口?
            【解决方案11】:

            禁用 SELinux

            $ sudo setenforce 0
            

            【讨论】:

              猜你喜欢
              • 2016-06-20
              • 1970-01-01
              • 2021-10-02
              • 2021-12-09
              • 2010-09-11
              • 2017-09-11
              • 2022-01-21
              • 2015-03-29
              • 1970-01-01
              相关资源
              最近更新 更多