Я пытаюсь связаться с моим локальным Apache из другого источника в локальной сети. IP-адрес машины, на которой запущен Apache, - 192.168.2.36, ОС - xubuntu 12.04. С помощью этой машины я могу получить доступ к экземпляру Apache, но это невозможно с любого другого компьютера или мобильного устройства. Межсетевой экран маршрутизатора выключен.
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
Оба не работают. Хост-компьютер доступен для проверки связи с другими машинами в сети.
Я просто не могу представить, почему это оказывается так сложно ...
Вы проводите различие между другими компьютерами в локальной сети, которые могут проверить связь с сервером Apache, и удаленными ПК / мобильными устройствами, которые пытаются получить доступ к серверу Apache (и терпят неудачу)? Я имею ввиду, они в одной сети?
Просто чтобы убедиться и извините за упоминание об этом, если вам это очевидно: 192.168.2.36
- это частный IP-адрес, который не будет маршрутизироваться и, следовательно, недоступен из Интернета. Упомянутые вами удаленный компьютер и мобильные устройства должен находиться в той же локальной сети, в которой находится сервер Apache, или быть доступным через ваш роутер (не ваш интернет-провайдер, если вы не настроили его для пересылки какого-либо внешнего порта на порт 80 вашего сервера Apache, конечно - я думаю, что это не так).
Я предполагаю, что удаленный компьютер находится в той же локальной сети (скажем, с 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 запущен. Закройте сеанс telnet, нажав Ctrl-] и перейдите к 2).
2) Теперь посмотрим, достигает ли сетевой трафик 192.168.2.36 с удаленного ПК (192.168.2.100). На 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
а затем "ПОЛУЧИТЬ /". Это 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
протестируйте описанные выше действия на паре других ПК в локальной сети. Если вы видите такое же поведение, сбросьте правила брандмауэра на 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 с помощью arp -n, а затем удалите записи с помощью arp -d айпи адрес), 192.168.2.36
неисправна карта Ethernet или кабель, IP-адрес 192.168.2.36
используется другим ПК в сети, удаленные ПК настроены на использование IPv6 ...
3) Давайте проверим, возвращаются ли IP-пакеты в 192.168.2.100
. Остановите tcpdump с помощью Ctrl-C и введите:
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
не получает обратно пакеты ... может быть, брандмауэр? А с другого удаленного ПК такое же поведение? Проблема ARP (укажите кеш ARP с помощью arp -n, а затем удалите записи с помощью arp -d айпи адрес)?
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 не исключает компьютеры в локальной сети?