Apache слушает 80, но не какой-либо другой порт

Apache слушает 80, но не какой-либо другой порт

Я хотел изменить рабочую конфигурацию Apache example.com (exampleIP = 1.2.3.4), чтобы изменить порт по умолчанию с 80 на порт 8001, таким образом, чтобыhttp://example.com:8001Должно работать. Я не смог этого сделать и задокументирую то, что я попытался сделать. Думаю, мне может понадобиться помощь по iptables.

мой /etc/hosts во-первых в порядке

1.2.3.4    example.com

Я начал с замены порта 80 на 8001 в следующих местах

  1. /etc/apache2/ports.conf

    Слушать 1.2.3.4:8001

  2. /etc/apache2/conf.d/virtual.conf

    ИмяVirtualHost 1.2.3.4:8001

  3. /etc/apache2/sites-enabled/example.com

    <ВиртуальныйХост 1.2.3.4:8001>

          ServerName example.com:8001
          #UPDATE: ServerName example.com doesn't make a difference either
    

    </ВиртуальныйХост>

Когда я заменяю 8001 в трех приведенных выше случаях на 80, все работает. С 8001 я не могу установить соединение. tcpdump также не показывает входящие запросы.

Так как демон Apache при перезапуске не выдавал никаких ошибок, я попробовал проверить, прослушивает ли веб-сервер порт 8001.

$ sudo lsof -i |grep 8001
apache2     731     root    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     734 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     736 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     737 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     738 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     739 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)

Похоже, он прослушивал порт 8001. Я даже попытался применить следующие правила iptable в терминале:

$ sudo iptables -A INPUT -p tcp --dport 8001 -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --sport 8001 -j ACCEPT
$ sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied:  " --log-level 7

Я никогда не получал лог с отклонением. Вот что показывает iptables verbose mode

$ sudo iptables -L -v -n
Chain INPUT (policy ACCEPT 3052M packets, 785G bytes)
pkts bytes target     prot opt in     out     source               destination         
   25  1690 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8001 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8001 
   92  6484 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `iptables denied:  ' 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4317M packets, 695G bytes)
 pkts bytes target     prot opt in     out     source               destination         
   20  1760 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:8001 

Я не знаком с правилами iptable, поэтому подсказки по любым правилам, которые я пропустил выше, будут отличными. Читая другие темы, я также задавался вопросом, может ли это быть причиной.

$ cat /proc/sys/net/ipv4/conf/eth0/forwarding 
0

Учитывая эту информацию, есть ли какие-либо намеки на то, что может мешать веб-серверу работать на 8001, но не на 80?

ОБНОВЛЕНИЕ 1: я попробовал сбросить все правила iptable

$ sudo iptables -X
$ sudo iptables -F

Я также попытался проверить, ловит ли tcpdump что-нибудь.

 sudo tcpdump -i eth0 port 8001 -v

На 8001 этого не происходит, но измените порт на 80 (снова в ^3 местах), и это произойдет.

Я пытался искать устоявшиеся и прослушиваемые процессы

$ netstat -an
tcp        0      1.2.3.4:8001            0.0.0.0:*               LISTEN   

Наконец, с моей локальной машины я попробовал curl.

curl http://1.2.3.4:8001 -v
* About to connect() to 1.2.3.4 port 8001 (#0)
*   Trying 1.2.3.4... No route to host
* couldn't connect to host
* Closing connection #0
curl: (7) couldn't connect to host

ОБНОВЛЕНИЕ 2

Кроме того, мой файл /etc/log/messages, который отслеживает ошибки iptables, выдает следующее. Но оказывается, что они появляются при входе и выходе из tcpdump.

Jan 22 09:30:31 node1 kernel: device eth0 entered promiscuous mode
Jan 22 09:30:31 node1 kernel: audit(1264152631.798:54): dev=eth0 prom=256 old_prom=0 auid=4294967295
Jan 22 09:30:33 node1 kernel: device eth0 left promiscuous mode

ОБНОВЛЕНИЕ 3 нашел это на tcpdump faq

...Это может быть связано с тем, что интерфейс, на котором вы осуществляете захват, подключен к коммутатору; в коммутируемой сети одноадресный трафикмежду двумя портами не обязательно появитсяна остальных портах - на все порты будет отправляться только широковещательный и многоадресный трафик...

...что означает, что если вы прослушиваете порт 10 Мбит,ты не увидишь трафик, поступающий на порт 100 Мбит, и наоборот...

...Если ваш компьютер не подключен к коммутируемой сети или двухскоростному концентратору, или он подключен к коммутируемой сети, но порт настроен на репликацию всего трафика, проблема может заключаться в том, что сетевой интерфейс, на котором вы осуществляете захват, не поддерживает "беспорядочный" режим, или потому что ваша ОС не может перевести интерфейс в беспорядочный режим...

Итак, подведем итог этому своеобразному случаю:

  • iptables были очищены с помощью -F, -X
  • запросы проходят нормально с прослушиванием Apache на 1.2.3.4:80
  • tcpdump ничего не ловит, а Apache слушает на 1.2.3.4:8001 (см. ОБНОВЛЕНИЕ 1,3)

решение1

В шаге 3 вы упомянули

/etc/apache2/sites-enabled/example.com

<VirtualHost 1.2.3.4:80>Имя сервера example.com:8001 ...</VirtualHost>

Что не правильно. Это должно быть

<VirtualHost 1.2.3.4:8001>Имя_сервера example.com ...</VirtualHost>

решение2

Если вас это не смущает, попробуйте привязаться к любому интерфейсу с помощью:

Listen 0.0.0.0:8001

А ServerName должно быть:

ServerName example.com

Остальное вы сохраняете, как вы уже настроили. Обратите внимание, что NameVirtualHost и VirtualHost должны иметь одинаковую подпись. И поскольку это виртуальный хост на основе имени, вам нужно добавить в файл hosts на машине с браузером строку типа:

1.2.3.4 example.com

и использовать вhttp://example.com:8001/как URL в браузере (curl, wget,MSIE, Firefox)

Для отладки используйте:

tshark -V -i eth0 port 8001 or port 80

Посмотрите, что происходит в error.log и access.log

решение3

Listen не реализует виртуальные хосты. http://httpd.apache.org/docs/2.0/bind.html#virtualhost

Добавьте в /etc/apache2/ports.conf просто Listen 8001

убедитесь, что include находится перед include виртуальных хостов в файле apache2.conf. Вы также можете поместить команду Listen непосредственно в файл apache2.conf непосредственно перед строками include.

Ваше здоровье

решение4

В конце концов, когда я связался с хостинг-провайдером, проблема была в брандмауэре.

Постараюсь заставить их рассказать, что они на самом деле сделали для обеспечения соблюдения этого правила.

в итоге это стало хорошим упражнением для системного администратора. спасибо всем...

Связанный контент