IPTables и перенаправление портов Apache2

IPTables и перенаправление портов Apache2

Я использую 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) это в начало списка.

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