Назад | Перейти на главную страницу

Как я могу настроить Apache для использования HTTPS для внешнего доступа, но HTTP для внутреннего доступа?

У меня есть два сервера: один - это сервер разработки, доступный для внутреннего пользования в локальной сети нашей компании, а другой - общедоступный веб-сервер. На сервере разработки размещено несколько инструментов, которые мы используем для управления нашими проектами изнутри, но теперь нам также нужен доступ к ним извне, сохраняя при этом безопасность.

Я установил mod_proxy на внешнем сервере с помощью директив ProxyPass и ProxyPassReverse для сопоставления внешних запросов с внутренним сервером. Я также настроил аутентификацию на этих внешних виртуальных хостах, чтобы обеспечить безопасность внешнего доступа. Мне также нужно использовать SSL для внешнего доступа, но в идеале я бы предпочел, чтобы внутренние инструменты были доступны через простой HTTP для людей в интрасети.

Можно ли добиться такого поведения, и если да, то какие директивы и модули Apache мне следует использовать и на каких серверах они должны быть установлены?

Я собираюсь сделать предположение, что вы принимаете HTTP-соединения для публики, но вы делаете стандартное HTTP-перенаправление, чтобы заставить их перейти на HTTPS.

Если это так, вы можете изменить свои HTTP-директивы, чтобы не перенаправлять, если вы являетесь частью внутренней сети.

Для этого вы хотите использовать Apache mod_rewrite и отфильтруйте REMOTE_ADDR. По сути, вы хотите перенаправить все, что не соответствует вашей сети.

Другой вариант, и, вероятно, более безопасный, - просто попросить ваших внутренних пользователей использовать адрес службы, отличный от общедоступного. Попросите их подключиться к myservice.mydomain.local вместо myservice.mydomain.com.

Можете ли вы создать 2 разных виртуальных хоста в конфигурации Apache, каждый из которых будет отвечать на разных IP-адресах, но при этом будет использовать один и тот же корень документа? На вашем маршрутизаторе пусть он отвечает на example.com с помощью 192.168.1.1, а внешний - с 342.434.564.23. Или попросите всех использовать разные адреса, когда они находятся в офисе (internal.example.com).

Если вы используете Linux, изучите iptables для брандмауэра. В Windows можно использовать политики IPSec для имитации аналогичных правил брандмауэра.

По сути, вы назначаете правила на основе исходной IP-подсети. Если соединение исходит из вашей внутренней сети, заблокируйте HTTPS. В противном случае заблокируйте HTTP.

Лучше всего использовать правила брандмауэра, чтобы ограничить это.

Я не думаю, что у Apache есть функция для реализации этого, даже если бы она была, это привело бы к накладным расходам. Брандмауэры предназначены для подобных вещей и поэтому были бы более подходящими. Я предполагаю, что у вас есть внешний брандмауэр (я надеюсь, что у вас есть), вы должны разрешить только порт 443 для этой машины и заблокировать порт 80 извне.

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

Изменить: извините, Apache может сделать это через mod_rewrite, но это приведет к накладным расходам на запросы, и все равно было бы более целесообразно использовать брандмауэр. Тем не менее, с помощью mod_rewrite вы можете перенаправлять людей с http на https, что может быть удобно, если люди постоянно пытаются получить доступ к http.