![](/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.