阿帕奇本地網路
我正在嘗試從本地網路中的另一個來源訪問我的本地 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)。
- 現在讓我們看看是否有任何網路流量從遠端 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刪除條目)?
- 檢查上面 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 代理不排除本地網路中的電腦?