![无法从外部 LAN 访问网页](https://linux22.com/image/25712/%E6%97%A0%E6%B3%95%E4%BB%8E%E5%A4%96%E9%83%A8%20LAN%20%E8%AE%BF%E9%97%AE%E7%BD%91%E9%A1%B5.png)
我有一个 CentOS 6.0 Web 服务器,运行 httpd、mysql、php 和 Joomla 2.5。它有一个静态的公共 IP 地址。我可以从 LAN 内部通过 IP 地址完美访问网页(即 Joomla 管理控制台)。
我回家后尝试从路由器后面进行连接,但无法访问网页。我可以 ping 和 ssh 到服务器,但无法使用 http 拉取网页。我的浏览器使用 Chrome。
有什么想法吗?
编辑:
这是以下的输出iptables --list
:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT udp -- anywhere anywhere udp spt:domain
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere icmp echo-reply
ACCEPT tcp -- anywhere anywhere multiport dports ftp,ssh,http,https state NEW,ESTABLISHED
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere icmp echo-reply
ACCEPT tcp -- anywhere anywhere multiport sports ssh,http,https state ESTABLISHED
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
答案1
好吧,自从我在 Apache 遇到这样的问题以来已经很多年了,但早在互联网的中世纪时期,我们就不得不在这种情况下诉诸诡计。
我们遇到的基本问题是相同的。我的网络有一个公共 IP,我的 Apache 服务器在 LAN 上使用私有 IP,并且负载均衡器将对公共 IP 的请求转发回一系列具有私有 IP 的服务器。
使用 tcpdump,我们可以看到我们的 HTTP 请求正在发送到 Apache,但 Apache 没有响应,因为请求传入“公共 IP”,而 Apache 认为它不应该响应这些请求,因为该 IP 不在其本地接口表中。
我们解决这个问题的方法是将公共 IP 地址作为环回接口的 IP 别名,并使用 /32 网络掩码。 ifconfig lo0:1 <IP/32> up
原来如此。这让 Apache 相信它应该响应这些请求。
您需要查明来自外部的请求是否到达了您的 Apache。如果它们甚至无法到达服务器,那么您需要查看防火墙/路由器/acls。如果您看到带有tcpdump
, but 的请求不是在 Apache 中,那么您需要查看iptables
.如果您确实在 Apache 中看到请求,但 Apache 没有响应它们,则您应该在 access_log 和 error_log 中找到信息,这些信息将为您提供有关发生情况的线索。
答案2
首先我想在家里看到这个命令的输出:
nmap -p 80 <public ip of webserver>
如果nmap
显示filtered
,则说明某些防火墙存在问题。如果nmap
显示closed
,则您的网络服务器的配置存在问题。
除此之外,我发现 的输出iptables --list
不是很有用。命令
iptables --list --verbose
提供更多信息。例如,看看第一条规则。看起来,所有的数据包都被接受了,但却--verbose
揭示了真相。您还可以借助规则计数器查看数据包是否已被丢弃。
接下来我将在您的网络服务器上尝试此命令:
tcpdump -i eth0 dst port 80
以查看是否有任何数据包到达您的服务器。确保此处使用适当的设备名称。
答案3
答案很简单。有防火墙挡住了。我所在的大学在没有明确允许的情况下阻止了 TCP/80。我将监听端口移至 TCP/10,000 以上(它们不会阻止)并且它起作用了。