Я хотел изменить рабочую конфигурацию 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 в следующих местах
/etc/apache2/ports.conf
Слушать 1.2.3.4:8001
/etc/apache2/conf.d/virtual.conf
ИмяVirtualHost 1.2.3.4:8001
/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
В конце концов, когда я связался с хостинг-провайдером, проблема была в брандмауэре.
Постараюсь заставить их рассказать, что они на самом деле сделали для обеспечения соблюдения этого правила.
в итоге это стало хорошим упражнением для системного администратора. спасибо всем...