Apache 本地网络

Apache 本地网络

我正在尝试从本地网络中的另一个源访问我的本地 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 代理没有排除本地网络中的计算机?

相关内容