Вопрос или проблема
У меня есть прозрачный прокси, Squid, версия 3.5.20 (последняя стабильная на данный момент). Мне нужно сделать белый список доменов. Squid настроен для выполнения SSLBumping (см. конфигурацию squid ниже).
Я пытаюсь установить Sumologic на сервер, расположенный за прозрачным NAT Squid.
Проблема в том, что Sumologic не может подключиться через прозрачный NAT. Почему он не может подключиться через приложение, а я могу использовать curl?
При установке Sumologic я получаю следующую ошибку:
javax.net.ssl.SSLHandshakeException: Удаленный хост закрыл соединение во время рукопожатия
at sun.security.ssl.SSLSocketImpl.readRecord(Неизвестный источник)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Неизвестный источник)
at sun.security.ssl.SSLSocketImpl.startHandshake(Неизвестный источник)
at sun.security.ssl.SSLSocketImpl.startHandshake(Неизвестный источник)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:141)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
at com.sumologic.scala.collector.rest.RestClient$class.getResponse(RestClient.scala:83)
at com.sumologic.scala.collector.rest.RestClient$class.makeGetRequest(RestClient.scala:68)
at com.sumologic.scala.collector.auth.CollectorRegistrationManager.makeGetRequest(CollectorRegistrationManager.scala:49)
at com.sumologic.scala.collector.rest.RestClient$class.makeRequest(RestClient.scala:119)
at com.sumologic.scala.collector.auth.CollectorRegistrationManager.com$sumologic$scala$collector$rest$RestClientRetries$$super$makeRequest(CollectorRegistrationManager.scala:49)
at com.sumologic.scala.collector.rest.RestClientRetries$$anonfun$makeRequest$1.apply(RestClientRetries.scala:42)
at com.sumologic.scala.collector.rest.RestClientRetries$$anonfun$makeRequest$1.apply(RestClientRetries.scala:35)
at com.sumologic.util.retry.Retry$.whileExceptionsAreThrown(Retry.scala:143)
at com.sumologic.scala.collector.rest.RestClientRetries$$anonfun$withRetries$1.apply(RestClientRetries.scala:23)
at com.sumologic.scala.collector.rest.RestClientRetries$$anonfun$withRetries$1.apply(RestClientRetries.scala:23)
at com.sumologic.scala.collector.rest.RestClientRetries$class.makeRequest(RestClientRetries.scala:35)
at com.sumologic.scala.collector.auth.CollectorRegistrationManager.com$sumologic$scala$collector$rest$RestClientDeploymentRedirection$$super$makeRequest(CollectorRegistrationManager.scala:49)
at com.sumologic.scala.collector.rest.RestClientDeploymentRedirection$class.makeRequest(RestClientDeploymentRedirection.java:74)
at com.sumologic.scala.collector.auth.CollectorRegistrationManager.makeRequest(CollectorRegistrationManager.scala:49)
at com.sumologic.scala.collector.auth.CollectorRegistrationManager.ping(CollectorRegistrationManager.scala:361)
at com.sumologic.scala.collector.Collector.init(Collector.scala:546)
at com.sumologic.scala.collector.Collector$.main(Collector.scala:831)
at com.sumologic.scala.collector.Collector.main(Collector.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Метод нативного кода)
at sun.reflect.NativeMethodAccessorImpl.invoke(Неизвестный источник)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Неизвестный источник)
at java.lang.reflect.Method.invoke(Неизвестный источник)
at org.tanukisoftware.wrapper.WrapperSimpleApp.run(WrapperSimpleApp.java:290)
at java.lang.Thread.run(Неизвестный источник)
Причиной является: java.io.EOFException: SSL-партнер закрыл соединение неправильно
at sun.security.ssl.InputRecord.read(Неизвестный источник)
... 40 больше
Если я открою PowerShell и выполню curl на ‘service.au.sumologic.com’, это работает…
PS > curl https://service.au.sumologic.com
StatusCode : 200
StatusDescription : OK
Content : <html>
<body>
<h2>Tweep</h2>
</body>
</html>
RawContent : HTTP/1.1 200 OK
Strict-Transport-Security: max-age=15552000
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Connection: keep-alive
Accept-Ranges: byte...
Forms : {}
Headers : {[Strict-Transport-Security, max-age=15552000], [X-Content-Type-Options, nosniff],
[X-Frame-Options, SAMEORIGIN], [X-XSS-Protection, 1; mode=block]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : System.__ComObject
RawContentLength : 44
В моем журнале доступа squid я вижу:
1470638115.212 164 172.26.192.122 TAG_NONE/200 0 CONNECT 54.252.91.36:443 - HIER_NONE/- -
что соответствует service.au.sumologic.com….
Не упустил ли я что-то в настройках squid?
Конфигурация Squid
visible_hostname squid
http_port 3129 intercept
acl allowed_http_sites dstdomain .amazonaws.com
acl allowed_http_sites dstdomain .newrelic.com
acl allowed_http_sites dstdomain .windowsupdate.com
acl allowed_http_sites dstdomain .microsoft.com
acl allowed_http_sites dstdomain ocsp.comodoca.com
acl allowed_http_sites dstdomain crl.usertrust.com
acl allowed_http_sites dstdomain ocsp.globalsign.com
acl allowed_http_sites dstdomain crl.globalsign.net
http_access allow allowed_http_sites
https_port 3130 ssl-bump intercept connection-auth=off generate-host-certificates=on dynamic_cert_mem_cache_size=8MB cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.key
acl SSL_port port 443
http_access allow SSL_port
acl allowed_https_sites ssl::server_name .amazonaws.com
acl allowed_https_sites ssl::server_name .newrelic.com
acl allowed_https_sites ssl::server_name .microsoft.com
acl allowed_https_sites ssl::server_name .windowsupdate.com
acl allowed_https_sites ssl::server_name .sumologic.com
acl allowed_https_sites ssl::server_name .datadoghq.com
sslproxy_cert_error allow all
acl NoSSLIntercept ssl::server_name_regex -i "/etc/squid/url.nobump"
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3
ssl_bump peek step1 all
ssl_bump peek step2 allowed_https_sites
ssl_bump peek step2 NoSSLIntercept
ssl_bump splice step1 NoSSLIntercept
ssl_bump splice step3 allowed_https_sites
ssl_bump terminate step2 all
http_access deny all
Строка access.log – это TCP-соединение, которое приходит и принимается для начала процесса бампинга.
Ваши правила ssl_bump говорят “подсмотреть” на шаге 1, а затем закончить на шаге 2, если клиент не отправил значение TLS SNI, содержащее одно из немногих разрешенных имен серверов в одном из acl allowed_https_sites или NoSSLIntercept.
Кажется, что Java-приложение либо не отправляет SNI, либо отправляет значение, которое не входит в белый список. Оно также сбой при неудачном TLS (завершено другим узлом).
Проверьте статус selinux
Попробуйте следующую команду
getenforce
Измените на “Permissive”
Ответ или решение
Проблемы с подключением через прокси Squid: TAG_NONE / HEIR_NONE в SSL Bump
Когда вы используете прокси-сервер Squid версии 3.5.20 с включенной функцией SSL Bump, может возникнуть ряд проблем с пропуском трафика, особенно при настройках цискас, как это произошло в вашем случае с Sumologic. Ошибка javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
, которую вы наблюдаете, указывает на то, что SSL-соединение не удалось установить. Давайте подробнее рассмотрим причины этой проблемы и возможные пути её решения.
Контекст проблемы
Вы успешно используете curl
в PowerShell для доступа к https://service.au.sumologic.com
, что подтверждает, что выход в интернет напрямую работает. Однако, когда вы пытаетесь это сделать из приложения Sumologic, оно не может установить соединение, что в первую очередь указывает на различия в том, как отправляются запросы между curl
и вашим Java-приложением.
Важные моменты в настройках Squid
-
Разрешения SNI: В Squid у вас определены ACL (Access Control List) для SSL Bump, включая
allowed_https_sites
. Убедитесь, что домен, к которому вы пытаетесь подключиться (в данном случае,sumologic.com
), действительно присутствует в этой ACL. -
SNI и закрытие соединения: Ошибка
SSLHandshakeException
может произойти, если приложение не отправляет SNI (Server Name Indication) или отправляет его значение, которое не совпадает с тем, что указано в ‘allowed_https_sites’. Убедитесь, что ваше Java-приложение поддерживает и корректно отправляет SNI. -
Логи Squid: Лог
access.log
, в котором вы видитеTAG_NONE/200
, указывает на то, что Squid принял соединение, но не смог его обработать должным образом. Частое значениеHIER_NONE
также может свидетельствовать о том, что Squid не знает, как обработать трафик.
Рекомендации по устранению проблемы
-
Проверка приложений: Убедитесь, что Java-приложение Sumologic использует правильные настройки SSL. Возможно, стоит обновить библиотеку Java или использовать другой клиент, который корректно обрабатывает SNI.
-
Настройки SELinux: Проверьте, включен ли SELinux. Иногда он может блокировать соединения, даже если конфигурация Squid корректна. Используйте команду
getenforce
, чтобы проверить статус. Если он включён, попробуйте временно перевести его в режим "Permissive".setenforce 0
-
Оптимизация конфигурации Squid: Сравните логи и убедитесь, что на других устройствах, которые работают в аналогичных условиях, проблем не возникает. Возможно, имеет смысл оптимизировать правила
ssl_bump
, добавив дополнительные условия или изменяя приоритеты. -
Тестирование СНП: Используйте инструменты, такие как
openssl
, для тестирования SNI вручную, чтобы увидеть, как сервер реагирует на запрос с определённым доменным именем. Например, вы можете выполнить следующую команду:echo | openssl s_client -connect service.au.sumologic.com:443 -servername service.au.sumologic.com
Заключение
Проблема с ошибкой SSLHandshakeException
в вашем случае может быть связана с тем, как SSL Bump настроен на вашем Squid прокси, а также с тем, как Java-приложение обрабатывает TLS соединения. Проверьте, какие заголовки и параметры передаются вашим приложением в процессе соединения и убедитесь, что протоколы и сертификаты настроены правильно. Систематический подход к диагностике и тестированию поможет вам устранить проблему и обеспечить бесперебойную работу подключения.