我正在尝试从本地网络中的另一个源访问我的本地 Apache。运行 Apache 的机器的 IP 是 192.168.2.36,操作系统是 xubuntu 12.04。通过这台机器我可以访问 Apache 实例,但无法从任何其他 PC 或移动设备访问。路由器的防火墙已关闭。
sudo netstat -tulpen | grep apache
给我以下任一:
tcp 0 0 192.168.2.36:80 0.0.0.0:* LISTEN 0 1115713 4606/apache2
或(取决于 ports.conf 中的配置):
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 1115713 4606/apache2
两者都不起作用。主机可以被网络中的其他机器 ping 通。
我简直无法想象为什么这会变得如此困难......
答案1
您是否区分了本地网络中可以 ping Apache 服务器的其他计算机和尝试访问 Apache 服务器(但失败)的远程 PC/移动设备?我的意思是,它们在同一个网络中吗?
只是为了确保万无一失,如果您觉得这很明显,那不好意思提及这一点:192.168.2.36
这是一个私有 IP 地址,不会被路由,因此无法从互联网访问。您提到的远程 PC 和移动设备必须与 Apache 服务器位于同一本地网络中,或可通过你的路由器(不是您的 ISP,除非您将其配置为将某些外部端口转发到 Apache 服务器的端口 80,当然 - 我猜情况并非如此)。
我现在假设远程 PC 位于同一个本地网络中(假设具有 IP 地址192.168.2.100
)。
1)首先检查是否可以在本地访问 Apache 192.168.2.36
(您写道从服务器本身访问有效 - 为了完整性,我在这里列出它):
telnet 192.168.2.36 80
如果你没有得到类似这样的信息:
$ telnet 192.168.2.36 80
Trying 192.168.2.36...
Connected to 192.168.2.36.
Escape character is '^]'.
不要再看了,检查一下你的 Apache 配置/安装,因为有些东西没有正常工作。
如果您看到上述输出,则表示 Apache 正在运行。使用 Ctrl-] 关闭 telnet 会话并继续执行 2)。
2) 现在让我们看看是否有任何网络流量从远程 PC (192.168.2.100) 到达 192.168.2.36。在 192.168.2.36 上输入:
sudo tcpdump dst 192.168.2.36 and dst port 80
转储所有目的地为 192.168.2.36:80 的网络数据包。
现在登录192.168.2.100,输入:
telnet 192.168.2.36 80
然后是“GET /”。这是一个 HTTP 请求,让我们看看服务器是否收到了它。
返回 tcpdump 命令并检查其输出。如果它看起来类似于以下内容:
22:12:13.748106 IP 192.168.2.100.50272 > 192.168.2.36.http: Flags [S], seq 3557385561, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 239423238 ecr 0,sackOK,eol], length 0
22:12:13.748190 IP 192.168.2.100.50272 > 192.168.2.36.http: Flags [.], ack 1456211961, win 9186, options [nop,nop,TS val 239423238 ecr 239423238], length 0
数据包正在通过,因此继续执行3)。
如果您没有看到任何数据包,请192.168.2.100
在本地网络中的其他几台 PC 上测试上述步骤。如果您看到相同的行为,请刷新防火墙规则192.168.2.36
:
sudo iptables-save > /tmp/save
sudo iptables -F
然后重试。如果没有数据包到达,192.168.2.36
就很难说出了什么问题……有些猜测是……但首先恢复 iptables 配置:
sudo iptables-restore < /tmp/save
我说的是,一些大胆的猜测是:192.168.2.36
或者192.168.2.100
有一个损坏的 ARP 缓存(使用 arp -n 列出 ARP 缓存,然后使用 arp -d 删除条目IP地址)、192.168.2.36
以太网卡或电缆有缺陷、IP 地址192.168.2.36
已被网络上的另一台 PC 使用、远程 PC 配置为使用 IPv6...
3) 让我们检查一下 IP 数据包是否返回192.168.2.100
。使用 Ctrl-C 停止 tcpdump 并输入:
sudo tcpdump dst 192.168.2.100 src port 80
192.168.2.100
查看从源端口 80(即 Apache 服务器)返回的任何数据包。如果您看到类似以下内容的输出:
23:03:33.054023 IP 192.168.2.36.http > 192.168.2.100.50471: Flags [S.], seq 1739061544, ack 502726814, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 242492771 ecr 242492771,sackOK,eol], length 0
23:03:33.054062 IP 192.168.2.36.http > 192.168.2.100.50471: Flags [.], ack 1, win 9186, options [nop,nop,TS val 242492771 ecr 242492771], length 0
23:03:34.344572 IP 192.168.2.36.http > 192.168.2.100.50471: Flags [.], ack 8, win 9186, options [nop,nop,TS val 242494052 ecr 242494052], length 0
数据包正在返回。继续执行4)。
没有 tcpdump 输出意味着192.168.2.100
没有收到任何数据包...可能是防火墙?从另一台远程 PC 来看,是否出现了同样的行为?ARP 问题(使用 arp -n 列出 ARP 缓存,然后使用 arp -d 删除条目IP地址)?
4) 检查上述 telnet 命令的输出。如果它看起来类似于以下内容:
Trying 192.168.2.36....
Connected to 192.168.2.36.
Escape character is '^]'.
GET /
Location: http://192.168.2.36
Content-Type: text/html; charset=UTF-8
您的网络浏览器可能有问题。也许 HTTP 代理没有排除本地网络中的计算机?