
Я использую Apache для перенаправления поддомена на порт ( mod_proxy
, mod_proxy_http
, mod_proxy_ajp
) и таблицы IP-адресов, чтобы ограничить прямой доступ к порту для всех, кроме меня и локального сервера.
Мои таблицы IP выглядят так:
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:tproxy
ACCEPT tcp -- localhost anywhere tcp dpt:tproxy
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:http-alt
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:webmin
ACCEPT tcp -- localhost anywhere tcp dpt:webmin
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Контекст, который я собираюсь использовать в этом посте, следующий:
Сонатип Нексус:nexus.example.com => example.com:8081
Дженкинс CI:jenkins.example.com => example.com:8080
Вебмин:webmin.example.com => example.com:10000
То, что у меня сейчас работает, это отсутствие прямого доступа к портам, кроме меня. Я также хочу, чтобы локальная система могла получать доступ к портам, что, как я полагаю, у меня сейчас и есть. Я использую mod_proxy_ajp
для Jenkins CI и Webmin и mod_proxy_http
для Sonatype Nexus.
Когда я захожу на прямые порты, каждый из этих сервисов загружается просто отлично. Когда я просил кого-то другого загрузить каждый, они не могли, так что это работает.
Однако теперь при попытке доступа к одному из поддоменов я получаю бесконечную загрузку (бесконечный цикл?)
Однако когда я запускаю tracert на поддомене, все завершается успешно, так что я могу вычеркнуть бесконечный цикл.
Вот моя конфигурация виртуального хоста Apache Sonatype Nexus:
<VirtualHost *:80>
ServerName nexus.majornoob.com
ServerAlias www.nexus.majornoob.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
ProxyPassReverseCookiePath / /
ErrorLog /var/www/majornoob/error-nexus.log
LogLevel warn
CustomLog /var/www/majornoob/access-nexus.log combined
</VirtualHost>
а вот мой Дженкинс:
<VirtualHost *:80>
ServerName jenkins.majornoob.com
ServerAlias www.jenkins.majornoob.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / ajp://127.0.0.1:8080/
ProxyPassReverse / ajp://127.0.0.1:8080/
ProxyPassReverseCookiePath / /
ErrorLog /var/www/majornoob/error-jenkins.log
LogLevel warn
CustomLog /var/www/majornoob/access-jenkins.log combined
</VirtualHost>
Эти два примера виртуальных хостов используют mod_proxy_ajp
и mod_proxy_http
соответственно.
Может ли кто-нибудь помочь мне разобраться, почему у меня бесконечная загрузка?
Спасибо.
редактировать:Не обращайте внимания на бесконечный цикл. Через некоторое время я получил ошибку 503 Service Unavailable.
решение1
Правила iptables оцениваются в порядке сверху вниз, как напечатано. Проблема в том, что проксируемое соединение происходит с localhost, что соответствует этому правилу:
DROP tcp -- !c-24-7-110-109.hsd1.ca.comcast.net anywhere tcp dpt:tproxy
localhost
не является c-24-7-...
, поэтому соединение сбрасывается. Модуль прокси в конечном итоге истекает по тайм-ауту; если бы правило было REJECT вместо DROP, вы бы получили ошибку гораздо быстрее (потому что вы бы получили явное отклонение, а не попытка соединения просто исчезла).
Решение довольно простое: изменить порядок правил так, чтобы «принять с локального хоста» было перед «запретить из любого другого места». (IP-маршрутизация соответствует наиболее специфичной, но поскольку iptables являются многофакторными, это не обязательно определено).
Я бы рекомендовал иметь первое правило, которое разрешает все локальные соединения хоста (через интерфейс обратной связи, на всякий случай, если кто-то попытается сделать что-то странное через Ethernet); попробуйте добавить
iptables -I INPUT -i lo -s localhost -d localhost -j ACCEPT
чтобы вставить ( -I
) это в начало списка.