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

как настроить ssh-туннель для именованного виртуального хоста, на котором запущен Jenkins

В настоящее время я настраиваю сервер в нашей лаборатории в Uni, который будет использоваться для нескольких целей, включая базу данных библиографии и сервер CI (Jenkins). Чтобы поддерживать четкое разделение проблем, у меня есть заключенный в тюрьму виртуальный хост (VH) для каждой функции вместе с назначенным внутренним доменным именем. Внутри лаборатории все работает нормально. Я установил BIND9 на сервер, поэтому он может разрешать доменные имена.

Однако, чтобы подключиться к нашей лаборатории из дома, нам нужно сначала подключить VPN к Uni, а затем по SSH к шлюзу нашей лаборатории. Через шлюз мы можем получить доступ к любым внутренним машинам, которые нам нужны. После входа в шлюз мы используем туннели SSH по мере необходимости. В соответствии с политикой университета, к машинам внутри нашей лаборатории нельзя получить прямой доступ через VPN без входа в шлюз.

Мне интересно, можно ли получить доступ к виртуальным хостам через один туннель SSH? Нравится указание имени сервера (SNI)? Или мне нужно настроить прокси-сервер, такой как Squid? Я так понимаю, что трафик DNS и HTTP необходимо маршрутизировать правильно. Можно ли это сделать, просто используя hosts настройки файла?

Любые советы будут высоко ценится. Спасибо!

Обновить
Я продолжал работать над проблемой и нашел решение, которое, кажется, работает, но все еще имеет один остающийся недостаток; Дженкинс на Manage страница при использовании VPN / SSH жалуется It appears that your reverse proxy set up is broken. Таким образом, хотя мои запросы верны, некоторые из моих ответов нет, и я хотел бы это исправить.

Короткий ответ - использовать обратный прокси-сервер, расположенный на удаленном компьютере, который перенаправляет запросы на порты localhost, которые туннелируются. Решение заключалось в следующем:
1) Поскольку SNI недоступен, в этом случае можно назначить дополнительный уникальный порт, который будет прослушиваться для каждого виртуального хоста. Я решил использовать диапазон 808x вверх.
2) Я обновил раздел в файле конфигурации SSH на моем локальном компьютере, который я использую для подключения к шлюзу, чтобы включить переадресацию всех этих портов.
3) Я настроил локальный обратный прокси на моем локальном компьютере (используя Apache2 в моем случае), чтобы я мог обращаться к каждому порту, используя доменное имя, тем самым перенаправляя запросы на http://localhost:808x. Для местных VH я решил использовать .vpn TLD, чтобы пометить их как доменные имена для использования при использовании VPN для подключения к лаборатории. Таким образом, я могу использовать обычный .int доменное имя, когда я нахожусь в лаборатории, без каких-либо конфликтов.

В целом, это решение работает хорошо. Хотя есть возможность dismiss ошибку, я хотел бы ее исправить, потому что после прочтения документации мне неясно, к каким последствиям приведет простое ее отклонение.

Итак, мой вопрос теперь очень ориентирован на Дженкинса, поэтому я включил ниже различные файлы конфигурации, которые я установил. Мне интересно, что я мог пропустить в своих обратных прокси-серверах, или мне нужно использовать mod_rewrite. Любой совет будет принят во внимание.

СЕРВЕРНАЯ СТОРОНА
у меня есть mod_proxy, mod_proxy_http, и mod_headers включен. Я только показал изменения, которые я внес в файлы по умолчанию.

ports.conf

Listen 80
### TOMCAT is running on 8081
Listen 8082
Listen 8083

jenkins.int.vhost

<VirtualHost *:80 *:8081 *:8083>

        ServerName        jenkins.int
        ProxyRequests     Off
        ProxyPreserveHost On
        AllowEncodedSlashes NoDecode

        <Proxy http://localhost:8081/*>
          Order deny,allow
          Allow from all
        </Proxy>

        ProxyPass         /  http://localhost:8081/ nocanon
        ProxyPassReverse  /  http://localhost:8081/
        ProxyPassReverse  /  http://jenkins.int/

#       Header edit Location ^http://jenkins.vpn http://jenkins.int
</VirtualHost>

/ и т.д. / по умолчанию / Дженкинс

# port for HTTP connector (default 8080; disable with -1)
HTTP_PORT=8081
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT"

/var/lib/jenkins/jenkins.model.JenkinsLocationConfiguration.xml

<jenkinsUrl>http://jenkins.int/</jenkinsUrl>

/var/lib/jenkins/jenkins.CLI.xml

<jenkins.CLI>
  <enabled>true</enabled>
</jenkins.CLI>

Это необходимо для запуска скриптов.

СТОРОНА КЛИЕНТА

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>

    ServerName biblio.vpn

    ProxyPass / http://localhost:8082/

</VirtualHost>

<VirtualHost *:80>

    ServerName jenkins.vpn
    ProxyRequests Off
    ProxyPreserveHost On
    AllowEncodedSlashes NoDecode

    ProxyPass / http://localhost:8083/
    ProxyPassReverse / http://localhost:8083/
    ProxyPassReverse / http://jenkins.int/

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Файл конфигурации SSH

LocalForward localhost:8080 server.local:8080
LocalForward localhost:8081 server.local:8081
LocalForward localhost:8082 server.local:8082
LocalForward localhost:8083 server.local:8083

Обновление 2

Поговорив с некоторыми полезными пользователями Jenkins в IRC, я пришел к выводу, что в нашем случае ошибку / предупреждение о сломанном обратном прокси-сервере можно не учитывать.
Последняя, ​​незначительная, но неприятная проблема заключалась в том, что ссылка «Новое представление» указывала на неправильный адрес («jenkins.int» вместо «jenkins.vpn»). Редактирование core / src / main / java / jenkins / model / NewViewLink.java и замена Jenkins.getInstance().getRootUrl() с участием "/" в строке 47, затем перекомпоновка Jenkins и загрузка файла WAR устранили эту проблему.

Узнайте, почему организация использует политику туннелирования вас через машину шлюза, когда вы уже подключены к VPN.

  • Причиной может быть тестовая сеть, опасная для производственной сети, но база данных контента и система CI / CD вряд ли опасны.
  • Конфиденциальная информация не для всех пользователей может нуждаться в защите. Но в противном случае это можно было бы сделать с аутентификацией во всех системах. Возможно, решение для предотвращения потери данных, если данные чрезвычайно конфиденциальны или ценны.

Если брандмауэр позволял это, вы могли бы настроить балансировщики нагрузки внешнего интерфейса или прокси-серверы вне лаборатории. Прокси-соединения пользователей в веб-приложениях и т. Д. С серверными модулями и базами данных внутри сети. Классический дизайн для «внешней» облицовки.

Если требуется туннель, направьте лабораторную подсеть через туннель, а не перенаправляйте отдельные порты с помощью ssh. Кроме того, было бы проще использовать VPN прямо из Интернета в эту лабораторную сеть. Туннель внутри туннеля возможен, но написание конфигурации, которую может использовать менее технически подготовленный пользователь, может оказаться сложным, между любой необходимой маршрутизацией и, возможно, несколькими различными VPN-клиентами.