Linux

阿帕奇本地網路

  • September 20, 2012

我正在嘗試從本地網路中的另一個來源訪問我的本地 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 通。

我簡直無法想像為什麼這會變得如此困難……

您是否區分了本地網路中可以 ping Apache 伺服器的其他電腦和嘗試訪問 Apache 伺服器(但失敗)的遠端 PC/移動設備?我的意思是,他們在同一個網路中嗎?

只是為了確保,如果您很明顯,很抱歉提到這一點:192.168.2.36是一個不會被路由的私有 IP 地址,因此無法從 Internet 訪問。您提到的遠端 PC 和移動設備必須位於 Apache 伺服器所在的同一本地網路中,或者可以通過您的路由器(不是您的 ISP,除非您已將其配置為將某些外部埠轉發到埠 80你的 Apache 伺服器,當然——我猜不是這樣)。

我現在假設遠端 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)。

  1. 現在讓我們看看是否有任何網路流量從遠端 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_address刪除條目),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_address刪除條目)?

  1. 檢查上面 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 代理不排除本地網路中的電腦?

引用自:https://serverfault.com/questions/430318