У меня есть следующая настройка
. Цель состоит в том, чтобы иметь возможность подключить локальную виртуальную машину к базе данных SQL, используя виртуальную машину, размещенную в Azure, в качестве прокси.
Я попытался настроить его двумя способами, с помощью модуля потоковой передачи Nginx + RTMP, как описано здесь Использование прокси-сервера TCP для подключения к базе данных SQL через VPN , со следующим nginx.conf
events {
worker_connections 1024;
}
stream {
upstream sqlvm {
server sqldb.database.windows.net:1433;
}
server {
listen 1433;
proxy_pass sqlvm;
}
}
И второй способ с HAProxy в режиме tcp
.
listen sqldb
bind *:1433
mode tcp
server sqldb sqldb.database.windows.net:1433 check port 1433 inter 1000
В обоих случаях соединение с клиентом SQL (например, sqlcmd
) таким же образом не работает.
# 10.x.x.x is the IP of Azure VM in this setup
$ sqlcmd -S 10.x.x.x,1433 -d dbName -U user@sqldb.database.windows.net -P password
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Cannot open server 'sqldb' requested by the login. Client with IP address '91.x.x.x' is not allowed to access the server. To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range. It may take up to five minutes for this change to take effect..
Та же команда работает при выполнении на прокси-виртуальной машине.
Так или иначе, Azure SQL знает исходный IP-адрес клиента и блокирует его, e даже если он проходит через прокси.
Как это возможно, учитывая, что мы прокси на уровне TCP? Есть ли обходной путь / рабочая конфигурация для этой установки?
Кажется, ответ на этот вопрос находится в документации по Архитектуре подключения Azure SQL.
Политика подключения
По умолчанию: это политика подключения, действующая на всех серверах после создания, если только вы явно не измените политику подключения на прокси или перенаправление. Политика по умолчанию — перенаправление для всех клиентских подключений, исходящих из Azure (например, с виртуальной машины Azure), и прокси-сервер для всех клиентских подключений, исходящих извне (например, подключений с вашей локальной рабочей станции).
Это означает, что первое соединение проходит через прокси, но после перенаправления оно полностью обходит прокси.
В случае описанной выше настройки решение состояло в том, чтобы переместить проксирующую виртуальную машину за пределы Azure. Это также можно сделать, изменив режим подключения к БД на режим прокси (но в обмен на производительность)